flexdesk 0.1.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 (124) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +195 -0
  3. package/THIRD_PARTY_LICENSES.md +53 -0
  4. package/css/base.css +3439 -0
  5. package/css/flexdesk.css +5797 -0
  6. package/css/overrides.css +2349 -0
  7. package/css/reset.css +46 -0
  8. package/css/tokens.css +137 -0
  9. package/dist/charts.js +780 -0
  10. package/dist/charts.js.map +7 -0
  11. package/dist/chunk-3PHCPZHT.js +222 -0
  12. package/dist/chunk-3PHCPZHT.js.map +7 -0
  13. package/dist/chunk-CT4YXXLP.js +1770 -0
  14. package/dist/chunk-CT4YXXLP.js.map +7 -0
  15. package/dist/chunk-DRYCDMEG.js +2217 -0
  16. package/dist/chunk-DRYCDMEG.js.map +7 -0
  17. package/dist/chunk-DVU44T77.js +855 -0
  18. package/dist/chunk-DVU44T77.js.map +7 -0
  19. package/dist/chunk-FL5KFNQH.js +640 -0
  20. package/dist/chunk-FL5KFNQH.js.map +7 -0
  21. package/dist/chunk-FOOS3T5L.js +117 -0
  22. package/dist/chunk-FOOS3T5L.js.map +7 -0
  23. package/dist/chunk-JYWURG5T.js +32 -0
  24. package/dist/chunk-JYWURG5T.js.map +7 -0
  25. package/dist/chunk-TLZUUFOE.js +276 -0
  26. package/dist/chunk-TLZUUFOE.js.map +7 -0
  27. package/dist/chunk-UCJ2WD4D.js +625 -0
  28. package/dist/chunk-UCJ2WD4D.js.map +7 -0
  29. package/dist/chunk-WVFGV5FT.js +205 -0
  30. package/dist/chunk-WVFGV5FT.js.map +7 -0
  31. package/dist/core.js +1098 -0
  32. package/dist/core.js.map +7 -0
  33. package/dist/editor.js +1661 -0
  34. package/dist/editor.js.map +7 -0
  35. package/dist/flexdesk.css +5797 -0
  36. package/dist/host.js +132 -0
  37. package/dist/host.js.map +7 -0
  38. package/dist/reset.css +46 -0
  39. package/dist/tile_registry-6WZPTUZV.js +28 -0
  40. package/dist/tile_registry-6WZPTUZV.js.map +7 -0
  41. package/dist/tiles.js +2068 -0
  42. package/dist/tiles.js.map +7 -0
  43. package/dist/tokens.css +137 -0
  44. package/dist/widgets.js +5438 -0
  45. package/dist/widgets.js.map +7 -0
  46. package/dist/wm.js +4830 -0
  47. package/dist/wm.js.map +7 -0
  48. package/package.json +80 -0
  49. package/src/charts/chart_types.js +699 -0
  50. package/src/charts/data_series_plot_window.js +761 -0
  51. package/src/charts/downsample.js +119 -0
  52. package/src/charts/plot_config.js +176 -0
  53. package/src/charts/plot_popout_window.js +1560 -0
  54. package/src/charts/plotly_wrapper.js +432 -0
  55. package/src/core/event_bus.js +230 -0
  56. package/src/core/logging.js +300 -0
  57. package/src/core/settings.js +813 -0
  58. package/src/core/state_guard.js +382 -0
  59. package/src/core/state_guard_config.js +309 -0
  60. package/src/core/state_machine.js +258 -0
  61. package/src/editor/editor_pane.js +264 -0
  62. package/src/editor/monaco_editor_factory.js +449 -0
  63. package/src/editor/monaco_loader.js +74 -0
  64. package/src/editor/notebook_search.js +460 -0
  65. package/src/editor/notebook_tab_bar.js +456 -0
  66. package/src/editor/notebook_undo_manager.js +108 -0
  67. package/src/editor/split_pane_container.js +197 -0
  68. package/src/help/help_modal.js +409 -0
  69. package/src/help/help_registry.js +65 -0
  70. package/src/host/host.js +69 -0
  71. package/src/host/pywebview_host.js +133 -0
  72. package/src/tiles/config_schema.js +256 -0
  73. package/src/tiles/layout_persistence.js +662 -0
  74. package/src/tiles/tile_base.js +785 -0
  75. package/src/tiles/tile_grid.js +905 -0
  76. package/src/tiles/tile_registry.js +136 -0
  77. package/src/tiling/command_palette.js +328 -0
  78. package/src/tiling/content_registry.js +110 -0
  79. package/src/tiling/desktops.js +133 -0
  80. package/src/tiling/entity_sources.js +179 -0
  81. package/src/tiling/keymap.js +156 -0
  82. package/src/tiling/kind_taxonomy.js +172 -0
  83. package/src/tiling/landing_table.js +717 -0
  84. package/src/tiling/loading_overlay.js +33 -0
  85. package/src/tiling/nav_panel.js +142 -0
  86. package/src/tiling/page_factory.js +215 -0
  87. package/src/tiling/panel_keys.js +145 -0
  88. package/src/tiling/shell.js +437 -0
  89. package/src/tiling/tile_breadcrumb.js +222 -0
  90. package/src/tiling/tile_renderer.js +459 -0
  91. package/src/tiling/tile_tab_menu.js +340 -0
  92. package/src/tiling/tile_tree.js +880 -0
  93. package/src/tiling/wm.js +1352 -0
  94. package/src/ui/base/component_base.js +30 -0
  95. package/src/ui/base/controller_base.js +48 -0
  96. package/src/ui/base/page_base.js +102 -0
  97. package/src/ui/components/about_dialog.js +224 -0
  98. package/src/ui/components/action_dropdown.js +389 -0
  99. package/src/ui/components/attribute_list_editor.js +652 -0
  100. package/src/ui/components/autocomplete_field.js +732 -0
  101. package/src/ui/components/computing_status_window.js +81 -0
  102. package/src/ui/components/confirm_dialog.js +307 -0
  103. package/src/ui/components/context_menu.js +87 -0
  104. package/src/ui/components/data_table.js +2228 -0
  105. package/src/ui/components/detail_header.js +177 -0
  106. package/src/ui/components/drag_reorder.js +0 -0
  107. package/src/ui/components/gallery_picker.js +147 -0
  108. package/src/ui/components/inline_renamer.js +129 -0
  109. package/src/ui/components/managed_window.js +804 -0
  110. package/src/ui/components/modal.js +512 -0
  111. package/src/ui/components/notification_history.js +264 -0
  112. package/src/ui/components/slide_out_panel.js +185 -0
  113. package/src/ui/components/slider_field.js +122 -0
  114. package/src/ui/components/sortable_list.js +309 -0
  115. package/src/ui/components/table_state_store.js +81 -0
  116. package/src/ui/components/toast.js +59 -0
  117. package/src/ui/components/tree_view.js +460 -0
  118. package/src/ui/components/window_taskbar.js +143 -0
  119. package/src/ui/controllers/panel_state_machine.js +634 -0
  120. package/src/ui/controllers/window_chrome_controller.js +659 -0
  121. package/src/ui/notification_center.js +576 -0
  122. package/src/ui/utils/overlay_scrollbar.js +492 -0
  123. package/src/ui/utils/raf_resize_observer.js +31 -0
  124. package/src/ui/utils/tooltip_service.js +406 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/ui/base/component_base.js", "../src/ui/base/controller_base.js", "../src/ui/base/page_base.js", "../src/ui/components/about_dialog.js", "../src/ui/components/sortable_list.js", "../src/ui/components/attribute_list_editor.js", "../src/ui/components/autocomplete_field.js", "../src/ui/components/computing_status_window.js", "../src/ui/components/confirm_dialog.js", "../src/ui/components/inline_renamer.js", "../src/ui/components/detail_header.js", "../src/ui/components/gallery_picker.js", "../src/ui/components/notification_history.js", "../src/ui/components/slide_out_panel.js", "../src/ui/components/slider_field.js", "../src/ui/components/table_state_store.js", "../src/ui/components/toast.js", "../src/ui/components/tree_view.js", "../src/ui/components/window_taskbar.js", "../src/ui/controllers/panel_state_machine.js", "../src/ui/controllers/window_chrome_controller.js", "../src/ui/notification_center.js", "../src/ui/utils/overlay_scrollbar.js", "../src/ui/utils/tooltip_service.js"],
4
+ "sourcesContent": ["/**\r\n * ComponentBase (js_new)\r\n *\r\n * Ultra-lightweight base for leaf UI widgets rendered inside controllers/panels.\r\n * Handles props/state updates and deterministic teardown without storing data on\r\n * DOM elements.\r\n */\r\nexport class ComponentBase {\r\n constructor({ eventBus, logger } = {}) {\r\n if (new.target === ComponentBase) {\r\n throw new Error('ComponentBase is abstract \u2013 extend it instead');\r\n }\r\n\r\n this.eventBus = eventBus;\r\n this.logger = logger;\r\n this._mounted = false;\r\n }\r\n\r\n mount(/* container, props */) {\r\n throw new Error('ComponentBase.mount must be implemented by subclasses');\r\n }\r\n\r\n update(/* props */) {\r\n // default no-op for stateless components\r\n }\r\n\r\n dispose() {\r\n this._mounted = false;\r\n }\r\n}\r\n", "/**\r\n * ControllerBase (js_new)\r\n *\r\n * Shared superclass for UI controllers (tab, panel, layout, etc.). Provides\r\n * deterministic teardown, scoped event subscriptions, and dependency injection.\r\n */\r\nexport class ControllerBase {\r\n constructor({ eventBus, dataManager, logger } = {}) {\r\n if (new.target === ControllerBase) {\r\n throw new Error('ControllerBase is abstract \u2013 extend it instead');\r\n }\r\n\r\n this.eventBus = eventBus;\r\n this.dataManager = dataManager;\r\n this.logger = logger;\r\n this._disposers = new Set();\r\n }\r\n\r\n /**\r\n * Register a disposer callback to guarantee teardown.\r\n */\r\n trackDisposer(disposer) {\r\n if (typeof disposer === 'function') {\r\n this._disposers.add(disposer);\r\n }\r\n }\r\n\r\n /**\r\n * Attach controller-specific DOM/event wiring. Subclasses implement this.\r\n */\r\n initialize(/* options */) {\r\n throw new Error('ControllerBase.initialize must be implemented by subclasses');\r\n }\r\n\r\n /**\r\n * Dispose all tracked resources.\r\n */\r\n dispose() {\r\n for (const disposer of this._disposers) {\r\n try {\r\n disposer();\r\n } catch (err) {\r\n this.logger?.error?.('ui', 'Controller disposer failed', err);\r\n }\r\n }\r\n this._disposers.clear();\r\n }\r\n}\r\n", "/**\r\n * PageBase (js_new)\r\n *\r\n * Abstract shell for every top-level UI page (node workspace, simulation, data).\r\n * Handles dependency injection + shared lifecycle hooks so individual pages only\r\n * focus on domain logic.\r\n *\r\n * ## Async Initialization Pattern\r\n * Pages with async initialization should:\r\n * 1. Store the init promise: `this._initPromise = this.init();` in mount()\r\n * 2. Use `await this.waitForReady()` in show()/hydrate() to wait for init\r\n * 3. Mark completion by resolving the promise (init() returns)\r\n *\r\n * Example:\r\n * ```javascript\r\n * mount(container) {\r\n * this.container = container;\r\n * this._initPromise = this.init(); // Store promise\r\n * this._mounted = true;\r\n * }\r\n *\r\n * async show() {\r\n * await this.waitForReady(); // Wait for init if still running\r\n * this.refresh();\r\n * }\r\n * ```\r\n */\r\nexport class PageBase {\r\n constructor({ eventBus, dataManager, notificationCenter, logger } = {}) {\r\n if (new.target === PageBase) {\r\n throw new Error('PageBase is abstract \u2013 extend it instead');\r\n }\r\n\r\n this.eventBus = eventBus;\r\n this.dataManager = dataManager;\r\n this.notificationCenter = notificationCenter;\r\n this.logger = logger;\r\n this._mounted = false;\r\n\r\n /**\r\n * Promise that resolves when async initialization completes.\r\n * Pages with async init should set this in mount().\r\n * @type {Promise<void>|null}\r\n */\r\n this._initPromise = null;\r\n }\r\n\r\n /**\r\n * Mount the page into a DOM container. Concrete pages must override this.\r\n * For pages with async initialization, store the init promise:\r\n * `this._initPromise = this.init();`\r\n */\r\n mount(/* container */) {\r\n throw new Error('PageBase.mount must be implemented by subclasses');\r\n }\r\n\r\n /**\r\n * Wait for the page to complete initialization.\r\n * Returns immediately if no async init or if already complete.\r\n * @returns {Promise<void>}\r\n */\r\n async waitForReady() {\r\n if (this._initPromise) {\r\n try {\r\n await this._initPromise;\r\n } catch (err) {\r\n this.logger?.warn?.('page', 'Init promise rejected', err);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Optional hook invoked after the initial mount to hydrate data/state.\r\n * For pages with async init, this should await waitForReady().\r\n */\r\n async hydrate(/* options */) {\r\n // default: wait for init to complete\r\n await this.waitForReady();\r\n }\r\n\r\n /**\r\n * Optional hook for when the page becomes active (tab switched, etc.).\r\n */\r\n onActivated(/* context */) {\r\n // default no-op\r\n }\r\n\r\n /**\r\n * Optional hook for when the page is hidden/unmounted but not disposed.\r\n */\r\n onDeactivated(/* context */) {\r\n // default no-op\r\n }\r\n\r\n /**\r\n * Dispose resources/event subscriptions.\r\n */\r\n dispose() {\r\n this._mounted = false;\r\n this._initPromise = null;\r\n }\r\n}\r\n", "/**\n * About Dialog Component\n *\n * A modal that shows a product's name, version, license, homepage and\n * third-party credits. It knows NOTHING about which product \u2014 the caller\n * supplies all of it.\n *\n * It used to hardcode EcoAgent's: PRODUCT_NAME, the GitHub URL, the tagline\n * (\"Heterogeneous-agent, stock-flow-consistent macroeconomic simulation\") and\n * two dependency lists. A library that ships an About box for somebody else's\n * application is not a library.\n *\n * EcoAgent's values now live in ui/js/ecoagent/about.js and are pushed in.\n *\n * @typedef {{name: string, license: string, url: string}} Dep\n * @typedef {{title: string, deps: Dep[]}} DepSection\n */\n\nimport { ManagedWindow } from './managed_window.js';\n\nfunction createExternalLink(text, url, className) {\n const a = document.createElement('a');\n a.className = className;\n a.textContent = text;\n a.href = url;\n a.title = url;\n a.addEventListener('click', (e) => {\n e.preventDefault();\n window.open(url, '_blank');\n });\n return a;\n}\n\nfunction buildDepSection(title, deps) {\n const section = document.createElement('div');\n section.className = 'twm-about-dialog__section';\n\n const heading = document.createElement('div');\n heading.className = 'twm-about-dialog__section-title';\n heading.textContent = title;\n section.appendChild(heading);\n\n const list = document.createElement('div');\n list.className = 'twm-about-dialog__dep-list';\n\n for (const dep of deps) {\n const row = document.createElement('div');\n row.className = 'twm-about-dialog__dep';\n\n const link = createExternalLink(dep.name, dep.url, 'twm-about-dialog__dep-name');\n row.appendChild(link);\n\n const lic = document.createElement('span');\n lic.className = 'twm-about-dialog__dep-license';\n lic.textContent = dep.license;\n row.appendChild(lic);\n\n list.appendChild(row);\n }\n\n section.appendChild(list);\n return section;\n}\n\n/**\n * Show the About dialog for whatever product the caller names.\n *\n * @param {Object} product\n * @param {string} product.name Product name \u2014 the title and the heading.\n * @param {string} [product.version]\n * @param {string} [product.tagline]\n * @param {string} [product.license] Shown as \"License: <x>\"; omitted if absent.\n * @param {string} [product.url] Homepage; omitted if absent.\n * @param {string} [product.urlLabel='Homepage']\n * @param {string} [product.logo='info'] Material symbol shown beside the title.\n * @param {DepSection[]} [product.credits=[]] Third-party credit sections.\n * @returns {Promise<void>} Resolves when the dialog is closed.\n */\nexport function showAboutDialog(product = {}) {\n const {\n name = 'Application',\n version = '',\n tagline = '',\n license = '',\n url = '',\n urlLabel = 'Homepage',\n logo = 'info',\n credits = [],\n } = product;\n\n return new Promise((resolve) => {\n let resolved = false;\n\n const finish = () => {\n if (resolved) return;\n resolved = true;\n dialogWindow.close();\n resolve();\n };\n\n // --- Content ---\n const contentEl = document.createElement('div');\n contentEl.className = 'twm-about-dialog__content';\n\n // Header\n const header = document.createElement('div');\n header.className = 'twm-about-dialog__header';\n\n const logoEl = document.createElement('span');\n logoEl.className = 'twm-about-dialog__logo material-symbols-outlined';\n logoEl.textContent = logo;\n header.appendChild(logoEl);\n\n const title = document.createElement('h2');\n title.className = 'twm-about-dialog__title';\n title.textContent = name;\n header.appendChild(title);\n\n if (version) {\n const versionEl = document.createElement('div');\n versionEl.className = 'twm-about-dialog__version';\n versionEl.textContent = `Version ${version}`;\n header.appendChild(versionEl);\n }\n\n if (tagline) {\n const taglineEl = document.createElement('div');\n taglineEl.className = 'twm-about-dialog__tagline';\n taglineEl.textContent = tagline;\n header.appendChild(taglineEl);\n }\n\n contentEl.appendChild(header);\n\n // Body (scrollable)\n const body = document.createElement('div');\n body.className = 'twm-about-dialog__body';\n\n // Project section \u2014 only if there is something to put in it.\n if (url || license) {\n const projectSection = document.createElement('div');\n projectSection.className = 'twm-about-dialog__section';\n\n const projectTitle = document.createElement('div');\n projectTitle.className = 'twm-about-dialog__section-title';\n projectTitle.textContent = 'Project';\n projectSection.appendChild(projectTitle);\n\n const links = document.createElement('div');\n links.className = 'twm-about-dialog__links';\n\n if (url) {\n const link = createExternalLink(urlLabel, url, 'twm-about-dialog__link');\n const icon = document.createElement('span');\n icon.className = 'material-symbols-outlined';\n icon.textContent = 'open_in_new';\n link.prepend(icon);\n links.appendChild(link);\n }\n\n if (license) {\n const licenseSpan = document.createElement('span');\n licenseSpan.className = 'twm-about-dialog__license-text';\n const licIcon = document.createElement('span');\n licIcon.className = 'material-symbols-outlined';\n licIcon.textContent = 'license';\n licenseSpan.appendChild(licIcon);\n licenseSpan.appendChild(document.createTextNode(`License: ${license}`));\n links.appendChild(licenseSpan);\n }\n\n projectSection.appendChild(links);\n body.appendChild(projectSection);\n }\n\n for (const section of credits) {\n body.appendChild(buildDepSection(section.title, section.deps ?? []));\n }\n\n contentEl.appendChild(body);\n\n // Footer\n const footer = document.createElement('div');\n footer.className = 'twm-about-dialog__footer';\n\n const closeBtn = document.createElement('button');\n closeBtn.type = 'button';\n closeBtn.className = 'twm-about-dialog__btn twm-about-dialog__btn--close';\n closeBtn.textContent = 'Close';\n closeBtn.addEventListener('click', finish);\n footer.appendChild(closeBtn);\n\n contentEl.appendChild(footer);\n\n // --- Window ---\n const dialogWindow = new ManagedWindow({\n id: 'about-dialog',\n title: `About ${name}`,\n icon: 'info',\n content: contentEl,\n minWidth: 420,\n minHeight: 400,\n defaultWidth: 460,\n defaultHeight: 540,\n canMinimize: false,\n canMaximize: false,\n canResize: false,\n canDrag: false,\n modal: true,\n onClose: () => {\n if (!resolved) {\n resolved = true;\n resolve();\n }\n },\n });\n\n dialogWindow.show();\n\n requestAnimationFrame(() => {\n closeBtn.focus();\n });\n });\n}\n", "/**\n * Sortable List Component\n * Location: ui/components/sortable_list.js\n *\n * Purpose: Provide a reusable list component with add, remove, reorder, and rename\n * capabilities. Used for named inputs in function nodes, rules in switch nodes, etc.\n *\n * Features:\n * - Add/remove items\n * - Drag-and-drop reordering\n * - Inline rename\n * - Custom item renderer\n * - Persistence via onChange callback\n *\n * Reordering is delegated to the shared DragReorder module (the same\n * ghost + drop-placeholder technique used by the tab bars and the schema\n * editor) so the reorder behaviour is implemented once.\n */\n\nimport { DragReorder } from './drag_reorder.js';\n\nexport class SortableList {\n /**\n * Create a sortable list.\n * @param {Object} options - Configuration options\n * @param {string} options.containerId - Unique ID for the container\n * @param {Array} options.items - Initial items array\n * @param {Function} options.onChange - Called with updated items array when list changes\n * @param {Function} options.renderItem - Custom renderer for item content (receives item, index, callbacks)\n * @param {Function} options.createItem - Factory function to create new items\n * @param {string} options.emptyMessage - Message to show when list is empty\n * @param {string} options.addButtonText - Text for add button\n * @param {boolean} options.allowReorder - Whether to allow drag-and-drop reordering\n * @param {boolean} options.allowRemove - Whether to allow removing items\n * @param {number} options.minItems - Minimum number of items (blocks removal if at min)\n */\n constructor({\n containerId,\n items = [],\n onChange = null,\n renderItem = null,\n createItem = null,\n emptyMessage = 'No items',\n addButtonText = 'Add Item',\n allowReorder = true,\n allowRemove = true,\n minItems = 0,\n } = {}) {\n this.containerId = containerId || `sortable-list-${Date.now()}`;\n this.items = Array.isArray(items) ? [...items] : [];\n this.onChange = typeof onChange === 'function' ? onChange : null;\n this.renderItem = typeof renderItem === 'function' ? renderItem : this.#defaultRenderItem.bind(this);\n this.createItem = typeof createItem === 'function' ? createItem : this.#defaultCreateItem.bind(this);\n this.emptyMessage = emptyMessage;\n this.addButtonText = addButtonText;\n this.allowReorder = allowReorder;\n this.allowRemove = allowRemove;\n this.minItems = minItems;\n\n this.root = null;\n this.listEl = null;\n this._dragReorder = null;\n }\n\n /**\n * Render the sortable list.\n * @returns {HTMLElement} The root container element\n */\n render() {\n if (this.root) {\n this.#refresh();\n return this.root;\n }\n\n this.root = document.createElement('div');\n this.root.className = 'twm-sortable-list';\n this.root.id = this.containerId;\n\n this.listEl = document.createElement('div');\n this.listEl.className = 'twm-sortable-list__items';\n\n this.root.appendChild(this.listEl);\n\n // Only show add button if addButtonText is provided\n if (this.addButtonText) {\n const addBtn = document.createElement('button');\n addBtn.type = 'button';\n addBtn.className = 'twm-sortable-list__add';\n addBtn.innerHTML = `<span class=\"material-symbols-outlined\">add</span> ${this.#escapeHtml(this.addButtonText)}`;\n addBtn.addEventListener('click', () => this.addItem());\n this.root.appendChild(addBtn);\n }\n\n this.#refresh();\n return this.root;\n }\n\n /**\n * Get current items.\n * @returns {Array} Copy of items array\n */\n getItems() {\n return [...this.items];\n }\n\n /**\n * Set items and re-render.\n * @param {Array} items - New items array\n */\n setItems(items) {\n this.items = Array.isArray(items) ? [...items] : [];\n this.#refresh();\n }\n\n /**\n * Add a new item.\n */\n addItem() {\n const newItem = this.createItem(this.items.length);\n this.items.push(newItem);\n this.#notifyChange();\n this.#refresh();\n }\n\n /**\n * Remove an item by index.\n * @param {number} index - Index of item to remove\n */\n removeItem(index) {\n if (index < 0 || index >= this.items.length) return;\n if (this.items.length <= this.minItems) return;\n \n this.items.splice(index, 1);\n this.#notifyChange();\n this.#refresh();\n }\n\n /**\n * Update an item at index.\n * @param {number} index - Index of item to update\n * @param {Object} updates - Properties to merge into item\n */\n updateItem(index, updates) {\n if (index < 0 || index >= this.items.length) return;\n \n this.items[index] = { ...this.items[index], ...updates };\n this.#notifyChange();\n }\n\n /**\n * Move an item from one index to another.\n * @param {number} fromIndex - Source index\n * @param {number} toIndex - Destination index\n */\n moveItem(fromIndex, toIndex) {\n if (fromIndex < 0 || fromIndex >= this.items.length) return;\n if (toIndex < 0 || toIndex >= this.items.length) return;\n if (fromIndex === toIndex) return;\n\n const [item] = this.items.splice(fromIndex, 1);\n this.items.splice(toIndex, 0, item);\n this.#notifyChange();\n this.#refresh();\n }\n\n /**\n * Dispose the component.\n */\n dispose() {\n this._dragReorder?.destroy();\n this._dragReorder = null;\n this.root = null;\n this.listEl = null;\n this.items = [];\n }\n\n // \u2500\u2500\u2500 Private Methods \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n #refresh() {\n if (!this.listEl) return;\n\n this.listEl.innerHTML = '';\n\n if (this.items.length === 0) {\n const empty = document.createElement('div');\n empty.className = 'twm-sortable-list__empty';\n empty.textContent = this.emptyMessage;\n this.listEl.appendChild(empty);\n return;\n }\n\n this.items.forEach((item, index) => {\n const row = this.#createRow(item, index);\n this.listEl.appendChild(row);\n });\n\n // Drag-to-reorder via the shared DragReorder module (ghost +\n // placeholder). Created once, bound to the persistent list\n // element; re-attached after each refresh to wire the rebuilt\n // rows. Drag is restricted to the grip handle.\n if (this.allowReorder) {\n if (!this._dragReorder) {\n this._dragReorder = new DragReorder({\n container: this.listEl,\n itemSelector: '.sortable-list__row',\n keyAttr: 'index',\n axis: 'y',\n indicatorClass: 'twm-sortable-list__drop',\n draggableGuard: (e) => !!e.target.closest('.twm-sortable-list__handle'),\n onReorder: (order) => this.#applyReorder(order),\n });\n }\n this._dragReorder.attach();\n }\n }\n\n /** Reorder `items` to match the new DOM order produced by a drag,\n * then notify + re-render. `order` holds the rows' pre-drag\n * `data-index` values in their new arrangement. */\n #applyReorder(order) {\n const next = order\n .map((i) => this.items[Number(i)])\n .filter((it) => it !== undefined);\n if (next.length !== this.items.length) return; // guard against drift\n this.items = next;\n this.#notifyChange();\n this.#refresh();\n }\n\n #createRow(item, index) {\n const row = document.createElement('div');\n row.className = 'twm-sortable-list__row';\n row.dataset.index = index;\n\n // Drag handle (if reordering enabled). The drag mechanics are\n // owned by the shared DragReorder instance (see #refresh); the\n // handle is just the grab affordance the drag is restricted to.\n if (this.allowReorder) {\n const handle = document.createElement('div');\n handle.className = 'twm-sortable-list__handle';\n handle.innerHTML = '<span class=\"material-symbols-outlined\">drag_indicator</span>';\n row.appendChild(handle);\n }\n\n // Item content (custom renderer)\n const content = document.createElement('div');\n content.className = 'twm-sortable-list__content';\n \n const callbacks = {\n update: (updates) => this.updateItem(index, updates),\n remove: () => this.removeItem(index),\n moveUp: () => this.moveItem(index, index - 1),\n moveDown: () => this.moveItem(index, index + 1),\n };\n \n this.renderItem(content, item, index, callbacks);\n row.appendChild(content);\n\n // Remove button (if removal enabled)\n if (this.allowRemove) {\n const canRemove = this.items.length > this.minItems;\n const removeBtn = document.createElement('button');\n removeBtn.type = 'button';\n removeBtn.className = 'twm-sortable-list__remove';\n removeBtn.disabled = !canRemove;\n removeBtn.title = canRemove ? 'Remove' : `Minimum ${this.minItems} items required`;\n removeBtn.innerHTML = '<span class=\"material-symbols-outlined\">close</span>';\n removeBtn.addEventListener('click', () => {\n if (canRemove) this.removeItem(index);\n });\n row.appendChild(removeBtn);\n }\n\n return row;\n }\n\n #defaultRenderItem(container, item, index, callbacks) {\n const input = document.createElement('input');\n input.type = 'text';\n input.className = 'twm-sortable-list__input';\n input.value = item.name ?? item.label ?? '';\n input.placeholder = `Item ${index + 1}`;\n input.addEventListener('change', () => {\n callbacks.update({ name: input.value });\n });\n container.appendChild(input);\n }\n\n #defaultCreateItem(index) {\n return {\n id: `item_${Date.now()}_${Math.random().toString(36).substr(2, 6)}`,\n name: `item${index + 1}`,\n };\n }\n\n #notifyChange() {\n if (this.onChange) {\n this.onChange([...this.items]);\n }\n }\n\n\n #escapeHtml(str) {\n return String(str ?? '')\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;');\n }\n}\n", "/**\n * attribute_list_editor.js \u2014 generic AttributeSpec list editor.\n *\n * One reusable component for every entity that declares a typed-slot\n * list: Asset.attributes, Archetype.attributes, SectorKind.requires,\n * MarketKind.requires, Flow.params, KPI.params. Mounts a SortableList\n * (drag-reorder + add + remove + empty-state) with typed cells:\n *\n * - scalar (number / integer / string / boolean): typed `<input>`\n * - expression: free-text input \u2014 engine evaluates each tick\n * - ref:<target>: typeahead-ish `<select>` populated by a caller-\n * supplied resolver returning {id, label} lists\n * - list[ref:<target>]: comma-separated input (UI primitive \u2014 chip\n * editor can land later without changing the data shape)\n * - select: dropdown of options (auto when `options[]` is set)\n *\n * Each row exposes the columns in `showColumns` (defaults to the full\n * set); callers narrow it (e.g. SectorKind.requires only needs name +\n * type + description, not default/value). Layout follows the column\n * spec \u2014 header strip aligned via CSS grid using --cols.\n *\n * Usage:\n *\n * import { mountAttributeListEditor } from\n * '../../ui/components/attribute_list_editor.js';\n *\n * const editor = mountAttributeListEditor(hostEl, {\n * items: kind.attributes,\n * showColumns: ['name', 'type', 'default', 'value', 'description'],\n * refResolvers: {\n * 'ref:asset': () => api.assets_list(),\n * },\n * onChange: (next) => { kind.attributes = next; save(); },\n * });\n * editor.refresh(); // call after `items` changes externally\n * editor.dispose(); // teardown\n */\n\nimport { SortableList } from './sortable_list.js';\n\n// The types a generic attribute editor knows about, with no application loaded.\n//\n// This used to also list nine EcoAgent entity kinds \u2014 asset_kind, market,\n// sub_sector, currency, sector, market_kind, asset_kind_template, archetype,\n// kpi \u2014 and derive `ref:<kind>` and `list[ref:<kind>]` from them. `types` was\n// ALREADY an injectable option; it simply had EcoAgent's ontology as its\n// default, which meant every consumer who didn't override it inherited a type\n// dropdown full of macroeconomics.\n//\n// Callers who want reference types build them with refTypesFor() and pass them\n// in, alongside the `refResolvers` that make them resolvable.\nconst SCALAR_TYPES = ['number', 'integer', 'string', 'boolean'];\n\nconst DEFAULT_TYPES = [...SCALAR_TYPES, 'expression'];\n\n/** `['agent']` -> `['ref:agent', 'list[ref:agent]']`. */\nexport function refTypesFor(kinds = []) {\n return [\n ...kinds.map((k) => `ref:${k}`),\n ...kinds.map((k) => `list[ref:${k}]`),\n ];\n}\n\nexport { SCALAR_TYPES, DEFAULT_TYPES };\n\nconst DEFAULT_COLUMNS = ['name', 'type', 'default', 'value', 'description'];\n\nconst COLUMN_TEMPLATES = {\n name: { label: 'name', width: 'minmax(140px, 1.2fr)' },\n type: { label: 'type', width: '140px' },\n default: { label: 'default', width: 'minmax(110px, 1fr)' },\n value: { label: 'value', width: 'minmax(110px, 1fr)' },\n description: { label: 'description', width: 'minmax(160px, 2fr)' },\n required: { label: 'req', width: '60px' },\n readonly: { label: 'r/o', width: '60px' },\n expression: { label: 'expression', width: 'minmax(160px, 2fr)' },\n // Layer N3 \u2014 extended AttributeSpec fields. Opt-in via showColumns\n // so existing single-table layouts (asset_kind editor) stay tight;\n // the agent params surface includes them.\n min: { label: 'min', width: '90px' },\n max: { label: 'max', width: '90px' },\n step: { label: 'step', width: '70px' },\n unit: { label: 'unit', width: '80px' },\n distribution: { label: 'dist', width: '110px' },\n // Distribution and \"selection set\" are two different concepts \u2014\n // numeric params sample from a continuous distribution (uniform /\n // normal / lognormal / \u2026), choice params pick from a discrete\n // option set. Keep them in separate columns so the user can tell\n // which is which at a glance.\n choices: { label: 'choices', width: '130px' },\n // Variation-override flags \u2014 R7 in\n // docs/ARCHETYPE_RETHINK_REQUIREMENTS.md. Tight columns so they\n // stay readable next to the scalar fields.\n enabled: { label: 'on', width: '50px' },\n force: { label: 'lock', width: '50px' },\n optional: { label: 'opt', width: '50px' },\n};\n\nconst DISTRIBUTION_OPTIONS = [\n '', 'constant', 'uniform', 'normal', 'lognormal', 'choice',\n];\n\n\n/** Classify one attribute against its parent-archetype counterpart.\n * Layer 8.J1 inheritance display:\n *\n * - 'inherited' \u2014 entity's effective value matches the archetype's\n * default for the same attribute name. UI paints the row blue.\n * - 'overridden' \u2014 entity's value is set AND differs from the\n * archetype's default. UI paints the row solarized orange + shows\n * a revert button.\n * - 'neutral' \u2014 neither side declares a value (or there's no parent).\n * UI paints the row in default style.\n */\nfunction _classifyRow(row, parentByName) {\n if (!parentByName) return 'neutral';\n const p = parentByName.get(row.name);\n if (!p) return 'neutral';\n const ourValue = (row.value !== undefined && row.value !== null)\n ? row.value : row.default;\n const parentValue = (p.value !== undefined && p.value !== null)\n ? p.value : p.default;\n if (ourValue === undefined || ourValue === null) return 'neutral';\n if (parentValue === undefined || parentValue === null) return 'overridden';\n // Loose equality: handles number vs numeric-string from form inputs.\n if (String(ourValue) === String(parentValue)) return 'inherited';\n return 'overridden';\n}\n\n\nexport function mountAttributeListEditor(hostEl, options = {}) {\n const {\n items = [],\n types = DEFAULT_TYPES,\n showColumns = DEFAULT_COLUMNS,\n refResolvers = {},\n onChange = () => {},\n onFlush = () => {},\n addButtonText = '',\n emptyMessage = 'No entries yet.',\n containerId = `attrs-${Math.random().toString(36).slice(2, 8)}`,\n allowReorder = true,\n allowRemove = true,\n // Layer 8.J1: parent-archetype attributes (the inherited baseline).\n // The editor uses this to classify each row as inherited / overridden /\n // neutral and to provide a revert action. Pass [] when no archetype\n // applies; the editor degrades gracefully (all rows render neutral).\n parentAttributes = null,\n createItem = () => ({\n name: '', type: 'string', default: null,\n value: null, description: '',\n }),\n // Layer N3 \u2014 per-column renderer overrides. Callers can supply\n // `cellOverrides: {column_name: (item, callbacks, ctx) => HTMLElement | null}`\n // to swap in a custom cell. Returning `null` falls through to\n // the default renderer. The `ctx` object exposes:\n // refreshRow() \u2014 force a re-render (the wider list refreshes\n // when the row's items change, e.g. type swap).\n // Use cases: agent params' distribution-dict button cell;\n // structured-type modal openers on the default cell.\n cellOverrides = null,\n // R7 \u2014 when true, this editor is mounted as a *variation* of the\n // parent archetype (not on the archetype itself). Rows where\n // the parent has `force=true` lock their editable cells; the\n // `enabled/force/optional` flag columns themselves stay\n // read-only (variations don't author flags, only the\n // archetype does).\n variationMode = false,\n } = options;\n\n // Lookup map for inheritance classification.\n const parentByName = parentAttributes\n ? new Map(parentAttributes.map((p) => [p.name, p]))\n : null;\n\n if (!hostEl) {\n return { refresh() {}, addItem() {}, dispose() {} };\n }\n\n hostEl.classList.add('twm-attr-editor');\n hostEl.style.setProperty('--cols',\n showColumns.map((c) => COLUMN_TEMPLATES[c]?.width || '1fr').join(' '));\n\n const refsCache = new Map();\n const resolveRefOptions = async (target) => {\n if (refsCache.has(target)) return refsCache.get(target);\n const resolver = refResolvers[`ref:${target}`]\n || refResolvers[`list[ref:${target}]`];\n let list = [];\n if (typeof resolver === 'function') {\n try { list = await resolver() || []; }\n catch (e) { console.warn('ref resolver failed', target, e); }\n }\n const normalised = (list || []).map((o) => {\n if (typeof o === 'string') return { id: o, label: o };\n return { id: o.id ?? o.value ?? '', label: o.label ?? o.id ?? '' };\n }).filter((o) => o.id);\n refsCache.set(target, normalised);\n return normalised;\n };\n\n // Header strip \u2014 mimics the SortableList row layout exactly so\n // header cells align with body cells. Row shape is:\n // [drag-handle] [content-with-cols-grid] [remove-button]\n // The header reuses `.sortable-list__row` chrome with placeholder\n // spans for the handle / remove gutters, then the inner content\n // div carries the same `--cols` grid as each row's content div.\n const header = document.createElement('div');\n header.className = 'twm-sortable-list__row twm-attr-editor__header-row';\n if (allowReorder) {\n const handlePh = document.createElement('span');\n handlePh.className = 'twm-sortable-list__handle twm-attr-editor__header-placeholder';\n header.appendChild(handlePh);\n }\n const headerContent = document.createElement('div');\n headerContent.className = 'twm-sortable-list__content twm-attr-editor__headers';\n for (const col of showColumns) {\n const span = document.createElement('span');\n span.textContent = COLUMN_TEMPLATES[col]?.label ?? col;\n headerContent.appendChild(span);\n }\n header.appendChild(headerContent);\n if (allowRemove) {\n const removePh = document.createElement('span');\n removePh.className = 'twm-sortable-list__remove twm-attr-editor__header-placeholder';\n header.appendChild(removePh);\n }\n hostEl.appendChild(header);\n\n const listHost = document.createElement('div');\n listHost.className = 'ea-attr-editor__rows';\n hostEl.appendChild(listHost);\n\n let list = null;\n\n const renderRow = (contentEl, item, _idx, callbacks) => {\n contentEl.classList.add('twm-attr-editor__row');\n // Layer 8.J1 \u2014 paint inheritance state.\n const cls = _classifyRow(item, parentByName);\n contentEl.classList.remove(\n 'twm-attr-editor__row--inherited',\n 'twm-attr-editor__row--overridden',\n 'twm-attr-editor__row--neutral',\n );\n contentEl.classList.add(`twm-attr-editor__row--${cls}`);\n\n // R7 variation-override flags. `enabled` defaults true, so the\n // disabled treatment only applies when explicitly false.\n // `force` locks the row (variations can't override). `optional`\n // signals the value is a suggestion \u2014 green border, no fill.\n // The flag rules are applied additively so the inheritance\n // classification's background still shows where applicable.\n // In variation mode the relevant flags are the parent's; in\n // archetype mode they're the row's own. (A variation row only\n // has the flags it inherited; it doesn't author its own.)\n const parentRow = parentByName?.get(item.name);\n const flagSource = variationMode && parentRow ? parentRow : item;\n contentEl.classList.toggle(\n 'twm-attr-editor__row--disabled', flagSource.enabled === false);\n contentEl.classList.toggle(\n 'twm-attr-editor__row--forced', flagSource.force === true);\n contentEl.classList.toggle(\n 'twm-attr-editor__row--optional', flagSource.optional === true);\n\n // Attention indicator on overridden rows + revert button.\n if (cls === 'overridden') {\n const attention = document.createElement('span');\n attention.className = 'twm-attr-editor__attention material-symbols-outlined';\n attention.textContent = 'fiber_manual_record';\n attention.title = 'Value overrides the parent default';\n contentEl.appendChild(attention);\n }\n\n for (const col of showColumns) {\n const cell = renderCell(col, item, callbacks);\n contentEl.appendChild(cell);\n }\n // R7 \u2014 lock the row's editable inputs when the parent forced it.\n // The flag columns themselves stay enabled on the archetype\n // (where the author sets them); in variation mode they're\n // read-only because variations don't author flags.\n const FLAG_COLS = new Set(['enabled', 'force', 'optional']);\n if (variationMode && flagSource.force === true) {\n contentEl.querySelectorAll(\n 'input:not([type=\"checkbox\"]), select, textarea'\n ).forEach((el) => { el.disabled = true; });\n }\n if (variationMode) {\n contentEl.querySelectorAll(\n 'input[type=\"checkbox\"].ea-attr-editor__cell--flag'\n ).forEach((el) => { el.disabled = true; });\n }\n void FLAG_COLS; // referenced by future per-column handling\n\n // Revert button \u2014 only rendered for overridden rows. Resets\n // `value` back to the archetype's inherited default. The row\n // re-classifies as 'inherited' on the next render pass.\n if (cls === 'overridden' && parentByName) {\n const p = parentByName.get(item.name);\n const parentDefault = (p?.value !== undefined && p?.value !== null)\n ? p.value : p?.default;\n const revert = document.createElement('button');\n revert.type = 'button';\n revert.className = 'twm-attr-editor__revert material-symbols-outlined';\n revert.textContent = 'undo';\n revert.title =\n `Revert to inherited default (${parentDefault ?? '\u2014'})`;\n revert.addEventListener('click', (e) => {\n e.stopPropagation();\n callbacks.update({ value: parentDefault });\n onFlush();\n // Force a re-render so the row re-classifies.\n list?.setItems(currentItems());\n });\n contentEl.appendChild(revert);\n }\n };\n\n const renderCell = (col, item, callbacks) => {\n // Caller override wins \u2014 used by agent_tab to inject the\n // distribution-dict button + structured-type modal openers.\n if (cellOverrides && typeof cellOverrides[col] === 'function') {\n const ctx = { refreshRow: () => list?.setItems(currentItems()) };\n const custom = cellOverrides[col](item, callbacks, ctx);\n if (custom) return custom;\n }\n if (col === 'name') return renderTextCell(item, 'name', callbacks, 'attr_name');\n if (col === 'type') return renderTypeCell(item, callbacks);\n if (col === 'description') return renderTextCell(item, 'description', callbacks, 'optional');\n if (col === 'required') return renderBoolCell(item, 'required', callbacks);\n if (col === 'readonly') return renderBoolCell(item, 'readonly', callbacks);\n // R7 \u2014 three variation-override flags. `enabled` defaults true,\n // so the checkbox renders checked when the field is undefined;\n // the others default false.\n if (col === 'enabled') return renderFlagCell(item, 'enabled', callbacks, true);\n if (col === 'force') return renderFlagCell(item, 'force', callbacks, false);\n if (col === 'optional') return renderFlagCell(item, 'optional', callbacks, false);\n if (col === 'expression') return renderTextCell(item, 'expression', callbacks, 'expr');\n if (col === 'min') return renderNumericCell(item, 'min', callbacks);\n if (col === 'max') return renderNumericCell(item, 'max', callbacks);\n if (col === 'step') return renderTextCell(item, 'step', callbacks, 'any');\n if (col === 'unit') return renderTextCell(item, 'unit', callbacks, 'USD/%/\u2026');\n if (col === 'distribution') return renderDistributionCell(item, callbacks);\n if (col === 'default' || col === 'value') return renderTypedValueCell(col, item, callbacks);\n // Unknown column \u2014 render a stub.\n const stub = document.createElement('span');\n stub.textContent = '';\n return stub;\n };\n\n const renderNumericCell = (item, field, callbacks) => {\n const el = document.createElement('input');\n el.type = 'number';\n el.className = 'twm-sortable-list__input twm-attr-editor__cell';\n el.step = 'any';\n el.value = (item[field] === null || item[field] === undefined)\n ? '' : String(item[field]);\n el.placeholder = '\u2014';\n el.addEventListener('input', () => {\n const v = el.value === '' ? null : Number(el.value);\n callbacks.update({ [field]: v });\n });\n el.addEventListener('blur', () => onFlush());\n return el;\n };\n\n const renderDistributionCell = (item, callbacks) => {\n const el = document.createElement('select');\n el.className = 'twm-attr-editor__cell';\n for (const d of DISTRIBUTION_OPTIONS) {\n const o = document.createElement('option');\n o.value = d; o.textContent = d || '(none)';\n if ((item.distribution || '') === d) o.selected = true;\n el.appendChild(o);\n }\n el.addEventListener('change', () => {\n callbacks.update({ distribution: el.value || null });\n onFlush();\n });\n return el;\n };\n\n const renderTextCell = (item, field, callbacks, placeholder) => {\n const el = document.createElement('input');\n el.type = 'text';\n el.className = 'twm-sortable-list__input twm-attr-editor__cell';\n el.value = item[field] ?? '';\n el.placeholder = placeholder;\n el.addEventListener('input', () => {\n callbacks.update({ [field]: el.value });\n });\n el.addEventListener('blur', () => onFlush());\n return el;\n };\n\n const renderBoolCell = (item, field, callbacks) => {\n const el = document.createElement('input');\n el.type = 'checkbox';\n el.className = 'twm-attr-editor__cell';\n el.checked = !!item[field];\n el.addEventListener('change', () => {\n callbacks.update({ [field]: el.checked });\n onFlush();\n });\n return el;\n };\n\n /** Boolean cell for R7 flags. Same as renderBoolCell but treats an\n * undefined value as `defaultIfMissing`, so `enabled` (default\n * true) renders checked on legacy rows that predate the flag. */\n const renderFlagCell = (item, field, callbacks, defaultIfMissing) => {\n const el = document.createElement('input');\n el.type = 'checkbox';\n el.className = 'twm-attr-editor__cell ea-attr-editor__cell--flag';\n const cur = item[field];\n el.checked = (cur === undefined || cur === null)\n ? !!defaultIfMissing : !!cur;\n el.addEventListener('change', () => {\n callbacks.update({ [field]: el.checked });\n onFlush();\n });\n return el;\n };\n\n const renderTypeCell = (item, callbacks) => {\n const el = document.createElement('select');\n el.className = 'twm-attr-editor__cell';\n // Group scalar, expression, ref, list[ref] for readability.\n // Any type the caller hands us that doesn't fit one of those\n // buckets lands in `other` \u2014 that's how param-mode types\n // (float / int / str / bool / choice / map / schedule /\n // string_list) appear without breaking the dispatch.\n const seen = new Set();\n const addOpts = (label, optList) => {\n if (optList.length === 0) return;\n const grp = document.createElement('optgroup');\n grp.label = label;\n for (const t of optList) {\n const o = document.createElement('option');\n o.value = t; o.textContent = t;\n if (t === item.type) o.selected = true;\n grp.appendChild(o);\n seen.add(t);\n }\n el.appendChild(grp);\n };\n addOpts('scalar', types.filter((t) => SCALAR_TYPES.includes(t)));\n addOpts('expression', types.filter((t) => t === 'expression'));\n addOpts('typed reference', types.filter((t) => t.startsWith('ref:')));\n addOpts('list of references',\n types.filter((t) => t.startsWith('list[ref:')));\n addOpts('other', types.filter((t) => !seen.has(t)));\n el.addEventListener('change', () => {\n // On type change, leave default/value as-is \u2014 the user\n // may want to keep e.g. a numeric value when switching\n // from number to integer. The typed value cell renderer\n // coerces on display.\n callbacks.update({ type: el.value });\n onFlush();\n // Force re-render so the value cell picks up the new\n // input type (number \u2192 select, etc.).\n list?.setItems(currentItems());\n });\n return el;\n };\n\n const renderTypedValueCell = (field, item, callbacks) => {\n const t = item.type || 'string';\n if (t === 'boolean') {\n return renderBoolCell(item, field, callbacks);\n }\n if (t === 'integer' || t === 'number') {\n const el = document.createElement('input');\n el.type = 'number';\n el.className = 'twm-sortable-list__input twm-attr-editor__cell';\n el.step = (t === 'integer') ? '1' : 'any';\n el.value = (item[field] === null || item[field] === undefined)\n ? '' : item[field];\n el.placeholder = field;\n el.addEventListener('input', () => {\n const v = el.value === '' ? null\n : (t === 'integer' ? parseInt(el.value, 10)\n : Number(el.value));\n callbacks.update({ [field]: v });\n });\n el.addEventListener('blur', () => onFlush());\n return el;\n }\n if (t === 'expression') {\n // For an expression-typed attribute, the value cell shows\n // the expression itself (read-only by convention \u2014 the\n // engine fills it). Stub: render the expression string;\n // the actual expression authoring lives in the\n // `expression` column when shown.\n const el = document.createElement('span');\n el.className = 'twm-attr-editor__cell twm-attr-editor__cell--readonly';\n el.textContent = item.expression\n ? `\u2192 ${item.expression}` : '\u2014 (engine-evaluated)';\n return el;\n }\n if (t.startsWith('ref:')) {\n return renderRefCell(t.slice(4), field, item, callbacks);\n }\n if (t.startsWith('list[ref:') && t.endsWith(']')) {\n return renderListRefCell(t.slice(9, -1), field, item, callbacks);\n }\n if (Array.isArray(item.options) && item.options.length > 0) {\n return renderEnumCell(item.options, field, item, callbacks);\n }\n // String fallback.\n const el = document.createElement('input');\n el.type = 'text';\n el.className = 'twm-sortable-list__input twm-attr-editor__cell';\n el.value = item[field] ?? '';\n el.placeholder = field;\n el.addEventListener('input', () => {\n callbacks.update({ [field]: el.value });\n });\n el.addEventListener('blur', () => onFlush());\n return el;\n };\n\n const renderRefCell = (target, field, item, callbacks) => {\n const el = document.createElement('select');\n el.className = 'twm-attr-editor__cell';\n const placeholder = document.createElement('option');\n placeholder.value = '';\n placeholder.textContent = `\u2014 pick ${target} \u2014`;\n el.appendChild(placeholder);\n // Render once with the cached options if we have them; resolve\n // async otherwise and patch.\n const populate = (opts) => {\n // Clear everything except the placeholder.\n while (el.childNodes.length > 1) el.removeChild(el.lastChild);\n for (const o of opts) {\n const node = document.createElement('option');\n node.value = o.id;\n node.textContent = o.label;\n if (o.id === item[field]) node.selected = true;\n el.appendChild(node);\n }\n };\n if (refsCache.has(target)) {\n populate(refsCache.get(target));\n } else {\n resolveRefOptions(target).then(populate);\n }\n el.addEventListener('change', () => {\n callbacks.update({ [field]: el.value || null });\n onFlush();\n });\n return el;\n };\n\n const renderListRefCell = (target, field, item, callbacks) => {\n // MVP: comma-separated text input over the underlying string-\n // list. The chip-style picker can replace this without\n // changing the on-disk shape.\n const el = document.createElement('input');\n el.type = 'text';\n el.className = 'twm-sortable-list__input twm-attr-editor__cell';\n const arr = Array.isArray(item[field]) ? item[field] : [];\n el.value = arr.join(', ');\n el.placeholder = `${target}, ${target}, \u2026`;\n el.addEventListener('input', () => {\n const next = el.value.split(',')\n .map((s) => s.trim()).filter(Boolean);\n callbacks.update({ [field]: next });\n });\n el.addEventListener('blur', () => onFlush());\n return el;\n };\n\n const renderEnumCell = (options, field, item, callbacks) => {\n // `options` may be either a flat list of strings (legacy:\n // `['fx', 'commodity', \u2026]`) or a list of `{value, label}`\n // pairs (newer callers that want display labels distinct from\n // the stored value, e.g. market-rules ref fields where the\n // value is a currency id and the label is the currency name).\n const el = document.createElement('select');\n el.className = 'twm-attr-editor__cell';\n // Empty placeholder so the user can clear the selection.\n const blank = document.createElement('option');\n blank.value = '';\n blank.textContent = '\u2014';\n if (item[field] === null || item[field] === undefined || item[field] === '') {\n blank.selected = true;\n }\n el.appendChild(blank);\n for (const opt of options) {\n const o = document.createElement('option');\n if (opt !== null && typeof opt === 'object') {\n o.value = String(opt.value ?? opt.id ?? '');\n o.textContent = String(opt.label ?? opt.value ?? opt.id ?? '');\n } else {\n o.value = String(opt);\n o.textContent = String(opt);\n }\n if (o.value === String(item[field] ?? '')) o.selected = true;\n el.appendChild(o);\n }\n el.addEventListener('change', () => {\n callbacks.update({ [field]: el.value === '' ? null : el.value });\n onFlush();\n });\n return el;\n };\n\n // \u2500\u2500\u2500 SortableList wiring \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n const itemsCopy = (src) => (src || []).map((it) => ({ ...it }));\n const currentItems = () => list?.getItems?.() || itemsCopy(items);\n\n const buildList = (current) => {\n try { list?.dispose?.(); } catch {}\n listHost.innerHTML = '';\n list = new SortableList({\n containerId,\n items: itemsCopy(current),\n allowReorder,\n allowRemove,\n minItems: 0,\n emptyMessage,\n addButtonText,\n createItem,\n renderItem: renderRow,\n onChange: (next) => onChange(next.map((it) => ({ ...it }))),\n });\n listHost.appendChild(list.render());\n };\n\n buildList(items);\n\n return {\n addItem() { list?.addItem(); },\n refresh(nextItems) {\n // External update: rebuild to pick up new type-cell shapes.\n // Cheaper than setItems when types changed; setItems\n // wouldn't re-render the row controls.\n buildList(nextItems !== undefined ? nextItems : currentItems());\n },\n items() {\n return currentItems();\n },\n dispose() {\n try { list?.dispose?.(); } catch {}\n list = null;\n hostEl.innerHTML = '';\n hostEl.classList.remove('twm-attr-editor');\n },\n };\n}\n", "/**\n * Autocomplete Field Component\n * Location: ui/components/autocomplete_field.js\n *\n * Purpose: Provide autocomplete dropdown for text input fields,\n * specifically designed for variable reference inputs.\n *\n * Usage:\n * const ac = new AutocompleteField({\n * fieldId: 'my-input',\n * field: { placeholder: '...', value: '...' },\n * provider: ({ value }) => [{ label: 'foo', type: 'variable' }, ...],\n * onChange: (value) => { ... }\n * });\n * container.appendChild(ac.render());\n */\n\nexport class AutocompleteField {\n constructor({\n fieldId,\n field = {},\n provider = null,\n onChange = null,\n logger = null,\n namespace = null,\n namespaceOptions = [],\n showNamespaceSelect = false,\n variant = null,\n showNamespaceChip = false,\n allowScopeToggle = false,\n namespaceLabel = null,\n scopeMode = 'current',\n skipNamespacePrefix = false,\n // Material symbol per completion type, merged over the generic set. The\n // framework's map used to include `sector: 'domain'` \u2014 an EcoAgent\n // completion type \u2014 so the widget knew one application's ontology.\n typeIcons = {},\n } = {}) {\n if (!fieldId) {\n throw new Error('AutocompleteField requires a fieldId');\n }\n this.fieldId = fieldId;\n this.field = field;\n this.provider = typeof provider === 'function' ? provider : () => [];\n this.onChange = typeof onChange === 'function' ? onChange : null;\n this.logger = logger;\n this.typeIcons = typeIcons ?? {};\n this.namespace = namespace;\n this.namespaceOptions = Array.isArray(namespaceOptions) ? [...namespaceOptions] : [];\n // Ensure the active namespace is always present as an option, even if\n // it was not provided (e.g., data manager not yet hydrated).\n if (this.namespace && !this.namespaceOptions.some((opt) => opt.value === this.namespace)) {\n const fallbackLabel = this.field.namespaceLabel || 'This Tab';\n this.namespaceOptions.push({ value: this.namespace, label: fallbackLabel, token: fallbackLabel });\n }\n this.showNamespaceSelect = Boolean(showNamespaceSelect);\n this.variant = variant;\n this.showNamespaceChip = Boolean(showNamespaceChip);\n this.allowScopeToggle = Boolean(allowScopeToggle);\n this.namespaceLabel = namespaceLabel;\n this.scope = scopeMode === 'all' ? 'all' : 'current';\n this.skipNamespacePrefix = Boolean(skipNamespacePrefix);\n this.disabled = Boolean(field.disabled);\n\n const parsed = this.#parseInitialNamespace(field.value ?? '');\n this.selectedNamespace = parsed.initialNamespace;\n this.initialFragment = parsed.initialFragment;\n\n this._lastDropdownRect = null;\n\n this.root = null;\n this.input = null;\n this.dropdown = null;\n this.helperEl = null;\n this.scopeControl = null;\n this.namespaceSelect = null;\n this.ghost = null;\n\n this._items = [];\n this._activeIndex = -1;\n this._isOpen = false;\n this._disposers = [];\n }\n\n getValue() {\n return this.#composeValue();\n }\n\n setComposedValue(value) {\n if (!this.input) return;\n const safeValue = typeof value === 'string' ? value : '';\n\n // When namespace prefixing is disabled, store the raw value\n if (this.skipNamespacePrefix) {\n this.input.value = safeValue;\n this.initialFragment = safeValue;\n this.#renderGhost();\n this.#close();\n return;\n }\n\n const parsed = this.#parseInitialNamespace(safeValue);\n this.selectedNamespace = parsed.initialNamespace;\n this.initialFragment = parsed.initialFragment;\n\n if (this.namespaceSelect) {\n this.namespaceSelect.value = this.selectedNamespace;\n }\n this.#updateNamespaceChip();\n this.input.value = parsed.initialFragment;\n this.#renderGhost();\n this.#close();\n }\n\n #parseInitialNamespace(rawValue) {\n const value = typeof rawValue === 'string' ? rawValue.trim() : '';\n const options = this.namespaceOptions;\n \n // Default to provided namespace when available; otherwise fall back to first option or '__ALL__'.\n const defaultNs = this.namespace \n ? (options.find((opt) => opt.value === this.namespace)?.value ?? this.namespace)\n : (options[0]?.value ?? '__ALL__');\n \n if (!options.length) {\n return { initialNamespace: defaultNs, initialFragment: value };\n }\n if (!value) {\n return { initialNamespace: defaultNs, initialFragment: '' };\n }\n \n // Check for namespace prefix (by value OR label)\n const dotIndex = value.indexOf('.');\n if (dotIndex > 0) {\n const nsCandidate = value.slice(0, dotIndex);\n const match = options.find((opt) => \n (opt.value || '').toLowerCase() === nsCandidate.toLowerCase() ||\n (opt.label || '').toLowerCase() === nsCandidate.toLowerCase()\n );\n if (match) {\n return { initialNamespace: match.value, initialFragment: value.slice(dotIndex + 1) };\n }\n }\n return { initialNamespace: defaultNs, initialFragment: value };\n }\n\n #resolveNamespaceLabel() {\n if (this.scope === 'all') {\n return 'All Namespaces';\n }\n if (typeof this.namespaceLabel === 'string' && this.namespaceLabel.trim()) {\n return this.namespaceLabel.trim();\n }\n if (typeof this.field.namespaceLabel === 'string' && this.field.namespaceLabel.trim()) {\n return this.field.namespaceLabel.trim();\n }\n if (typeof this.namespace === 'string' && this.namespace.trim()) {\n return this.namespace.trim();\n }\n return 'This Tab';\n }\n\n #toggleScope() {\n if (this.disabled) return;\n this.scope = this.scope === 'all' ? 'current' : 'all';\n this.root?.classList?.toggle('twm-autocomplete-field--scope-all', this.scope === 'all');\n this.#updateNamespaceChip();\n this.#updateSuggestions();\n }\n\n #updateNamespaceChip() {\n if (!this.scopeControl) return;\n this.scopeControl.textContent = this.#resolveNamespaceLabel();\n this.scopeControl.dataset.scope = this.scope;\n this.scopeControl.title = this.scope === 'all'\n ? 'Searching across all namespaces (click to limit to this tab)'\n : 'Searching this tab (click to search all namespaces)';\n }\n\n render() {\n if (this.root) {\n return this.root;\n }\n\n this.root = document.createElement('div');\n this.root.className = 'twm-autocomplete-field';\n if (this.variant) {\n this.root.classList.add(`twm-autocomplete-field--${this.variant}`);\n }\n this.root.classList.toggle('twm-autocomplete-field--scope-all', this.scope === 'all');\n\n const inputWrapper = document.createElement('div');\n inputWrapper.className = 'twm-autocomplete-field__input-wrapper';\n\n if (this.showNamespaceSelect && this.namespaceOptions.length) {\n const select = document.createElement('select');\n select.className = 'twm-autocomplete-field__namespace-select';\n this.namespaceOptions.forEach((opt) => {\n const option = document.createElement('option');\n option.value = opt.value;\n option.textContent = opt.label ?? opt.value;\n if (opt.value === this.selectedNamespace) {\n option.selected = true;\n }\n select.appendChild(option);\n });\n this.namespaceSelect = select;\n inputWrapper.appendChild(select);\n }\n\n if (this.showNamespaceChip) {\n const nsChip = document.createElement(this.allowScopeToggle ? 'button' : 'span');\n nsChip.className = 'twm-autocomplete-field__namespace';\n if (this.allowScopeToggle) {\n nsChip.setAttribute('type', 'button');\n }\n if (this.allowScopeToggle) {\n nsChip.classList.add('twm-autocomplete-field__namespace--toggle');\n nsChip.addEventListener('click', () => this.#toggleScope());\n }\n this.scopeControl = nsChip;\n this.#updateNamespaceChip();\n inputWrapper.appendChild(nsChip);\n }\n\n this.input = document.createElement('input');\n this.input.type = 'text';\n this.input.className = 'twm-autocomplete-field__input';\n this.input.id = this.fieldId;\n this.input.autocomplete = 'off';\n this.input.spellcheck = false;\n if (this.field.placeholder) {\n this.input.placeholder = this.field.placeholder;\n }\n if (this.field.value != null) {\n this.input.value = this.initialFragment;\n }\n if (this.disabled) {\n this.input.disabled = true;\n this.root.classList.add('twm-autocomplete-field--disabled');\n }\n inputWrapper.appendChild(this.input);\n\n // Ghost overlay disabled - namespace select provides visual context\n this.ghost = null;\n\n this.dropdown = document.createElement('div');\n this.dropdown.className = 'twm-autocomplete-field__dropdown';\n this.dropdown.setAttribute('role', 'listbox');\n // Append dropdown to body to escape stacking context limitations\n document.body.appendChild(this.dropdown);\n\n this.helperEl = document.createElement('div');\n this.helperEl.className = 'twm-autocomplete-field__helper twm-config-hint';\n if (this.field.helperText) {\n this.helperEl.textContent = this.field.helperText;\n }\n\n this.root.appendChild(inputWrapper);\n this.root.appendChild(this.helperEl);\n\n this.#wireEvents();\n this.#renderGhost();\n return this.root;\n }\n\n #wireEvents() {\n const onInput = () => {\n if (this.disabled) return;\n this.#syncNamespaceFromInput();\n this.#renderGhost();\n this.#updateSuggestions();\n };\n\n const onChange = () => {\n this.onChange?.(this.#composeValue(), { immediate: false, namespace: this.selectedNamespace });\n };\n\n const onPaste = () => {\n // No special paste handling needed\n };\n\n const onKeyDown = (e) => {\n if (this.disabled) return;\n this.#handleKeyDown(e);\n };\n\n const onFocus = () => {\n if (this.disabled) return;\n this.#updateSuggestions();\n };\n\n const onBlur = (e) => {\n // Delay close to allow click on dropdown items\n setTimeout(() => {\n if (!this.root?.contains(document.activeElement)) {\n this.#close();\n // Trigger save on blur (similar to change event)\n this.onChange?.(this.#composeValue(), { immediate: false, namespace: this.selectedNamespace });\n }\n }, 150);\n };\n\n const onDropdownMouseDown = (e) => {\n // Prevent blur when clicking dropdown\n e.preventDefault();\n };\n\n const onDropdownClick = (e) => {\n const item = e.target.closest('.twm-autocomplete-field__item');\n if (item) {\n const index = parseInt(item.dataset.index, 10);\n if (!isNaN(index)) {\n this.#selectItem(index);\n }\n }\n };\n\n this.input.addEventListener('input', onInput);\n this.input.addEventListener('change', onChange);\n this.input.addEventListener('paste', onPaste);\n this.input.addEventListener('keydown', onKeyDown);\n this.input.addEventListener('focus', onFocus);\n this.input.addEventListener('blur', onBlur);\n this.dropdown.addEventListener('mousedown', onDropdownMouseDown);\n this.dropdown.addEventListener('click', onDropdownClick);\n\n if (this.namespaceSelect) {\n const onSelectChange = () => {\n // Store the new namespace selection\n this.selectedNamespace = this.namespaceSelect.value;\n // Refresh suggestions and notify listener so selection can be persisted\n this.#updateSuggestions();\n this.onChange?.(this.#composeValue(), { \n immediate: false, \n namespace: this.selectedNamespace,\n viewNamespace: this.selectedNamespace\n });\n };\n this.namespaceSelect.addEventListener('change', onSelectChange);\n this._disposers.push(() => this.namespaceSelect.removeEventListener('change', onSelectChange));\n }\n\n const onWindowResize = () => {\n if (this._isOpen) {\n this.#positionDropdown();\n }\n };\n window.addEventListener('resize', onWindowResize);\n\n // Close dropdown when user scrolls (dropdown is position: fixed so doesn't move with content)\n const onScroll = (e) => {\n if (!this._isOpen) return;\n // Don't close if scrolling inside the dropdown itself\n if (this.dropdown?.contains(e.target)) return;\n this.#close();\n };\n document.addEventListener('scroll', onScroll, true); // capture phase catches all scroll events\n this._disposers.push(() => {\n document.removeEventListener('scroll', onScroll, true);\n });\n\n // Close dropdown when clicking outside (anywhere not in root or dropdown)\n const onDocumentClick = (e) => {\n if (!this._isOpen) return;\n const clickedInRoot = this.root?.contains(e.target);\n const clickedInDropdown = this.dropdown?.contains(e.target);\n if (!clickedInRoot && !clickedInDropdown) {\n this.#close();\n }\n };\n document.addEventListener('click', onDocumentClick, true);\n\n this._disposers.push(() => {\n window.removeEventListener('resize', onWindowResize);\n });\n this._disposers.push(() => {\n document.removeEventListener('click', onDocumentClick, true);\n });\n\n this._disposers.push(() => {\n this.input.removeEventListener('input', onInput);\n this.input.removeEventListener('change', onChange);\n this.input.removeEventListener('paste', onPaste);\n this.input.removeEventListener('keydown', onKeyDown);\n this.input.removeEventListener('focus', onFocus);\n this.input.removeEventListener('blur', onBlur);\n this.dropdown.removeEventListener('mousedown', onDropdownMouseDown);\n this.dropdown.removeEventListener('click', onDropdownClick);\n });\n }\n\n #handleKeyDown(e) {\n if (!this._isOpen) {\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n this.#updateSuggestions();\n e.preventDefault();\n }\n return;\n }\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n this.#moveSelection(1);\n break;\n case 'ArrowUp':\n e.preventDefault();\n this.#moveSelection(-1);\n break;\n case 'Enter':\n e.preventDefault();\n if (this._activeIndex >= 0) {\n this.#selectItem(this._activeIndex);\n }\n // Always blur on Enter to trigger save\n this.input?.blur();\n break;\n case 'Tab':\n if (this._activeIndex >= 0) {\n e.preventDefault();\n this.#selectItem(this._activeIndex);\n }\n break;\n case 'Escape':\n e.preventDefault();\n this.#close();\n break;\n }\n }\n\n #updateSuggestions() {\n // Pass the fragment (variable part) for filtering, not the full composed value\n const fragment = this.#getInputFragment();\n try {\n const items = this.provider({ \n value: fragment, \n scope: this.scope, \n namespace: this.selectedNamespace \n }) || [];\n this._items = Array.isArray(items) ? items : [];\n this._activeIndex = items.length > 0 ? 0 : -1;\n this.#renderDropdown();\n if (items.length > 0) {\n this.#open();\n } else {\n this.#close();\n }\n } catch (err) {\n this.logger?.warn?.('autocomplete', 'Provider error', { err });\n this._items = [];\n this.#close();\n }\n }\n\n #renderDropdown() {\n this.dropdown.innerHTML = '';\n const showingAll = this.selectedNamespace === '__ALL__';\n \n this._items.forEach((item, index) => {\n const el = document.createElement('div');\n el.className = 'twm-autocomplete-field__item';\n el.setAttribute('role', 'option');\n el.dataset.index = index;\n el.dataset.type = item.type || item.iconType || 'variable';\n if (index === this._activeIndex) {\n el.classList.add('active');\n }\n\n // Icon based on type\n const icon = document.createElement('span');\n icon.className = 'twm-autocomplete-field__icon material-symbols-outlined';\n icon.textContent = this.#getIconForType(item.type || item.iconType);\n el.appendChild(icon);\n\n // Label\n const label = document.createElement('span');\n label.className = 'twm-autocomplete-field__label';\n label.textContent = item.label || item.insertText || '';\n el.appendChild(label);\n\n // Show namespace indicator when viewing all namespaces\n if (showingAll && item.metadata?.namespaceId) {\n const nsLabel = this.#resolveNamespaceToken(item.metadata.namespaceId);\n if (nsLabel) {\n const nsIndicator = document.createElement('span');\n nsIndicator.className = 'twm-autocomplete-field__namespace-indicator';\n nsIndicator.textContent = nsLabel;\n el.appendChild(nsIndicator);\n }\n }\n\n // Optional badge (type)\n if (item.type && !showingAll) {\n const badge = document.createElement('span');\n badge.className = 'twm-autocomplete-field__badge';\n badge.textContent = item.type;\n el.appendChild(badge);\n }\n\n this.dropdown.appendChild(el);\n });\n if (this._isOpen) {\n this.#positionDropdown();\n }\n }\n\n #resolveNamespaceToken(namespaceId) {\n if (!namespaceId) return null;\n const opt = this.namespaceOptions.find((o) => o.value === namespaceId);\n return opt?.token || opt?.label || null;\n }\n\n #getIconForType(type) {\n const icons = {\n variable: 'functions',\n 'variable-qualified': 'link',\n stock: 'account_balance',\n account: 'savings',\n function: 'code',\n constant: 'numbers',\n operator: 'calculate',\n snippet: 'content_paste',\n ...this.typeIcons,\n };\n return icons[type] || 'label';\n }\n\n #moveSelection(delta) {\n if (this._items.length === 0) return;\n let newIndex = this._activeIndex + delta;\n if (newIndex < 0) newIndex = this._items.length - 1;\n if (newIndex >= this._items.length) newIndex = 0;\n this._activeIndex = newIndex;\n this.#renderDropdown();\n this.#scrollToActive();\n }\n\n #scrollToActive() {\n const activeEl = this.dropdown.querySelector('.twm-autocomplete-field__item.active');\n if (activeEl) {\n activeEl.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n }\n }\n\n #selectItem(index) {\n const item = this._items[index];\n if (!item) return;\n \n // Extract namespace from the selected item's metadata\n const itemNamespace = item.metadata?.namespaceId || null;\n \n // Put just the variable name in the input (not qualified)\n const insertText = item.insertText || item.label || '';\n this.input.value = insertText;\n \n // When \"All\" is selected, do NOT change the dropdown - keep it at \"All\"\n // Instead, pass the item's namespace via the callback so it's saved correctly\n // This allows users to stay in \"All\" view while browsing/selecting variables\n const viewNamespace = this.selectedNamespace; // What the dropdown shows (\"__ALL__\" or specific)\n const resolvedNamespace = (viewNamespace === '__ALL__' && itemNamespace) \n ? itemNamespace \n : viewNamespace;\n \n this.#close();\n this.input.focus();\n // Emit composed value with both namespace values and item metadata\n this.onChange?.(this.#composeValue(), {\n immediate: true,\n namespace: resolvedNamespace,\n viewNamespace: viewNamespace,\n metadata: item.metadata || null,\n });\n }\n\n #open() {\n if (this._isOpen) {\n return;\n }\n this._isOpen = true;\n this.#positionDropdown();\n this.dropdown.classList.add('visible');\n }\n\n #close() {\n if (!this._isOpen) return;\n this._isOpen = false;\n this.dropdown.classList.remove('visible');\n this._activeIndex = -1;\n }\n\n #syncNamespaceFromInput() {\n // Auto-switch namespace dropdown when user types \"Namespace.\" prefix\n // But do NOT modify the input value - keep what user typed\n // Also do NOT switch away from \"__ALL__\" unless user explicitly types a namespace prefix\n if (!this.namespaceOptions.length) return;\n const value = this.input?.value || '';\n const dotIndex = value.indexOf('.');\n if (dotIndex > 0) {\n const nsCandidate = value.slice(0, dotIndex);\n // Match by value OR display label\n const match = this.namespaceOptions.find((opt) => \n opt.value !== '__ALL__' && (\n (opt.value || '').toLowerCase() === nsCandidate.toLowerCase() ||\n (opt.label || '').toLowerCase() === nsCandidate.toLowerCase() ||\n (opt.token || '').toLowerCase() === nsCandidate.toLowerCase()\n )\n );\n if (match && this.namespaceSelect && this.namespaceSelect.value !== match.value) {\n this.namespaceSelect.value = match.value;\n this.selectedNamespace = match.value;\n }\n }\n // Note: We no longer auto-reset to a namespace when typing without a dot\n // This allows \"All\" selection to remain stable\n }\n\n #getInputFragment() {\n // Get the variable name fragment from input (strip namespace prefix if present)\n const value = this.input?.value || '';\n const dotIndex = value.indexOf('.');\n if (dotIndex > 0) {\n const nsCandidate = value.slice(0, dotIndex);\n const match = this.namespaceOptions.find((opt) => \n opt.value !== '__ALL__' && (\n (opt.value || '').toLowerCase() === nsCandidate.toLowerCase() ||\n (opt.label || '').toLowerCase() === nsCandidate.toLowerCase()\n )\n );\n if (match) {\n return value.slice(dotIndex + 1);\n }\n }\n return value;\n }\n\n #composeValue() {\n // Compose the full reference value for saving\n // Use the raw input value - it may already contain namespace prefix\n const rawInput = this.input?.value || '';\n if (!rawInput) return '';\n \n // Skip namespace prefixing for simple value fields (e.g., sector, account name)\n if (this.skipNamespacePrefix) {\n return rawInput;\n }\n \n // If input already has a namespace prefix, return as-is\n const dotIndex = rawInput.indexOf('.');\n if (dotIndex > 0) {\n const nsCandidate = rawInput.slice(0, dotIndex);\n const match = this.namespaceOptions.find((opt) => \n opt.value !== '__ALL__' && (\n (opt.value || '').toLowerCase() === nsCandidate.toLowerCase() ||\n (opt.label || '').toLowerCase() === nsCandidate.toLowerCase()\n )\n );\n if (match) {\n // Input already has valid namespace prefix, return as-is\n return rawInput;\n }\n }\n \n // No namespace prefix in input - prepend from dropdown if not \"All\"\n const ns = this.selectedNamespace;\n if (!ns || ns === '__ALL__') {\n return rawInput;\n }\n \n // Find display label for the namespace (case-insensitive search)\n const nsOption = this.namespaceOptions.find((opt) => \n opt.value === ns || (opt.value || '').toLowerCase() === (ns || '').toLowerCase()\n );\n\n // Choose a human-friendly token; fall back to label. If we only have a UUID-looking\n // token, avoid prefixing to prevent UUIDs leaking into the input.\n const nsToken = nsOption?.token || nsOption?.label || '';\n const uuidPattern = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n if (ns === '__ALL__' || (nsToken || '').toUpperCase() === '__ALL__') {\n return rawInput;\n }\n if (!nsToken || uuidPattern.test(nsToken)) {\n return rawInput;\n }\n\n return `${nsToken}.${rawInput}`;\n }\n\n #renderGhost() {\n // Ghost overlay is disabled - it interferes with the input\n // The namespace select already provides visual context\n if (this.ghost) {\n this.ghost.style.display = 'none';\n }\n }\n\n #positionDropdown() {\n if (!this.dropdown || !this.root) return;\n const wrapper = this.root.querySelector('.twm-autocomplete-field__input-wrapper');\n if (!wrapper) return;\n const rect = wrapper.getBoundingClientRect();\n this._lastDropdownRect = rect;\n const viewportWidth = document.documentElement.clientWidth || window.innerWidth;\n const viewportHeight = document.documentElement.clientHeight || window.innerHeight;\n const width = Math.min(rect.width, viewportWidth - rect.left - 8);\n const maxHeight = Math.max(120, viewportHeight - rect.bottom - 12);\n Object.assign(this.dropdown.style, {\n position: 'fixed',\n top: `${rect.bottom}px`,\n left: `${rect.left}px`,\n width: `${width}px`,\n maxWidth: `${width}px`,\n maxHeight: `${maxHeight}px`,\n });\n }\n\n dispose() {\n // Close dropdown before cleanup\n this.#close();\n this._disposers.forEach((fn) => {\n try { fn(); } catch (e) { /* ignore */ }\n });\n this._disposers = [];\n // Remove dropdown from body since we appended it there\n if (this.dropdown && this.dropdown.parentNode) {\n this.dropdown.parentNode.removeChild(this.dropdown);\n }\n this.root = null;\n this.input = null;\n this.dropdown = null;\n this.helperEl = null;\n }\n}\n", "/**\n * Computing Status Window\n *\n * Lightweight ManagedWindow that shows a spinner and status message\n * while a long-running computation is in progress. Returns a handle\n * with update() and close() methods.\n *\n * Optionally shows a Cancel button when an onCancel callback is provided.\n */\n\nimport { ManagedWindow } from './managed_window.js';\n\nlet _activeWindow = null;\n\n/**\n * Show a computing status window.\n * @param {Object} options\n * @param {string} [options.title='Computing...'] - Window title\n * @param {string} [options.message=''] - Status message below spinner\n * @param {string} [options.icon='hourglass_top'] - Material icon name\n * @param {Function} [options.onCancel] - If provided, shows a Cancel button. Called once when clicked.\n * @returns {{ update(msg: string): void, close(): void }}\n */\nexport function showComputingWindow({ title = 'Computing...', message = '', icon = 'hourglass_top', onCancel } = {}) {\n if (_activeWindow) {\n _activeWindow.close();\n _activeWindow = null;\n }\n\n const content = document.createElement('div');\n content.className = 'twm-computing-status';\n content.innerHTML = `\n <div class=\"twm-computing-status__spinner\"></div>\n <div class=\"twm-computing-status__message\">${message}</div>\n `;\n\n if (typeof onCancel === 'function') {\n const btn = document.createElement('button');\n btn.className = 'twm-computing-status__cancel-btn';\n btn.textContent = 'Cancel';\n btn.addEventListener('click', () => {\n btn.disabled = true;\n const msgEl = content.querySelector('.twm-computing-status__message');\n if (msgEl) msgEl.textContent = 'Cancelling...';\n onCancel();\n }, { once: true });\n content.appendChild(btn);\n }\n\n _activeWindow = new ManagedWindow({\n id: 'computing-status-window',\n title,\n icon,\n content,\n minWidth: 320,\n minHeight: 140,\n defaultWidth: 380,\n defaultHeight: onCancel ? 190 : 160,\n canMinimize: true,\n canMaximize: false,\n canResize: false,\n canDrag: true,\n modal: false,\n onClose: () => { _activeWindow = null; },\n });\n\n _activeWindow.show();\n\n return {\n update(msg) {\n const el = content.querySelector('.twm-computing-status__message');\n if (el) el.textContent = msg;\n },\n close() {\n if (_activeWindow) {\n _activeWindow.close();\n _activeWindow = null;\n }\n },\n };\n}\n", "/**\n * Confirm Dialog Component\n * Location: ui/components/confirm_dialog.js\n *\n * Thin delegator over the canonical modal helpers in\n * `ecoagent/ui/modal.js`. Every dialog signature here is preserved so\n * the 10+ call sites across notebook/data/results/ai pages keep\n * working unchanged; under the hood, all four standard dialogs now\n * flow through `openConfirm` / `openForm` / `openModal` so they\n * inherit the TUI styling (`\u25B8 TITLE` strip, accent-blue primary\n * action, square frame, Tab focus trap).\n *\n * The one custom case is `showRunProgressDialog`, which exposes an\n * imperative `update / complete / cancelled / close` API and so\n * stays as a direct `ManagedWindow` build \u2014 but it still benefits\n * from the focus trap + chrome by virtue of `modal: true`.\n */\n\nimport { ManagedWindow } from './managed_window.js';\nimport {\n openConfirm, openForm, openModal,\n} from './modal.js';\n\n// Counter \u2014 used only by showRunProgressDialog which still builds its\n// own ManagedWindow. The migrated helpers don't need it.\nlet dialogIdCounter = 0;\n\n/**\n * Show a confirmation dialog. Delegates to `openConfirm`.\n * @param {Object} options\n * @param {string} options.title\n * @param {string} options.message\n * @param {string} [options.icon='warning']\n * @param {string} [options.okLabel='OK']\n * @param {string} [options.cancelLabel='Cancel']\n * @param {string} [options.okVariant='primary'] - 'primary' or 'danger'\n * @returns {Promise<boolean>}\n */\nexport async function showConfirmDialog(options = {}) {\n const {\n title = 'Confirm',\n message = 'Are you sure?',\n icon = 'warning',\n okLabel = 'OK',\n cancelLabel = 'Cancel',\n okVariant = 'primary',\n } = options;\n return openConfirm({\n title,\n message,\n icon,\n confirmLabel: okLabel,\n cancelLabel,\n danger: okVariant === 'danger',\n });\n}\n\n/**\n * Show a delete-confirmation dialog. Always danger-styled.\n * @returns {Promise<boolean>}\n */\nexport async function showDeleteConfirmDialog(options = {}) {\n const {\n itemName = '',\n itemType = 'item',\n additionalMessage = '',\n } = options;\n let message = `Delete ${itemType}`;\n if (itemName) message += ` \"${itemName}\"`;\n message += '?';\n if (additionalMessage) message += `<br><br>${escapeHtml(additionalMessage)}`;\n return openConfirm({\n title: `Delete ${capitalize(itemType)}`,\n message,\n icon: 'delete',\n confirmLabel: 'Delete',\n cancelLabel: 'Cancel',\n danger: true,\n });\n}\n\n/**\n * Show a close-confirmation dialog.\n * @returns {Promise<boolean>}\n */\nexport async function showCloseConfirmDialog(options = {}) {\n const {\n itemName = '',\n itemType = 'tab',\n } = options;\n let message = `Close ${itemType}`;\n if (itemName) message += ` \"${itemName}\"`;\n message += '?';\n return openConfirm({\n title: `Close ${capitalize(itemType)}`,\n message,\n icon: 'close',\n confirmLabel: 'Close',\n cancelLabel: 'Cancel',\n });\n}\n\n/**\n * Show a dialog with multiple action buttons. Delegates to `openModal`\n * so each action maps to a button in the canonical footer.\n * @returns {Promise<string|null>}\n */\nexport async function showChoiceDialog(options = {}) {\n const {\n title = 'Choose',\n message = '',\n icon = 'warning',\n actions = [],\n } = options;\n const content = document.createElement('div');\n content.className = 'twm-confirm-dialog__body';\n content.innerHTML = `\n <span class=\"twm-confirm-dialog__icon material-symbols-outlined\">${escapeHtml(icon)}</span>\n <div class=\"twm-confirm-dialog__message\">${escapeHtml(message)}</div>\n `;\n return openModal({\n title,\n icon,\n content,\n width: 480,\n height: 220,\n actions: actions.map((a) => ({\n label: a.label,\n value: a.value,\n primary: a.variant === 'primary',\n danger: a.variant === 'danger',\n })),\n });\n}\n\n/**\n * Show a dialog with a dropdown select + OK/Cancel. Delegates to\n * `openForm` with a single select field.\n * @returns {Promise<string|null>}\n */\nexport async function showSelectDialog(options = {}) {\n const {\n title = 'Select',\n message = '',\n items = [],\n okLabel = 'OK',\n cancelLabel = 'Cancel',\n } = options;\n const fields = [];\n if (message) {\n fields.push({ section: message });\n }\n fields.push({\n name: '_choice',\n label: 'Choice',\n type: 'select',\n default: items[0]?.value || '',\n options: items.map((i) => ({ value: i.value, label: i.label })),\n });\n // NB: cancelLabel is currently hardcoded as \"Cancel\" on openForm.\n // openConfirm has cancelLabel; if a caller really needs custom\n // cancel text on openForm, we'd extend openForm there. The\n // explicit no-op suppresses the unused-arg lint.\n void cancelLabel;\n const data = await openForm({\n title,\n submitLabel: okLabel,\n fields,\n });\n if (!data) return null;\n return data._choice;\n}\n\n\n// \u2500\u2500\u2500 helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction escapeHtml(str) {\n if (!str) return '';\n return String(str)\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;');\n}\n\nfunction capitalize(str) {\n if (!str) return '';\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n\n// \u2500\u2500\u2500 showRunProgressDialog (unchanged custom build) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n//\n// This one exposes an imperative API (`update`, `complete`, `cancelled`,\n// `close`) that the openModal/openForm/openConfirm helpers don't model\n// \u2014 they're one-shot promise-returning. Keep the direct ManagedWindow\n// build, but it still gets the TUI chrome + focus trap for free via\n// `modal: true`.\n\n/**\n * Show a run progress dialog with spinner, live message updates, and\n * final status. Returns a control object \u2014 keep this build instead of\n * delegating so callers retain the imperative update / complete API.\n * @returns {{ update(msg: string): void, complete(result: {ok: boolean, message: string}): void, cancelled(msg?: string): void, close(): void }}\n */\nexport function showRunProgressDialog(options = {}) {\n const {\n title = 'Running Pipeline',\n message = 'Starting\u2026',\n onCancel,\n } = options;\n\n const dialogId = `run-progress-${++dialogIdCounter}`;\n let finished = false;\n\n const contentEl = document.createElement('div');\n contentEl.className = 'twm-confirm-dialog__content run-progress';\n\n const bodyEl = document.createElement('div');\n bodyEl.className = 'twm-run-progress__body';\n bodyEl.innerHTML = `\n <div class=\"twm-run-progress__spinner\"></div>\n <div class=\"twm-run-progress__message\">${escapeHtml(message)}</div>\n `;\n contentEl.appendChild(bodyEl);\n\n let stopBtn = null;\n if (typeof onCancel === 'function') {\n const stopActionsEl = document.createElement('div');\n stopActionsEl.className = 'twm-confirm-dialog__actions twm-run-progress__stop-actions';\n stopBtn = document.createElement('button');\n stopBtn.type = 'button';\n stopBtn.className = 'twm-confirm-dialog__btn twm-run-progress__stop-btn';\n stopBtn.innerHTML = '<span class=\"material-symbols-outlined\">stop</span> Stop';\n stopBtn.addEventListener('click', () => {\n stopBtn.disabled = true;\n stopBtn.innerHTML = '<span class=\"material-symbols-outlined\">hourglass_top</span> Stopping\u2026';\n onCancel();\n });\n stopActionsEl.appendChild(stopBtn);\n contentEl.appendChild(stopActionsEl);\n }\n\n const actionsEl = document.createElement('div');\n actionsEl.className = 'twm-confirm-dialog__actions';\n actionsEl.style.display = 'none';\n\n const closeBtn = document.createElement('button');\n closeBtn.type = 'button';\n closeBtn.className = 'twm-confirm-dialog__btn twm-confirm-dialog__btn--primary';\n closeBtn.textContent = 'Close';\n closeBtn.addEventListener('click', () => dialogWindow.close());\n actionsEl.appendChild(closeBtn);\n contentEl.appendChild(actionsEl);\n\n const dialogWindow = new ManagedWindow({\n id: dialogId,\n title,\n icon: 'play_arrow',\n content: contentEl,\n minWidth: 320,\n minHeight: 120,\n defaultWidth: 420,\n defaultHeight: 200,\n canMinimize: false,\n canMaximize: false,\n canResize: false,\n canDrag: false,\n modal: true,\n });\n dialogWindow.show();\n\n const messageEl = bodyEl.querySelector('.twm-run-progress__message');\n const spinnerEl = bodyEl.querySelector('.twm-run-progress__spinner');\n\n return {\n update(msg) {\n if (finished || !messageEl) return;\n messageEl.textContent = msg;\n },\n complete(result) {\n if (finished) return;\n finished = true;\n if (spinnerEl) spinnerEl.style.display = 'none';\n if (stopBtn) stopBtn.parentElement.style.display = 'none';\n if (messageEl) {\n messageEl.textContent = result?.message || '';\n messageEl.className = `twm-run-progress__message ${result?.ok ? 'is-ok' : 'is-err'}`;\n }\n actionsEl.style.display = '';\n },\n cancelled(msg) {\n if (finished) return;\n finished = true;\n if (spinnerEl) spinnerEl.style.display = 'none';\n if (stopBtn) stopBtn.parentElement.style.display = 'none';\n if (messageEl) {\n messageEl.textContent = msg || 'Cancelled.';\n messageEl.className = 'twm-run-progress__message is-cancelled';\n }\n actionsEl.style.display = '';\n },\n close() {\n try { dialogWindow.close(); } catch { /* already closed */ }\n },\n };\n}\n", "/**\n * InlineRenamer (js_new)\n * Minimal inline editing helper used by node labels and scenario titles.\n * Attaches an input on demand, commits through provided callback, and cleans up deterministically.\n */\n\nfunction assertLabel(label) {\n if (!label || typeof label.appendChild !== 'function') {\n throw new Error('[InlineRenamer] options.label must be an HTMLElement');\n }\n}\n\nfunction buildInput(label, options) {\n const input = document.createElement('input');\n input.type = 'text';\n input.className = ['twm-node-edit-input', options?.inputClass || ''].join(' ').trim();\n input.placeholder = options?.placeholder || label.textContent || 'Name';\n input.value = options?.initialValue ?? label.textContent ?? '';\n input.spellcheck = false;\n input.autocomplete = 'off';\n input.setAttribute('aria-label', 'Edit name');\n return input;\n}\n\nexport function attachInlineRenamer(options = {}) {\n const label = options.label;\n assertLabel(label);\n\n let input = null;\n let editing = false;\n let destroyed = false;\n let originalText = label.textContent || '';\n\n const cleanup = () => {\n if (input && input.parentNode === label) {\n input.remove();\n }\n input = null;\n editing = false;\n };\n\n const cancel = () => {\n if (destroyed) return;\n cleanup();\n label.textContent = originalText;\n options.onCancel?.({ value: originalText });\n };\n\n const commit = async (reason = 'commit') => {\n if (destroyed || !input) return;\n const raw = input.value;\n let next = raw;\n try {\n next = options.transformInput ? options.transformInput(raw, { reason }) : raw;\n } catch (err) {\n window.logger?.warn('inline-renamer', 'transformInput failed', err);\n }\n\n try {\n const result = (await options.onCommit?.(next, { reason })) || {};\n if (result.success === false) {\n if (result.keepEditing) {\n input.focus();\n input.select();\n return;\n }\n cancel();\n return;\n }\n const finalValue = result.newValue ?? next ?? '';\n label.textContent = finalValue;\n cleanup();\n options.onFinish?.({ value: finalValue });\n } catch (err) {\n window.logger?.warn('inline-renamer', 'onCommit failed', err);\n cancel();\n }\n };\n\n const start = (triggerEvent = null) => {\n if (destroyed || editing) return;\n editing = true;\n originalText = label.textContent || '';\n label.textContent = '';\n input = buildInput(label, { ...options, initialValue: originalText });\n label.appendChild(input);\n\n const stopEvents = (ev) => ev.stopPropagation();\n input.addEventListener('mousedown', stopEvents);\n input.addEventListener('click', stopEvents);\n\n input.addEventListener('keydown', (ev) => {\n if (ev.key === 'Enter') {\n ev.preventDefault();\n commit('enter');\n } else if (ev.key === 'Escape') {\n ev.preventDefault();\n cancel();\n }\n });\n\n input.addEventListener('blur', () => commit('blur'));\n\n options.onStart?.({ value: originalText, triggerEvent });\n setTimeout(() => {\n input?.focus();\n input?.select?.();\n }, 0);\n };\n\n const destroy = () => {\n destroyed = true;\n cleanup();\n };\n\n return { start, cancel, commit, destroy };\n}\n\n// `window.InlineRenamer` used to be installed here, at module scope, \"for existing\n// callers\". There are none: every caller in the tree \u2014 EcoAgent's and the\n// library's \u2014 uses the `attachInlineRenamer` named export. It was a global that\n// nothing read.\n//\n// It also made this module UNIMPORTABLE outside a browser, because the assignment\n// ran on import. That is how it was found: a node test that does nothing but\n// `import '@flexdesk/widgets'` died with `ReferenceError: window is not defined`. A\n// library whose entry point cannot be imported without a DOM is a library that\n// cannot be unit-tested, server-rendered, or loaded in a worker \u2014 and\n// package.json's `\"sideEffects\": [\"*.css\"]` was a lie while this line existed.\n", "/**\n * DetailHeader \u2014 shared header bar for detail views.\n *\n * Usage:\n * import { createDetailHeader, updateDetailHeader } from '../ui/components/detail_header.js';\n *\n * const header = createDetailHeader({\n * title: 'My Scenario',\n * badges: [{ text: 'Static' }],\n * renameable: true,\n * onRename: async (name) => ({ success: true }),\n * actions: [\n * { key: 'run', label: 'Run', icon: 'play_arrow', variant: 'primary', handler: () => {} },\n * { key: 'delete', label: 'Delete', icon: 'delete', variant: 'danger', handler: () => {} },\n * ],\n * });\n * container.appendChild(header);\n *\n * To update in place (e.g., running state changed):\n * updateDetailHeader(header, { ...newConfig });\n */\n\nimport { attachInlineRenamer } from './inline_renamer.js';\n\nconst ESC = (s) => String(s ?? '').replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n\n/**\n * @typedef {Object} DetailHeaderBadge\n * @property {string} text\n * @property {string} [className] - Extra CSS modifier (e.g., 'detail-header__badge--mc')\n * @property {string} [icon] - Material Symbols icon name\n */\n\n/**\n * @typedef {Object} DetailHeaderAction\n * @property {string} key - data-action value\n * @property {string} label - Button text\n * @property {string} icon - Material Symbols icon name\n * @property {'primary'|'secondary'|'danger'} [variant='secondary']\n * @property {boolean} [disabled=false]\n * @property {string} [title] - Tooltip\n * @property {Function} handler - Click callback\n */\n\n/**\n * @typedef {Object} DetailHeaderConfig\n * @property {string} title\n * @property {string} [subtitle]\n * @property {string} [icon] - Material icon before title\n * @property {DetailHeaderBadge[]} [badges]\n * @property {DetailHeaderAction[]} [actions]\n * @property {HTMLElement[]} [extraElements] - Custom elements appended to actions area\n * @property {boolean} [renameable=false]\n * @property {Function} [onRename] - (newName) => Promise<{success, newValue?}>\n */\n\n/**\n * Create a detail header element.\n * @param {DetailHeaderConfig} config\n * @returns {HTMLElement}\n */\nexport function createDetailHeader(config) {\n const header = document.createElement('header');\n header.className = 'twm-detail-header';\n _populate(header, config);\n return header;\n}\n\n/**\n * Update an existing detail header in place.\n * Destroys previous inline renamer and rebuilds inner DOM.\n * @param {HTMLElement} headerEl\n * @param {DetailHeaderConfig} config\n */\nexport function updateDetailHeader(headerEl, config) {\n // Destroy previous renamer if any\n headerEl._renamer?.destroy();\n headerEl._renamer = null;\n headerEl.innerHTML = '';\n _populate(headerEl, config);\n}\n\n// \u2500\u2500\u2500 Internal \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction _populate(header, config) {\n const { title, subtitle, icon, badges = [], actions = [], extraElements = [], renameable = false, onRename } = config;\n\n // Title row\n const titleRow = document.createElement('div');\n titleRow.className = 'twm-detail-header__title-row';\n\n if (icon) {\n const iconEl = document.createElement('span');\n iconEl.className = 'twm-detail-header__icon material-symbols-outlined';\n iconEl.textContent = icon;\n titleRow.appendChild(iconEl);\n }\n\n const nameEl = document.createElement('h2');\n nameEl.className = 'twm-detail-header__name';\n nameEl.textContent = title || '';\n if (renameable) {\n nameEl.dataset.renameable = '';\n nameEl.title = 'Double-click to rename';\n }\n titleRow.appendChild(nameEl);\n\n for (const badge of badges) {\n const badgeEl = document.createElement('span');\n badgeEl.className = `detail-header__badge${badge.className ? ` ${badge.className}` : ''}`;\n if (badge.icon) {\n const bi = document.createElement('span');\n bi.className = 'material-symbols-outlined';\n bi.textContent = badge.icon;\n badgeEl.appendChild(bi);\n }\n badgeEl.appendChild(document.createTextNode(badge.text));\n titleRow.appendChild(badgeEl);\n }\n\n header.appendChild(titleRow);\n\n // Subtitle\n if (subtitle) {\n const sub = document.createElement('div');\n sub.className = 'twm-detail-header__subtitle';\n sub.innerHTML = subtitle; // may contain <strong> etc.\n header.appendChild(sub);\n }\n\n // Actions\n if (actions.length > 0 || extraElements.length > 0) {\n const actionsEl = document.createElement('div');\n actionsEl.className = 'twm-detail-header__actions';\n\n for (const extra of extraElements) {\n actionsEl.appendChild(extra);\n }\n\n for (const action of actions) {\n const btn = document.createElement('button');\n btn.type = 'button';\n const variant = action.variant || 'secondary';\n btn.className = `twm-detail-header__btn detail-header__btn--${variant}`;\n btn.dataset.action = action.key;\n if (action.disabled) btn.disabled = true;\n if (action.title) btn.title = action.title;\n\n const iconSpan = document.createElement('span');\n iconSpan.className = 'material-symbols-outlined';\n iconSpan.textContent = action.icon;\n btn.appendChild(iconSpan);\n btn.appendChild(document.createTextNode(` ${action.label}`));\n\n btn.addEventListener('click', () => action.handler?.());\n actionsEl.appendChild(btn);\n }\n\n header.appendChild(actionsEl);\n }\n\n // Inline rename\n if (renameable && onRename) {\n const renamer = attachInlineRenamer({\n label: nameEl,\n onCommit: async (newName) => {\n if (!newName?.trim()) return { success: false };\n return await onRename(newName.trim());\n },\n });\n nameEl.addEventListener('dblclick', (e) => {\n e.stopPropagation();\n renamer.start(e);\n });\n header._renamer = renamer;\n }\n}\n", "/**\n * gallery_picker.js \u2014 single-select card grid for the starter catalog.\n *\n * G1.3 in docs/STARTER_GALLERY_REQUIREMENTS.md. Used by every\n * \"New X\" modal to let the user pick a starter shape (formerly\n * called a \"template\"). The picker is mounted into a host element\n * and fires `onChange(entry)` whenever the selection changes.\n *\n * Each entry is the raw gallery dict from `pywebview.api.gallery_list`:\n *\n * { id, kind, label, description, fields }\n *\n * The picker shows label + description as a card. `fields` is\n * passed through to the caller untouched on select \u2014 the New-X\n * handler decides what to do with it.\n *\n * Usage:\n *\n * const picker = await mountGalleryPicker(hostEl, {\n * kind: 'agent',\n * selectedId: 'blank',\n * onChange: (entry) => { \u2026 },\n * });\n *\n * // later \u2026\n * picker.getSelected(); // \u2192 { id, kind, label, description, fields }\n * picker.dispose();\n */\n\nfunction esc(s) {\n return String(s ?? '').replace(/[&<>\"']/g, (c) => ({\n '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;',\n }[c]));\n}\n\n\n/**\n * Mount a starter-gallery picker into `hostEl`.\n *\n * @param {HTMLElement} hostEl\n * @param {object} opts\n * @param {string} opts.kind \u2014 gallery entries to load (e.g. 'agent').\n * When undefined, every kind shows up.\n * @param {string} [opts.selectedId] \u2014 id to pre-select. If absent, the\n * first entry wins.\n * @param {function} [opts.onChange] \u2014 `(entry) => void` fired on selection\n * change AND on initial mount.\n * @param {object[]} [opts.entries] \u2014 explicit entries (skips bridge fetch).\n * Useful for tests + offline previews.\n * @param {string} [opts.emptyLabel] \u2014 copy shown when the catalog is empty\n * for that kind.\n * @returns {Promise<{getSelected, setSelectedById, dispose}>}\n */\nexport async function mountGalleryPicker(hostEl, opts = {}) {\n const {\n kind = null,\n selectedId = null,\n onChange = () => {},\n entries = null,\n emptyLabel = 'No starters available for this kind.',\n } = opts;\n if (!hostEl) throw new Error('mountGalleryPicker: hostEl is required');\n\n let catalog = entries;\n if (!catalog) {\n const api = window.pywebview?.api;\n try {\n catalog = (await api?.gallery_list?.(kind)) || [];\n } catch (err) {\n console.warn('[gallery-picker] gallery_list failed', err);\n catalog = [];\n }\n }\n catalog = Array.isArray(catalog) ? catalog : [];\n\n hostEl.classList.add('twm-gallery-picker');\n if (catalog.length === 0) {\n hostEl.innerHTML = `<div class=\"twm-gallery-picker__empty\">${esc(emptyLabel)}</div>`;\n return {\n getSelected: () => null,\n setSelectedById: () => false,\n dispose: () => { hostEl.classList.remove('twm-gallery-picker'); },\n };\n }\n\n let selected = catalog.find((e) => e?.id === selectedId)\n || catalog[0];\n\n const render = () => {\n hostEl.innerHTML = catalog.map((e, i) => {\n const isSel = e === selected;\n const desc = e?.description\n ? `<p class=\"twm-gallery-card__desc\">${esc(e.description)}</p>`\n : '';\n return `\n <button type=\"button\"\n class=\"twm-gallery-card ${isSel ? 'is-selected' : ''}\"\n data-idx=\"${i}\"\n title=\"${esc(e?.id || '')}\">\n <span class=\"twm-gallery-card__label\">${esc(e?.label || e?.id || '')}</span>\n ${desc}\n </button>\n `;\n }).join('');\n };\n render();\n\n const onClick = (ev) => {\n const card = ev.target.closest?.('.twm-gallery-card');\n if (!card || !hostEl.contains(card)) return;\n const idx = Number(card.dataset.idx);\n const next = catalog[idx];\n if (!next || next === selected) return;\n selected = next;\n render();\n try { onChange(selected); } catch (err) {\n console.warn('[gallery-picker] onChange threw', err);\n }\n };\n hostEl.addEventListener('click', onClick);\n\n // Fire the initial selection so the caller can prime any\n // downstream UI (preview pane, defaults, etc.) without a\n // special case for first-render.\n try { onChange(selected); } catch (err) {\n console.warn('[gallery-picker] initial onChange threw', err);\n }\n\n return {\n getSelected: () => (selected ? { ...selected } : null),\n setSelectedById: (id) => {\n const next = catalog.find((e) => e?.id === id);\n if (!next || next === selected) return false;\n selected = next;\n render();\n try { onChange(selected); } catch (err) {\n console.warn('[gallery-picker] onChange threw', err);\n }\n return true;\n },\n dispose: () => {\n hostEl.removeEventListener('click', onClick);\n hostEl.innerHTML = '';\n hostEl.classList.remove('twm-gallery-picker');\n },\n };\n}\n", "/**\n * NotificationHistory - Bottom bar notification history panel\n *\n * Bell icon in the global-bottom-bar that opens a popover listing past notifications.\n * Reads from NotificationCenter.history (no modifications to NotificationCenter needed).\n * Tracks unread count via lastSeenCount delta and updates a badge on the bell icon.\n */\n\nexport class NotificationHistory {\n constructor({ notificationCenter, eventBus, logger } = {}) {\n this.notificationCenter = notificationCenter;\n this.eventBus = eventBus || null;\n this.logger = logger || console;\n\n this.triggerEl = null;\n this.badgeEl = null;\n this.lastSeenCount = 0;\n this._popoverCleanup = null;\n this._subscriptions = [];\n }\n\n mount() {\n const barRight = document.querySelector('.twm-global-bottom-bar .twm-bar-right');\n if (!barRight) {\n this.logger.warn?.('[NotificationHistory] .bar-right not found');\n return;\n }\n\n // Build trigger button\n this.triggerEl = document.createElement('button');\n this.triggerEl.className = 'twm-notification-history__trigger twm-has-tooltip';\n this.triggerEl.setAttribute('data-tooltip', 'Notification history');\n this.triggerEl.setAttribute('aria-label', 'Notification history');\n this.triggerEl.innerHTML =\n '<span class=\"material-symbols-outlined\">notifications</span>' +\n '<span class=\"twm-notification-history__badge\" style=\"display:none\">0</span>';\n\n this.badgeEl = this.triggerEl.querySelector('.twm-notification-history__badge');\n\n // Park the bell as the LAST child of .bar-right so it always\n // sits at the far-right edge of the status bar \u2014 past the\n // tick readout, streaming dot, and anything else that the\n // global actions cluster mounts before it.\n barRight.appendChild(this.triggerEl);\n\n this.triggerEl.addEventListener('click', (e) => {\n e.stopPropagation();\n this.#togglePanel();\n });\n\n // Sync initial count so existing history doesn't show as unread\n this.lastSeenCount = this.notificationCenter?.history?.length ?? 0;\n\n this.#subscribeEvents();\n }\n\n unmount() {\n this.#closePanel();\n this._subscriptions.forEach(unsub => {\n if (typeof unsub === 'function') unsub();\n });\n this._subscriptions = [];\n if (this.triggerEl?.parentNode) {\n this.triggerEl.parentNode.removeChild(this.triggerEl);\n }\n this.triggerEl = null;\n this.badgeEl = null;\n }\n\n #subscribeEvents() {\n if (!this.eventBus) return;\n\n // Update badge whenever a new notification comes in\n const badgeUpdate = () => queueMicrotask(() => this.#updateBadge());\n const events = ['toast:show', 'notification:show', 'log:entry',\n 'workspace:save:failed', 'workspace:import:failed'];\n\n events.forEach(name => {\n this.eventBus.on(name, badgeUpdate);\n this._subscriptions.push(() => this.eventBus.off(name, badgeUpdate));\n });\n }\n\n #updateBadge() {\n const historyLen = this.notificationCenter?.history?.length ?? 0;\n const unread = Math.max(0, historyLen - this.lastSeenCount);\n\n if (!this.badgeEl) return;\n\n if (unread > 0) {\n this.badgeEl.textContent = unread > 99 ? '99+' : String(unread);\n this.badgeEl.style.display = '';\n } else {\n this.badgeEl.style.display = 'none';\n }\n }\n\n #togglePanel() {\n if (this._popoverCleanup) {\n this.#closePanel();\n } else {\n this.#openPanel();\n }\n }\n\n #closePanel() {\n if (typeof this._popoverCleanup === 'function') {\n try { this._popoverCleanup(); } catch (_) { /* ignore */ }\n this._popoverCleanup = null;\n }\n }\n\n #openPanel() {\n this.#closePanel();\n\n // Mark all as seen\n this.lastSeenCount = this.notificationCenter?.history?.length ?? 0;\n this.#updateBadge();\n\n const panel = document.createElement('div');\n panel.className = 'twm-notification-history__panel';\n\n // Header\n const header = document.createElement('div');\n header.className = 'twm-notification-history__header';\n header.innerHTML =\n '<span class=\"twm-notification-history__title\">Notifications</span>' +\n '<button class=\"twm-notification-history__clear-btn twm-has-tooltip\" data-tooltip=\"Clear all\" aria-label=\"Clear all\">' +\n '<span class=\"material-symbols-outlined\">delete_sweep</span>' +\n '</button>' +\n '<button class=\"twm-notification-history__close-btn twm-has-tooltip\" data-tooltip=\"Close\" aria-label=\"Close\">' +\n '<span class=\"material-symbols-outlined\">close</span>' +\n '</button>';\n panel.appendChild(header);\n\n // List\n const list = document.createElement('div');\n list.className = 'twm-notification-history__list';\n panel.appendChild(list);\n\n this.#renderList(list);\n\n // Wire header buttons\n header.querySelector('.twm-notification-history__close-btn')\n .addEventListener('click', () => this.#closePanel());\n\n header.querySelector('.twm-notification-history__clear-btn')\n .addEventListener('click', () => {\n this.notificationCenter.history.splice(0);\n this.lastSeenCount = 0;\n this.#updateBadge();\n this.#renderList(list);\n });\n\n // Position and attach\n document.body.appendChild(panel);\n this.#positionPanel(panel);\n\n // Popover lifecycle (same pattern as ValidationStatus)\n const cleanup = () => {\n document.removeEventListener('mousedown', onDocDown, true);\n document.removeEventListener('keydown', onKey, true);\n window.removeEventListener('resize', onResize, true);\n try { panel.remove(); } catch (_) { /* ignore */ }\n this._popoverCleanup = null;\n };\n this._popoverCleanup = cleanup;\n\n const onDocDown = (ev) => {\n if (!panel.contains(ev.target) && !this.triggerEl.contains(ev.target)) cleanup();\n };\n const onKey = (ev) => { if (ev.key === 'Escape') cleanup(); };\n const onResize = () => cleanup();\n\n document.addEventListener('mousedown', onDocDown, true);\n document.addEventListener('keydown', onKey, true);\n window.addEventListener('resize', onResize, true);\n }\n\n #renderList(listEl) {\n listEl.innerHTML = '';\n const history = this.notificationCenter?.history ?? [];\n\n if (history.length === 0) {\n const empty = document.createElement('div');\n empty.className = 'twm-notification-history__empty';\n empty.textContent = 'No notifications';\n listEl.appendChild(empty);\n return;\n }\n\n // Reverse chronological\n const fragment = document.createDocumentFragment();\n for (let i = history.length - 1; i >= 0; i--) {\n const entry = history[i];\n const item = document.createElement('div');\n const severity = entry.severity || 'info';\n item.className = `twm-notification-history__item notification-history__item--${severity}`;\n\n const itemHeader = document.createElement('div');\n itemHeader.className = 'twm-notification-history__item-header';\n\n if (entry.title) {\n const titleEl = document.createElement('span');\n titleEl.className = 'twm-notification-history__item-title';\n titleEl.textContent = entry.title;\n itemHeader.appendChild(titleEl);\n }\n\n const timeEl = document.createElement('span');\n timeEl.className = 'twm-notification-history__item-time';\n timeEl.textContent = this.#formatTime(entry.timestamp);\n itemHeader.appendChild(timeEl);\n\n item.appendChild(itemHeader);\n\n const body = document.createElement('div');\n body.className = 'twm-notification-history__item-body';\n body.textContent = entry.message || '';\n item.appendChild(body);\n\n fragment.appendChild(item);\n }\n listEl.appendChild(fragment);\n }\n\n #positionPanel(panel) {\n if (!this.triggerEl) return;\n\n const triggerRect = this.triggerEl.getBoundingClientRect();\n const panelWidth = panel.getBoundingClientRect().width;\n const gap = 8;\n\n let left = triggerRect.right - panelWidth;\n\n // Clamp horizontally to the viewport.\n const vw = window.innerWidth;\n left = Math.max(8, Math.min(left, vw - panelWidth - 8));\n\n // Anchor by the panel's BOTTOM edge, pinned just above the bell.\n // Anchoring by `top` leaves the box floating when its content shrinks\n // (notifications cleared/removed): the top stays put while the bottom\n // lifts away from the bell, stranding the panel in mid-air. Pinning\n // the bottom keeps it glued to the bottom bar and lets it grow/shrink\n // upward \u2014 no repositioning needed on re-render.\n const bottom = window.innerHeight - (triggerRect.top - gap);\n\n // Never let the panel run off the top of the viewport: cap its height\n // to the space above the bell (within the design max). The list\n // scrolls within whatever remains.\n const available = triggerRect.top - gap - 8;\n panel.style.maxHeight = `${Math.max(0, Math.min(420, Math.round(available)))}px`;\n\n panel.style.left = `${Math.round(left)}px`;\n panel.style.bottom = `${Math.round(bottom)}px`;\n panel.style.top = 'auto';\n }\n\n #formatTime(timestamp) {\n if (!timestamp) return '';\n const d = new Date(timestamp);\n return d.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', second: '2-digit' });\n }\n}\n", "/**\n * SlideOutPanel\n *\n * Reusable inline slide-out config panel that overlays its host container\n * from the right edge. Used by pages to show element-specific config\n * (plot config, widget config, ETL node config) without the global right panel.\n *\n * Host container must have `position: relative; overflow: hidden`.\n */\nimport { ComponentBase } from '../base/component_base.js';\n\nexport class SlideOutPanel extends ComponentBase {\n\n /** @type {HTMLElement} */ #container = null;\n /** @type {HTMLElement} */ #backdrop = null;\n /** @type {HTMLElement} */ #panel = null;\n /** @type {HTMLElement} */ #headerIcon = null;\n /** @type {HTMLElement} */ #headerTitle = null;\n /** @type {HTMLElement} */ #body = null;\n /** @type {number} */ #width;\n /** @type {Function|null} */#onClose;\n /** @type {boolean} */ #open = false;\n\n /**\n * @param {object} opts\n * @param {number} [opts.width=380] Panel width in px.\n * @param {Function} [opts.onClose] Called after the panel closes.\n */\n constructor({ width = 700, onClose } = {}) {\n super();\n this.#width = width;\n this.#onClose = onClose ?? null;\n }\n\n // \u2500\u2500\u2500 Lifecycle \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /**\n * Mount the panel DOM into a host container.\n * @param {HTMLElement} container Must have position:relative; overflow:hidden.\n */\n mount(container) {\n if (this._mounted) return;\n this.#container = container;\n\n // Backdrop (transparent click-catcher)\n this.#backdrop = document.createElement('div');\n this.#backdrop.className = 'twm-slide-out-panel__backdrop';\n this.#backdrop.addEventListener('click', this.#handleBackdropClick);\n\n // Panel\n this.#panel = document.createElement('div');\n this.#panel.className = 'twm-slide-out-panel';\n this.#panel.style.width = `${this.#width}px`;\n\n // Header\n const header = document.createElement('div');\n header.className = 'twm-slide-out-panel__header';\n\n this.#headerIcon = document.createElement('span');\n this.#headerIcon.className = 'material-symbols-outlined';\n\n this.#headerTitle = document.createElement('span');\n this.#headerTitle.className = 'twm-slide-out-panel__title';\n\n const closeBtn = document.createElement('button');\n closeBtn.className = 'twm-slide-out-panel__close twm-btn-icon';\n closeBtn.type = 'button';\n closeBtn.title = 'Close';\n closeBtn.innerHTML = '<span class=\"material-symbols-outlined\">close</span>';\n closeBtn.addEventListener('click', this.#handleCloseClick);\n\n header.append(this.#headerIcon, this.#headerTitle, closeBtn);\n\n // Body (scrollable content area)\n this.#body = document.createElement('div');\n this.#body.className = 'twm-slide-out-panel__body';\n\n this.#panel.append(header, this.#body);\n this.#container.append(this.#backdrop, this.#panel);\n\n this._mounted = true;\n }\n\n dispose() {\n this.close();\n this.#backdrop?.remove();\n this.#panel?.remove();\n this.#backdrop = null;\n this.#panel = null;\n this.#body = null;\n this.#container = null;\n super.dispose();\n }\n\n // \u2500\u2500\u2500 Public API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /** The inner content element \u2014 callers render config into this. */\n get contentEl() { return this.#body; }\n\n get isOpen() { return this.#open; }\n\n /**\n * Open (or re-open) the panel with a new title/icon.\n * Clears previous content. Returns contentEl for rendering.\n * @param {string} title\n * @param {string} icon Material Symbols icon name.\n * @returns {HTMLElement} contentEl\n */\n open(title, icon) {\n if (!this._mounted) return null;\n\n this.#body.innerHTML = '';\n this.#headerIcon.textContent = icon || '';\n this.#headerIcon.style.display = icon ? '' : 'none';\n this.#headerTitle.textContent = title || '';\n\n if (!this.#open) {\n this.#open = true;\n this.#backdrop.classList.add('twm-slide-out-panel__backdrop--visible');\n this.#panel.classList.add('twm-slide-out-panel--open');\n document.addEventListener('keydown', this.#handleEsc);\n\n // The host may be a scroll container \u2014 absolutely-positioned\n // descendants of one DO scroll along with the content\n // (Web spec: a position:absolute element is clipped + offset\n // by its containing scroll context). We escape that by\n // switching the panel to `position: fixed` while open and\n // tracking the host's bounding rect on scroll / resize, so\n // the panel stays pinned to the host's visible frame at\n // full height regardless of how the user scrolls inside.\n this.#trackGeometry();\n window.addEventListener('scroll', this.#trackGeometry, true);\n window.addEventListener('resize', this.#trackGeometry);\n }\n\n return this.#body;\n }\n\n /** Close the panel and clear content. */\n close() {\n if (!this.#open) return;\n this.#open = false;\n\n this.#panel.classList.remove('twm-slide-out-panel--open');\n this.#backdrop.classList.remove('twm-slide-out-panel__backdrop--visible');\n document.removeEventListener('keydown', this.#handleEsc);\n window.removeEventListener('scroll', this.#trackGeometry, true);\n window.removeEventListener('resize', this.#trackGeometry);\n // Leave the inline position:fixed geometry in place. The panel\n // slides off-screen via the transform animation (translateX\n // 100%); the next open() re-runs #trackGeometry which will\n // refresh top/left/height from the host's current rect.\n\n this.#body.innerHTML = '';\n this.#onClose?.();\n }\n\n // \u2500\u2500\u2500 Event handlers (arrow fns for stable `this`) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n #handleBackdropClick = () => { this.close(); };\n\n #handleCloseClick = () => { this.close(); };\n\n #handleEsc = (e) => {\n if (e.key === 'Escape') {\n e.stopPropagation();\n this.close();\n }\n };\n\n /** Pin the panel to the right edge of its host's *visible* frame\n * using `position: fixed`. Re-run on every scroll/resize so the\n * panel always overlays the host correctly even when the host\n * itself sits inside a scrolled ancestor. */\n #trackGeometry = () => {\n if (!this.#open || !this.#panel || !this.#container) return;\n const r = this.#container.getBoundingClientRect();\n const s = this.#panel.style;\n s.position = 'fixed';\n s.top = `${Math.round(r.top)}px`;\n s.left = `${Math.round(r.right - this.#width)}px`;\n s.right = 'auto';\n s.height = `${Math.round(r.height)}px`;\n };\n}\n", "export class SliderField {\n constructor({ fieldId, field = {}, onChange = null, logger = null } = {}) {\n if (!fieldId) {\n throw new Error('SliderField requires a fieldId');\n }\n this.fieldId = fieldId;\n this.field = field;\n this.logger = logger;\n this.onChange = typeof onChange === 'function' ? onChange : null;\n\n this.root = null;\n this.sliderInput = null;\n this.helperEl = null;\n this.emitOnInput = Boolean(field.emitOnInput ?? field.emitsOnInput);\n this._disposers = [];\n }\n\n render() {\n if (this.root) {\n return this.root;\n }\n this.root = document.createElement('div');\n this.root.className = 'twm-slider-field';\n\n this.sliderInput = document.createElement('input');\n this.sliderInput.type = 'range';\n this.sliderInput.className = 'twm-slider-field__input';\n this.sliderInput.min = this.#coerceNumber(this.field.min, 0);\n this.sliderInput.max = this.#coerceNumber(this.field.max, 100);\n this.sliderInput.step = this.#coercePositiveNumber(this.field.step, 1);\n this.sliderInput.value = this.#coerceNumber(this.field.value, Number(this.sliderInput.min));\n if (this.field.disabled) {\n this.sliderInput.disabled = true;\n }\n\n // Prevent parent interactions from interfering with slider dragging\n // Use stopImmediatePropagation to ensure no other handlers on this element run\n // DO NOT call preventDefault - allow native slider drag behavior\n const stopDrag = (evt) => {\n evt.stopPropagation();\n evt.stopImmediatePropagation();\n };\n // Use capture phase to intercept before any parent handlers\n this.sliderInput.addEventListener('mousedown', stopDrag, { capture: true });\n this.sliderInput.addEventListener('touchstart', stopDrag, { passive: false, capture: true });\n this._disposers.push(() => this.sliderInput.removeEventListener('mousedown', stopDrag, { capture: true }));\n this._disposers.push(() => this.sliderInput.removeEventListener('touchstart', stopDrag, { passive: false, capture: true }));\n\n this.helperEl = document.createElement('div');\n this.helperEl.className = 'twm-slider-field__helper';\n if (this.field.helperText) {\n this.helperEl.textContent = this.field.helperText;\n }\n\n this.root.appendChild(this.sliderInput);\n this.root.appendChild(this.helperEl);\n\n // Throttle onInput to animation frames to avoid re-render stutter while dragging\n let rafToken = null;\n let pendingValue = null;\n const flushPending = () => {\n if (rafToken) {\n cancelAnimationFrame(rafToken);\n rafToken = null;\n }\n if (pendingValue === null) return;\n const valueToEmit = pendingValue;\n pendingValue = null;\n if (this.emitOnInput) {\n this.onChange?.(valueToEmit, { immediate: true });\n }\n };\n\n const handleInput = (event) => {\n pendingValue = event.target.value;\n if (!rafToken) {\n rafToken = requestAnimationFrame(() => {\n rafToken = null;\n flushPending();\n });\n }\n };\n const handleChange = (event) => {\n flushPending();\n const value = event.target.value;\n this.onChange?.(value, { immediate: false });\n };\n this.sliderInput.addEventListener('input', handleInput);\n this.sliderInput.addEventListener('change', handleChange);\n this._disposers.push(() => this.sliderInput.removeEventListener('input', handleInput));\n this._disposers.push(() => this.sliderInput.removeEventListener('change', handleChange));\n\n return this.root;\n }\n\n dispose() {\n this._disposers.forEach((dispose) => {\n try {\n dispose?.();\n } catch (error) {\n this.logger?.warn?.('twm-slider-field', 'Failed to dispose slider listener', { error });\n }\n });\n this._disposers = [];\n this.root = null;\n this.sliderInput = null;\n this.helperEl = null;\n }\n\n #coerceNumber(value, fallback) {\n const numeric = Number(value);\n return Number.isFinite(numeric) ? numeric : fallback;\n }\n\n #coercePositiveNumber(value, fallback) {\n const numeric = this.#coerceNumber(value, fallback);\n if (numeric <= 0) {\n return fallback;\n }\n return numeric;\n }\n}\n", "/**\n * table_state_store.js \u2014 persist DataTable view-state (sort, filters,\n * column widths), keyed by a caller-supplied `persistKey`.\n *\n * A FACTORY, not a singleton: the store reads and writes through a Host's\n * `state` capability (see ui/js/host/host.js) under one logical state key.\n * One blob holds a map of `{ [persistKey]: state }` for every persisted table.\n * Where that key lands on disk is the embedder's business, not ours \u2014 it is\n * decided by the host's `resolvePath`.\n *\n * A host without a `state` capability is legal: tables simply stay ephemeral.\n *\n * The in-memory cache must be dropped when the project changes (the app swaps\n * projects in-place without a page reload) \u2014 `reset()` is wired to the\n * `project:opened` event in app_bootstrap.\n */\n\n/**\n * @param {object} opts\n * @param {object} opts.host a Host. May lack `state` -> tables become ephemeral.\n * @param {string} opts.key logical state key, e.g. 'datatable_state'\n * @param {object} [opts.logger]\n * @param {number} [opts.debounceMs=500]\n */\nexport function createTableStateStore({ host, key, logger = console, debounceMs = 500 }) {\n if (!key) throw new Error('createTableStateStore requires { key }');\n const state = host?.state || null;\n\n let cache = null; // { [persistKey]: state } \u2014 null until first load\n let loadPromise = null;\n let saveTimer = null;\n\n const scheduleSave = () => {\n if (saveTimer) clearTimeout(saveTimer);\n saveTimer = setTimeout(async () => {\n saveTimer = null;\n if (!state || !cache) return;\n try { await state.write(key, cache); }\n catch (err) { logger.warn?.('[table-state] save failed', err); }\n }, debounceMs);\n };\n\n return {\n /** Resolve once the persisted blob has been read into the cache. Safe\n * to call repeatedly \u2014 the read happens at most once per project. */\n ready() {\n if (loadPromise) return loadPromise;\n loadPromise = (async () => {\n if (!state) { cache = {}; return cache; }\n try { cache = (await state.read(key)) || {}; }\n catch (err) { logger.warn?.('[table-state] load failed', err); cache = {}; }\n return cache;\n })();\n return loadPromise;\n },\n\n /** Synchronous read of a table's persisted state. Returns null until\n * the cache is loaded (await `ready()` first to be sure). */\n get(k) {\n if (!k || !cache) return null;\n return cache[k] || null;\n },\n\n /** Merge-and-persist a table's state (debounced). Pass null to forget\n * a key. Writes the whole map back atomically through the host. */\n set(k, s) {\n if (!k) return;\n if (!cache) cache = {};\n if (s == null) delete cache[k]; else cache[k] = s;\n scheduleSave();\n },\n\n /** Drop the cache + pending read so the next access reloads from the\n * newly-opened project. Cancels any in-flight save for the old one. */\n reset() {\n cache = null;\n loadPromise = null;\n if (saveTimer) { clearTimeout(saveTimer); saveTimer = null; }\n },\n };\n}\n", "/**\n * toast.js \u2014 thin wrapper around the global NotificationCenter for\n * callers that don't already hold an eventBus reference.\n *\n * The NotificationCenter (../notification_center.js) subscribes to\n * `toast:show` on the global event bus; we re-export tiny helpers\n * that emit the same payload shape.\n *\n * Usage:\n * import { toastError, toastSuccess, toastWarn, toastInfo } from './toast.js';\n * toastError('Save failed', 'sector_update refused: \u2026');\n *\n * The 1-arg form treats the string as the message (no title); the\n * 2-arg form is title + message.\n */\n\nfunction _bus() {\n return window.__ecoagent?.eventBus ?? null;\n}\n\nfunction _emit(severity, persistent, titleOrMsg, msg) {\n const bus = _bus();\n const title = (msg !== undefined) ? titleOrMsg : null;\n const message = (msg !== undefined) ? msg : titleOrMsg;\n if (!bus) {\n // Fall back to console so the message isn't lost if the bus is\n // unavailable (early bootstrap, isolated test pages).\n // eslint-disable-next-line no-console\n (severity === 'error' || severity === 'warn' ? console.warn : console.info)(\n `[toast/${severity}]`, title ? `${title}:` : '', message);\n return;\n }\n bus.emit('toast:show', {\n title, message, severity,\n persistent,\n durationMs: persistent ? 0 : 5000,\n });\n}\n\nexport function toastError(titleOrMsg, msg) { _emit('error', true, titleOrMsg, msg); }\nexport function toastWarn(titleOrMsg, msg) { _emit('warn', false, titleOrMsg, msg); }\nexport function toastInfo(titleOrMsg, msg) { _emit('info', false, titleOrMsg, msg); }\nexport function toastSuccess(titleOrMsg, msg) { _emit('success', false, titleOrMsg, msg); }\n\n/** Coerce a bridge-call result/exception into a user-facing error toast.\n * Drops the toast only if `res?.ok === false` *or* an exception was caught.\n * Returns true if the call succeeded (caller can continue), false otherwise. */\nexport function reportBridgeError(opName, resOrErr) {\n if (!resOrErr) return true;\n if (resOrErr instanceof Error) {\n toastError(opName, resOrErr.message || String(resOrErr));\n return false;\n }\n if (resOrErr && resOrErr.ok === false) {\n toastError(opName, resOrErr.error || 'operation refused');\n return false;\n }\n return true;\n}\n", "/**\n * Tree View Component\n *\n * A reusable hierarchical tree view component for displaying nested data.\n * Used by Functions Page (modules/functions) and Data Page (datasets/series).\n *\n * Structure:\n * - TreeView: Container for multiple categories\n * - TreeCategory: Top-level collapsible group (e.g., \"Built-in\", \"Project\")\n * - TreeNode: Expandable node with children (e.g., module, dataset)\n * - TreeItem: Leaf item (e.g., function, series)\n */\n\n/**\n * Create a tree category (top-level collapsible section)\n * @param {Object} options - Category options\n * @param {string} options.id - Unique category ID\n * @param {string} options.label - Display label\n * @param {string} [options.icon] - Material icon name\n * @param {string} [options.iconClass] - Additional icon CSS class\n * @param {number} [options.count] - Item count to display\n * @param {boolean} [options.expanded=false] - Initial expanded state\n * @param {boolean} [options.readonly=false] - Whether items are readonly\n * @returns {HTMLElement} - Category element\n */\nexport function createTreeCategory(options) {\n const {\n id,\n label,\n icon = 'folder',\n iconClass = '',\n count = 0,\n expanded = false,\n readonly = false,\n } = options;\n\n const node = document.createElement('div');\n node.className = 'twm-collapsible-box twm-tree-category';\n node.dataset.categoryId = id;\n node.dataset.collapsibleId = `tree-category-${id}`;\n node.dataset.collapsibleDefault = expanded ? 'expanded' : 'collapsed';\n if (readonly) node.dataset.readonly = 'true';\n\n node.innerHTML = `\n <div class=\"twm-collapsible-header\" data-collapsible-header=\"true\">\n <button class=\"twm-arrow-toggle\" type=\"button\">\n <span class=\"twm-collapsible-arrow material-symbols-outlined${expanded ? '' : ' collapsed'}\">expand_more</span>\n </button>\n <span class=\"twm-tree-category__icon ${iconClass}\">\n <span class=\"material-symbols-outlined\">${icon}</span>\n </span>\n <span class=\"twm-tree-category__label\">${label}</span>\n <span class=\"twm-tree-category__count\">(${count})</span>\n </div>\n <div class=\"twm-collapsible-content${expanded ? ' visible' : ''}\" data-collapsible-content=\"true\"></div>\n `;\n\n return node;\n}\n\n/**\n * Create a tree node (expandable container with children)\n * @param {Object} options - Node options\n * @param {string} options.id - Unique node ID\n * @param {string} options.label - Display label\n * @param {string} [options.icon] - Material icon name (optional)\n * @param {number} [options.count] - Child count to display\n * @param {boolean} [options.expanded=false] - Initial expanded state\n * @param {boolean} [options.readonly=false] - Whether node is readonly\n * @param {Object} [options.actions] - Action buttons config\n * @returns {HTMLElement} - Node element\n */\nexport function createTreeNode(options) {\n const {\n id,\n label,\n icon = null,\n count = 0,\n expanded = false,\n readonly = false,\n actions = null,\n } = options;\n\n const node = document.createElement('div');\n node.className = `twm-tree-node${readonly ? ' readonly' : ''}`;\n node.dataset.nodeId = id;\n\n const iconHtml = icon\n ? `<span class=\"twm-tree-node__icon\"><span class=\"material-symbols-outlined\">${icon}</span></span>`\n : '';\n\n const actionsHtml = actions ? '<span class=\"twm-tree-node__actions\"></span>' : '';\n\n node.innerHTML = `\n <div class=\"twm-tree-node__header\">\n <span class=\"twm-tree-node__toggle\">\n <span class=\"material-symbols-outlined\">${expanded ? 'expand_more' : 'chevron_right'}</span>\n </span>\n ${iconHtml}\n <span class=\"twm-tree-node__label\">${label}</span>\n <span class=\"twm-tree-node__count\">(${count})</span>\n ${actionsHtml}\n </div>\n <div class=\"twm-tree-node__children\" style=\"display: ${expanded ? 'block' : 'none'};\"></div>\n `;\n\n // Add action buttons if specified\n if (actions) {\n const actionsEl = node.querySelector('.twm-tree-node__actions');\n Object.entries(actions).forEach(([actionId, actionConfig]) => {\n const btn = document.createElement('button');\n btn.className = 'twm-tree-node__action-btn';\n btn.dataset.action = actionId;\n btn.title = actionConfig.title || actionId;\n btn.innerHTML = `<span class=\"material-symbols-outlined\">${actionConfig.icon}</span>`;\n if (actionConfig.onClick) {\n btn.addEventListener('click', (e) => {\n e.stopPropagation();\n actionConfig.onClick(id, e);\n });\n }\n actionsEl.appendChild(btn);\n });\n }\n\n return node;\n}\n\n/**\n * Create a tree item (leaf node)\n * @param {Object} options - Item options\n * @param {string} options.id - Unique item ID\n * @param {string} options.label - Display label\n * @param {string} [options.icon] - Material icon or symbol (e.g., '\u0192', 'insights')\n * @param {boolean} [options.isMaterialIcon=true] - Whether icon is Material icon\n * @param {boolean} [options.readonly=false] - Whether item is readonly\n * @param {boolean} [options.selected=false] - Whether item is selected\n * @param {string} [options.subtitle] - Optional subtitle text\n * @param {Object} [options.data] - Additional data to attach\n * @param {Object} [options.badge] - Optional badge config\n * @param {string} [options.badge.text] - Badge text (if empty, renders as status dot)\n * @param {string} [options.badge.variant] - 'muted'|'pass'|'fail'|'error'\n * @returns {HTMLElement} - Item element\n */\nexport function createTreeItem(options) {\n const {\n id,\n label,\n icon = null,\n isMaterialIcon = true,\n readonly = false,\n selected = false,\n subtitle = null,\n data = null,\n badge = null,\n } = options;\n\n const item = document.createElement('div');\n item.className = `twm-tree-item${readonly ? ' readonly' : ''}${selected ? ' selected' : ''}`;\n item.dataset.itemId = id;\n\n // Attach custom data\n if (data) {\n Object.entries(data).forEach(([key, value]) => {\n item.dataset[key] = value;\n });\n }\n\n const iconHtml = icon\n ? isMaterialIcon\n ? `<span class=\"twm-tree-item__icon\"><span class=\"material-symbols-outlined\">${icon}</span></span>`\n : `<span class=\"twm-tree-item__icon twm-tree-item__icon--symbol\">${icon}</span>`\n : '';\n\n const subtitleHtml = subtitle\n ? `<span class=\"twm-tree-item__subtitle\">${subtitle}</span>`\n : '';\n\n let badgeHtml = '';\n if (badge) {\n const variant = badge.variant || 'muted';\n if (badge.text) {\n badgeHtml = `<span class=\"twm-tree-item__badge tree-item__badge--${variant}\">${badge.text}</span>`;\n } else {\n badgeHtml = `<span class=\"twm-tree-item__status-dot tree-item__status-dot--${variant}\"></span>`;\n }\n }\n\n item.innerHTML = `\n ${iconHtml}\n <span class=\"twm-tree-item__label\">${label}</span>\n ${subtitleHtml}\n ${badgeHtml}\n `;\n\n return item;\n}\n\n/**\n * Toggle a collapsible category\n * @param {HTMLElement} categoryEl - Category element\n * @param {boolean} [force] - Force specific state (true = expand, false = collapse)\n */\nexport function toggleCategory(categoryEl, force) {\n if (!categoryEl) return;\n\n const arrow = categoryEl.querySelector(':scope > .twm-collapsible-header .twm-collapsible-arrow');\n const content = categoryEl.querySelector(':scope > .twm-collapsible-content');\n\n if (!content) return;\n\n // Determine whether we should expand\n // force=true means expand, force=false means collapse, undefined means toggle\n const isCurrentlyExpanded = content.classList.contains('visible');\n const shouldExpand = force !== undefined ? force : !isCurrentlyExpanded;\n\n if (shouldExpand) {\n // Expand\n if (arrow) {\n arrow.classList.remove('collapsed');\n }\n content.classList.add('visible');\n } else {\n // Collapse\n if (arrow) {\n arrow.classList.add('collapsed');\n }\n content.classList.remove('visible');\n }\n}\n\n/**\n * Toggle a tree node\n * @param {HTMLElement} nodeEl - Node element\n * @param {boolean} [force] - Force specific state\n */\nexport function toggleNode(nodeEl, force) {\n if (!nodeEl) return;\n\n const toggle = nodeEl.querySelector(':scope > .twm-tree-node__header .twm-tree-node__toggle .material-symbols-outlined');\n const children = nodeEl.querySelector(':scope > .twm-tree-node__children');\n\n if (!children) return;\n\n const isExpanded = force !== undefined\n ? force\n : children.style.display === 'none';\n\n if (isExpanded) {\n children.style.display = 'block';\n if (toggle) toggle.textContent = 'expand_more';\n } else {\n children.style.display = 'none';\n if (toggle) toggle.textContent = 'chevron_right';\n }\n}\n\n/**\n * Filter tree items by text match\n * @param {HTMLElement} container - Tree container\n * @param {string} filter - Filter text (case-insensitive)\n * @param {Object} [options] - Filter options\n * @param {boolean} [options.expandMatches=true] - Auto-expand nodes with matches\n */\nexport function filterTree(container, filter, options = {}) {\n const { expandMatches = true } = options;\n const normalizedFilter = (filter || '').toLowerCase().trim();\n\n const items = container.querySelectorAll('.twm-tree-item');\n const nodes = container.querySelectorAll('.twm-tree-node');\n const categories = container.querySelectorAll('.twm-tree-category');\n\n // Reset visibility\n items.forEach((item) => {\n const label = item.querySelector('.twm-tree-item__label')?.textContent || '';\n const matches = !normalizedFilter || label.toLowerCase().includes(normalizedFilter);\n item.style.display = matches ? '' : 'none';\n item.classList.toggle('twm-filter-match', matches && !!normalizedFilter);\n });\n\n // Show/hide nodes based on visible children\n nodes.forEach((node) => {\n const visibleChildren = node.querySelectorAll('.twm-tree-item:not([style*=\"display: none\"])');\n const hasVisibleChildren = visibleChildren.length > 0;\n node.style.display = hasVisibleChildren ? '' : 'none';\n\n // Auto-expand nodes with matches\n if (expandMatches && hasVisibleChildren && normalizedFilter) {\n toggleNode(node, true);\n }\n });\n\n // Show/hide categories based on visible nodes\n categories.forEach((category) => {\n const visibleNodes = category.querySelectorAll('.twm-tree-node:not([style*=\"display: none\"])');\n const hasVisibleNodes = visibleNodes.length > 0;\n category.style.display = hasVisibleNodes ? '' : 'none';\n\n // Auto-expand categories with matches\n if (expandMatches && hasVisibleNodes && normalizedFilter) {\n toggleCategory(category, true);\n }\n });\n}\n\n/**\n * Select a tree item\n * @param {HTMLElement} container - Tree container\n * @param {string} itemId - Item ID to select\n * @param {Object} [options] - Selection options\n * @param {boolean} [options.scrollIntoView=true] - Scroll item into view\n * @param {boolean} [options.expandParents=true] - Expand parent nodes\n */\nexport function selectItem(container, itemId, options = {}) {\n const { scrollIntoView = true, expandParents = true } = options;\n\n // Deselect all\n container.querySelectorAll('.twm-tree-item.selected').forEach((el) => {\n el.classList.remove('selected');\n });\n\n // Find and select item\n const item = container.querySelector(`.twm-tree-item[data-item-id=\"${itemId}\"]`);\n if (!item) return null;\n\n item.classList.add('selected');\n\n // Expand parent nodes\n if (expandParents) {\n let parent = item.parentElement;\n while (parent && parent !== container) {\n if (parent.classList.contains('twm-tree-node__children')) {\n const node = parent.closest('.twm-tree-node');\n if (node) toggleNode(node, true);\n }\n if (parent.classList.contains('twm-collapsible-content')) {\n const category = parent.closest('.twm-tree-category');\n if (category) toggleCategory(category, true);\n }\n parent = parent.parentElement;\n }\n }\n\n // Scroll into view\n if (scrollIntoView) {\n item.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n }\n\n return item;\n}\n\n/**\n * TreeView class for managing a complete tree structure\n */\nexport class TreeView {\n constructor(container, options = {}) {\n this.container = container;\n this.options = {\n onItemClick: null,\n onItemDoubleClick: null,\n onNodeToggle: null,\n onCategoryToggle: null,\n ...options,\n };\n\n this._boundHandleClick = this._handleClick.bind(this);\n this._boundHandleDblClick = this._handleDoubleClick.bind(this);\n\n if (container) {\n container.classList.add('twm-tree-view');\n container.addEventListener('click', this._boundHandleClick);\n container.addEventListener('dblclick', this._boundHandleDblClick);\n }\n }\n\n _handleClick(e) {\n // Handle category toggle\n const collapsibleHeader = e.target.closest('.twm-collapsible-header');\n if (collapsibleHeader) {\n const category = collapsibleHeader.closest('.twm-tree-category');\n if (category) {\n toggleCategory(category);\n this.options.onCategoryToggle?.(category.dataset.categoryId, category);\n }\n return;\n }\n\n // Handle node toggle\n const nodeHeader = e.target.closest('.twm-tree-node__header');\n if (nodeHeader) {\n const node = nodeHeader.closest('.twm-tree-node');\n if (node) {\n toggleNode(node);\n this.options.onNodeToggle?.(node.dataset.nodeId, node);\n }\n return;\n }\n\n // Handle item click\n const item = e.target.closest('.twm-tree-item');\n if (item) {\n this.select(item.dataset.itemId);\n this.options.onItemClick?.(item.dataset.itemId, item, e);\n }\n }\n\n _handleDoubleClick(e) {\n const item = e.target.closest('.twm-tree-item');\n if (item) {\n this.options.onItemDoubleClick?.(item.dataset.itemId, item, e);\n }\n }\n\n addCategory(options) {\n const category = createTreeCategory(options);\n this.container.appendChild(category);\n return category;\n }\n\n addNode(categoryId, options) {\n const category = this.container.querySelector(`.twm-tree-category[data-category-id=\"${categoryId}\"]`);\n const content = category?.querySelector('.twm-collapsible-content');\n if (!content) return null;\n\n const node = createTreeNode(options);\n content.appendChild(node);\n return node;\n }\n\n addItem(nodeId, options) {\n const node = this.container.querySelector(`.twm-tree-node[data-node-id=\"${nodeId}\"]`);\n const children = node?.querySelector('.twm-tree-node__children');\n if (!children) return null;\n\n const item = createTreeItem(options);\n children.appendChild(item);\n return item;\n }\n\n select(itemId) {\n return selectItem(this.container, itemId);\n }\n\n filter(text) {\n filterTree(this.container, text);\n }\n\n clear() {\n this.container.innerHTML = '';\n }\n\n dispose() {\n if (this.container) {\n this.container.removeEventListener('click', this._boundHandleClick);\n this.container.removeEventListener('dblclick', this._boundHandleDblClick);\n }\n }\n}\n\nexport default TreeView;\n", "/**\n * WindowTaskbar - Singleton component that manages minimized windows in the global bottom bar.\n *\n * Listens for window events and renders taskbar buttons for minimized windows.\n * Integrates with the existing global-bottom-bar element.\n */\n\nimport { ManagedWindow } from './managed_window.js';\n\nclass WindowTaskbarManager {\n constructor() {\n this._minimizedWindows = new Map(); // id -> { title, icon }\n this._containerEl = null;\n this._leftDivider = null;\n this._rightDivider = null;\n this._initialized = false;\n }\n\n /**\n * Initialize the taskbar. Call once after DOM is ready.\n */\n init() {\n if (this._initialized) return;\n\n // Find or create the container in the global bottom bar\n const bottomBar = document.querySelector('.twm-global-bottom-bar');\n if (!bottomBar) {\n console.warn('[WindowTaskbar] twm-global-bottom-bar not found');\n return;\n }\n\n // Create left divider (always present but hidden when no windows)\n this._leftDivider = document.createElement('div');\n this._leftDivider.className = 'twm-bar-windows__divider twm-bar-windows__divider--left';\n\n // Insert bar-windows container between bar-left and bar-center\n this._containerEl = document.createElement('div');\n this._containerEl.className = 'twm-bar-windows';\n\n // Create right divider (shown when there are windows)\n this._rightDivider = document.createElement('div');\n this._rightDivider.className = 'twm-bar-windows__divider twm-bar-windows__divider--right';\n\n const barCenter = bottomBar.querySelector('.twm-bar-center');\n if (barCenter) {\n bottomBar.insertBefore(this._rightDivider, barCenter);\n bottomBar.insertBefore(this._containerEl, this._rightDivider);\n bottomBar.insertBefore(this._leftDivider, this._containerEl);\n } else {\n bottomBar.appendChild(this._leftDivider);\n bottomBar.appendChild(this._containerEl);\n bottomBar.appendChild(this._rightDivider);\n }\n\n // Listen for window events\n window.addEventListener('managed-window-minimized', (e) => this._onWindowMinimized(e));\n window.addEventListener('managed-window-restored', (e) => this._onWindowRestored(e));\n window.addEventListener('managed-window-closed', (e) => this._onWindowClosed(e));\n\n this._initialized = true;\n this._updateDividers();\n }\n\n /**\n * Handle window minimized event.\n */\n _onWindowMinimized(e) {\n const { id, title, icon } = e.detail;\n this._minimizedWindows.set(id, { title, icon });\n this._render();\n }\n\n /**\n * Handle window restored event.\n */\n _onWindowRestored(e) {\n const { id } = e.detail;\n this._minimizedWindows.delete(id);\n this._render();\n }\n\n /**\n * Handle window closed event.\n */\n _onWindowClosed(e) {\n const { id } = e.detail;\n this._minimizedWindows.delete(id);\n this._render();\n }\n\n /**\n * Update divider visibility based on window count.\n */\n _updateDividers() {\n const hasWindows = this._minimizedWindows.size > 0;\n if (this._leftDivider) {\n this._leftDivider.style.display = hasWindows ? '' : 'none';\n }\n if (this._rightDivider) {\n this._rightDivider.style.display = hasWindows ? '' : 'none';\n }\n }\n\n /**\n * Render the taskbar buttons.\n */\n _render() {\n if (!this._containerEl) return;\n\n this._containerEl.innerHTML = '';\n\n for (const [id, { title, icon }] of this._minimizedWindows) {\n const btn = document.createElement('button');\n btn.className = 'twm-bar-windows__item';\n btn.setAttribute('data-window-id', id);\n btn.title = `Restore: ${title}`;\n\n // Add icon\n if (icon) {\n const iconEl = document.createElement('span');\n iconEl.className = 'twm-bar-windows__item-icon material-symbols-outlined';\n iconEl.textContent = icon;\n btn.appendChild(iconEl);\n }\n\n // Add title\n const titleEl = document.createElement('span');\n titleEl.className = 'twm-bar-windows__item-title';\n titleEl.textContent = title;\n btn.appendChild(titleEl);\n\n btn.addEventListener('click', () => {\n ManagedWindow.restore(id);\n });\n this._containerEl.appendChild(btn);\n }\n\n this._updateDividers();\n }\n}\n\n// Singleton instance\nexport const WindowTaskbar = new WindowTaskbarManager();\n", "/**\r\n * Panel State Machine\r\n *\r\n * Reusable FSM for panel visibility management. Formalizes a four-state\r\n * model used by the right panel and bottom panel:\r\n *\r\n * disabled \u2013 Panel hidden, toggle button disabled. Cannot be shown.\r\n * hidden \u2013 Panel hidden, toggle button enabled. User can show it.\r\n * on-demand \u2013 Panel hidden by default, auto-shown by external triggers\r\n * (e.g. node selection). Toggle button enabled.\r\n * pinned \u2013 Panel always visible. Toggle button shows pinned indicator.\r\n *\r\n * Different panels use different subsets of these states:\r\n * Right panel: disabled \u2194 on-demand \u2194 pinned (trigger-based visibility)\r\n * Bottom panel: disabled \u2194 hidden \u2194 pinned (simple show/hide toggle)\r\n *\r\n * Uses the composition pattern (like AiStateMachine): wraps a StateMachine\r\n * instance in a private field and exposes a panel-domain public API.\r\n *\r\n * DOM manipulation is delegated to callback functions passed at construction\r\n * time, keeping the FSM itself pure and testable.\r\n *\r\n * @module ui/controllers/panel_state_machine\r\n */\r\n\r\nimport { StateMachine } from '../../core/state_machine.js';\r\n\r\n// \u2500\u2500\u2500 Constants \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nexport const PANEL_STATES = Object.freeze({\r\n DISABLED: 'disabled',\r\n HIDDEN: 'hidden',\r\n ON_DEMAND: 'on-demand',\r\n PINNED: 'pinned',\r\n});\r\n\r\nexport const PANEL_TRANSITIONS = Object.freeze({\r\n ENABLE: 'panel:mode:enable',\r\n ENABLE_PINNED: 'panel:mode:enable-pinned',\r\n ENABLE_HIDDEN: 'panel:mode:enable-hidden',\r\n DISABLE: 'panel:mode:disable',\r\n PIN: 'panel:pin',\r\n UNPIN: 'panel:unpin',\r\n SHOW: 'panel:show',\r\n HIDE: 'panel:hide',\r\n});\r\n\r\n\r\n// \u2500\u2500\u2500 State Machine \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nexport class PanelStateMachine {\r\n\r\n /** @type {StateMachine} */\r\n #machine;\r\n\r\n /** @type {import('../../core/event_bus.js').default} */\r\n #eventBus;\r\n\r\n /** @type {object|null} */\r\n #logger;\r\n\r\n // \u2500\u2500 Identity \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n #name;\r\n\r\n // \u2500\u2500 DOM delegation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n #callbacks;\r\n\r\n // \u2500\u2500 Persistence / config \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n #persistenceKey;\r\n #supportsCollapse = false;\r\n\r\n // \u2500\u2500 Trigger-based visibility (on-demand state) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n #triggerCount = 0;\r\n\r\n // \u2500\u2500 Orthogonal state \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n // null initial value ensures the first #applyVisibility call always fires\r\n // onShow/onHide to synchronize DOM with FSM state (the DOM starts without\r\n // any hidden class, so we must not assume it matches #visible = false).\r\n #visible = null;\r\n #collapsed = false;\r\n #height = null;\r\n\r\n // \u2500\u2500 Overrides \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n #overrideHidden = false;\r\n #widgetConfigActive = false;\r\n\r\n // \u2500\u2500 Persisted pin (read before first enable) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n #persistedPinned = false;\r\n\r\n // \u2500\u2500 Config: which state to enter when enable() is called and not pinned \u2500\u2500\r\n #unpinnedState;\r\n\r\n /**\r\n * @param {object} config\r\n * @param {string} config.name Panel identity ('right', 'bottom', etc.)\r\n * @param {import('../../core/event_bus.js').default} config.eventBus\r\n * @param {object} [config.logger]\r\n * @param {string} config.persistenceKey localStorage key\r\n * @param {boolean} [config.defaultPinned] Default pin state when no persisted data exists\r\n * @param {string} [config.unpinnedState] State for enable() when not pinned: 'on-demand' (default) or 'hidden'\r\n * @param {object} config.callbacks DOM manipulation hooks:\r\n * @param {Function} config.callbacks.onShow (reason) => void\r\n * @param {Function} config.callbacks.onHide (reason) => void\r\n * @param {Function} config.callbacks.onDisable () => void\r\n * @param {Function} config.callbacks.onEnable () => void\r\n * @param {Function} [config.callbacks.onPinChanged] (pinned) => void\r\n * @param {Function} [config.callbacks.onVisibilityChanged] (visible) => void\r\n * @param {Function} [config.callbacks.onCollapseChanged] (collapsed, height) => void\r\n */\r\n constructor(config) {\r\n this.#name = config.name;\r\n this.#eventBus = config.eventBus;\r\n this.#logger = config.logger ?? null;\r\n this.#callbacks = config.callbacks;\r\n this.#persistenceKey = config.persistenceKey;\r\n this.#persistedPinned = config.defaultPinned ?? false;\r\n this.#unpinnedState = config.unpinnedState ?? PANEL_STATES.ON_DEMAND;\r\n\r\n const self = this;\r\n\r\n this.#machine = new StateMachine({\r\n name: `panel-${config.name}`,\r\n initialState: PANEL_STATES.DISABLED,\r\n states: {\r\n [PANEL_STATES.DISABLED]: {\r\n onEnter() { self.#onEnterDisabled(); },\r\n transitions: {\r\n [PANEL_TRANSITIONS.ENABLE]: { target: PANEL_STATES.ON_DEMAND },\r\n [PANEL_TRANSITIONS.ENABLE_PINNED]: { target: PANEL_STATES.PINNED },\r\n [PANEL_TRANSITIONS.ENABLE_HIDDEN]: { target: PANEL_STATES.HIDDEN },\r\n },\r\n },\r\n [PANEL_STATES.HIDDEN]: {\r\n onEnter() { self.#onEnterHidden(); },\r\n transitions: {\r\n [PANEL_TRANSITIONS.DISABLE]: { target: PANEL_STATES.DISABLED },\r\n [PANEL_TRANSITIONS.SHOW]: { target: PANEL_STATES.PINNED },\r\n },\r\n },\r\n [PANEL_STATES.ON_DEMAND]: {\r\n onEnter() { self.#onEnterOnDemand(); },\r\n onExit() { self.#onExitOnDemand(); },\r\n transitions: {\r\n [PANEL_TRANSITIONS.DISABLE]: { target: PANEL_STATES.DISABLED },\r\n [PANEL_TRANSITIONS.PIN]: { target: PANEL_STATES.PINNED },\r\n },\r\n },\r\n [PANEL_STATES.PINNED]: {\r\n onEnter() { self.#onEnterPinned(); },\r\n transitions: {\r\n [PANEL_TRANSITIONS.DISABLE]: { target: PANEL_STATES.DISABLED },\r\n [PANEL_TRANSITIONS.UNPIN]: { target: PANEL_STATES.ON_DEMAND },\r\n [PANEL_TRANSITIONS.HIDE]: { target: PANEL_STATES.HIDDEN },\r\n },\r\n },\r\n },\r\n eventBus: config.eventBus,\r\n logger: config.logger,\r\n });\r\n }\r\n\r\n // \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n // Queries\r\n // \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\r\n /** Current FSM state. */\r\n getState() { return this.#machine.getState(); }\r\n\r\n /** True when in pinned state. */\r\n isPinned() { return this.getState() === PANEL_STATES.PINNED; }\r\n\r\n /** True when in disabled state. */\r\n isDisabled() { return this.getState() === PANEL_STATES.DISABLED; }\r\n\r\n /** True when in hidden state (not visible, but toggle enabled). */\r\n isHidden() { return this.getState() === PANEL_STATES.HIDDEN; }\r\n\r\n /** True when the panel is currently visible to the user. */\r\n isVisible() { return this.#visible; }\r\n\r\n /** True when the panel is collapsed (bottom panel only). */\r\n isCollapsed() { return this.#collapsed; }\r\n\r\n /** Current stored height (for collapse restore). */\r\n getHeight() { return this.#height; }\r\n\r\n /** Whether widget config override is active. */\r\n get widgetConfigActive() { return this.#widgetConfigActive; }\r\n\r\n /** Whether collapse operations are supported (runtime-configurable per mode). */\r\n get supportsCollapse() { return this.#supportsCollapse; }\r\n set supportsCollapse(value) { this.#supportsCollapse = Boolean(value); }\r\n\r\n // \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n // Mode transitions (called by ApplicationShell._switchMode)\r\n // \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\r\n /**\r\n * Enable the panel for the current mode.\r\n *\r\n * With no argument, transitions from disabled \u2192 on-demand, hidden, or\r\n * pinned based on persisted pin state and unpinnedState config.\r\n *\r\n * With an explicit `initialState`, forces that specific target state\r\n * regardless of persistence. Useful when a mode always needs a specific\r\n * starting state (e.g. ETL designer always starts as on-demand).\r\n *\r\n * If already enabled (hidden, on-demand, or pinned), this is a no-op.\r\n *\r\n * Note: getState() can return null during the StateMachine's async init\r\n * microtask. We treat null the same as disabled \u2014 the transition() call\r\n * internally awaits _ready, so the machine will be in 'disabled' by the\r\n * time the transition executes.\r\n *\r\n * @param {string} [initialState] Force a specific target state: 'on-demand', 'hidden', or 'pinned'\r\n */\r\n enable(initialState) {\r\n const state = this.getState();\r\n if (state !== PANEL_STATES.DISABLED && state !== null) return;\r\n\r\n if (initialState === PANEL_STATES.ON_DEMAND) {\r\n this.#machine.transition(PANEL_TRANSITIONS.ENABLE);\r\n } else if (initialState === PANEL_STATES.HIDDEN) {\r\n this.#machine.transition(PANEL_TRANSITIONS.ENABLE_HIDDEN);\r\n } else if (initialState === PANEL_STATES.PINNED) {\r\n this.#machine.transition(PANEL_TRANSITIONS.ENABLE_PINNED);\r\n } else if (this.#persistedPinned) {\r\n this.#machine.transition(PANEL_TRANSITIONS.ENABLE_PINNED);\r\n } else if (this.#unpinnedState === PANEL_STATES.HIDDEN) {\r\n this.#machine.transition(PANEL_TRANSITIONS.ENABLE_HIDDEN);\r\n } else {\r\n this.#machine.transition(PANEL_TRANSITIONS.ENABLE);\r\n }\r\n }\r\n\r\n /**\r\n * Disable the panel for the current mode.\r\n * Transitions from any enabled state \u2192 disabled.\r\n * If already disabled (or null during async init), this is a no-op.\r\n */\r\n disable() {\r\n const state = this.getState();\r\n if (state === PANEL_STATES.DISABLED || state === null) return;\r\n this.#machine.transition(PANEL_TRANSITIONS.DISABLE);\r\n }\r\n\r\n // \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n // Pin (called by toggle button click)\r\n // \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\r\n /** Toggle between on-demand and pinned. No-op if disabled. */\r\n togglePin() {\r\n const state = this.getState();\r\n if (state === PANEL_STATES.ON_DEMAND) {\r\n this.pin();\r\n } else if (state === PANEL_STATES.PINNED) {\r\n this.unpin();\r\n }\r\n }\r\n\r\n /** on-demand \u2192 pinned. */\r\n pin() {\r\n if (this.getState() !== PANEL_STATES.ON_DEMAND) return;\r\n this.#machine.transition(PANEL_TRANSITIONS.PIN);\r\n }\r\n\r\n /** pinned \u2192 on-demand. */\r\n unpin() {\r\n if (this.getState() !== PANEL_STATES.PINNED) return;\r\n this.#machine.transition(PANEL_TRANSITIONS.UNPIN);\r\n }\r\n\r\n // \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n // Show / Hide (hidden \u2194 pinned, for panels without trigger-based visibility)\r\n // \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\r\n /** hidden \u2192 pinned. No-op if not in hidden state. */\r\n show() {\r\n if (this.getState() !== PANEL_STATES.HIDDEN) return;\r\n this.#machine.transition(PANEL_TRANSITIONS.SHOW);\r\n }\r\n\r\n /** pinned \u2192 hidden. No-op if not in pinned state. */\r\n hide() {\r\n if (this.getState() !== PANEL_STATES.PINNED) return;\r\n this.#machine.transition(PANEL_TRANSITIONS.HIDE);\r\n }\r\n\r\n /** Toggle between hidden and pinned. No-op if disabled or on-demand. */\r\n toggleShow() {\r\n const state = this.getState();\r\n if (state === PANEL_STATES.HIDDEN) {\r\n this.show();\r\n } else if (state === PANEL_STATES.PINNED) {\r\n this.hide();\r\n }\r\n }\r\n\r\n // \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n // Smart toggle (toolbar click handler)\r\n // \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\r\n /**\r\n * The default action for a toolbar toggle click.\r\n * Delegates to the appropriate operation based on FSM state and config:\r\n * - Pinned + supportsCollapse \u2192 toggleCollapse\r\n * - On-demand or pinned (no collapse) \u2192 togglePin\r\n * - Hidden \u2192 show\r\n */\r\n toggle() {\r\n const state = this.getState();\r\n if (state === PANEL_STATES.DISABLED) return;\r\n if (this.#supportsCollapse && state === PANEL_STATES.PINNED) {\r\n this.toggleCollapse();\r\n } else if (state === PANEL_STATES.HIDDEN) {\r\n this.show();\r\n } else {\r\n this.togglePin();\r\n }\r\n }\r\n\r\n // \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n // On-demand triggers\r\n // \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\r\n /**\r\n * Increment or decrement the trigger count and sync visibility.\r\n * In on-demand state, the panel is visible when triggerCount > 0.\r\n * In pinned state, triggers are tracked but don't affect visibility.\r\n * In disabled state, triggers are tracked but have no effect.\r\n */\r\n setTriggerActive(active) {\r\n if (active) {\r\n this.#triggerCount++;\r\n } else {\r\n this.#triggerCount = Math.max(0, this.#triggerCount - 1);\r\n }\r\n this.#syncVisibility('trigger');\r\n }\r\n\r\n /** Reset all triggers to 0 and sync visibility. */\r\n clearTriggers() {\r\n this.#triggerCount = 0;\r\n this.#syncVisibility('triggers-cleared');\r\n }\r\n\r\n // \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n // Re-apply (mode switch support)\r\n // \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\r\n /**\r\n * Force re-apply DOM callbacks from the current FSM state.\r\n *\r\n * Use after mode switches where external code changed the DOM (swapped\r\n * panel content, cleared tabs) while the FSM remained in an enabled\r\n * state. The cached `#visible` flag is invalidated so `#applyVisibility`\r\n * is guaranteed to fire `onShow`/`onHide` + `onCollapseChanged`.\r\n *\r\n * No-op when the FSM is disabled \u2014 disable() handles its own cleanup.\r\n */\r\n reapply() {\r\n if (this.isDisabled()) return;\r\n this.#visible = !this.#visible;\r\n this.#syncVisibility('reapply');\r\n }\r\n\r\n // \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n // Collapse (bottom panel only)\r\n // \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\r\n collapse() {\r\n if (!this.#supportsCollapse || !this.isVisible() || this.#collapsed) return;\r\n this.#collapsed = true;\r\n this.#callbacks.onCollapseChanged?.(true, this.#height);\r\n this.#emitBus(`panel:${this.#name}:collapse:changed`, { collapsed: true });\r\n this.#persist();\r\n }\r\n\r\n expand() {\r\n if (!this.#supportsCollapse || !this.isVisible() || !this.#collapsed) return;\r\n this.#collapsed = false;\r\n this.#callbacks.onCollapseChanged?.(false, this.#height);\r\n this.#emitBus(`panel:${this.#name}:collapse:changed`, { collapsed: false });\r\n this.#persist();\r\n }\r\n\r\n toggleCollapse() {\r\n if (this.#collapsed) {\r\n this.expand();\r\n } else {\r\n this.collapse();\r\n }\r\n }\r\n\r\n /** Store the last expanded height (called during resize or before collapse). */\r\n setHeight(px) {\r\n if (typeof px === 'number' && px > 40) {\r\n this.#height = px;\r\n this.#persist();\r\n }\r\n }\r\n\r\n // \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n // Overrides\r\n // \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\r\n /**\r\n * Force-hide the panel regardless of FSM state (welcome screen).\r\n * When lifted, visibility re-derives from current state + triggers.\r\n */\r\n setOverrideHidden(hidden) {\r\n this.#overrideHidden = hidden;\r\n if (hidden) {\r\n this.#applyVisibility(false, 'override-hidden');\r\n this.#callbacks.onDisable?.();\r\n } else {\r\n // Re-derive: if not disabled, re-enable toggle\r\n if (!this.isDisabled()) {\r\n this.#callbacks.onEnable?.();\r\n }\r\n this.#syncVisibility('override-lifted');\r\n }\r\n }\r\n\r\n /**\r\n * Widget config special case (right panel).\r\n * When active, the toggle button stays enabled even in disabled state\r\n * so the user can click it to close the config panel.\r\n */\r\n setWidgetConfigActive(active) {\r\n this.#widgetConfigActive = active;\r\n // In disabled state, temporarily enable/disable the toggle\r\n if (this.isDisabled()) {\r\n if (active) {\r\n this.#callbacks.onEnable?.();\r\n } else {\r\n this.#callbacks.onDisable?.();\r\n }\r\n }\r\n this.#callbacks.onVisibilityChanged?.(this.#visible);\r\n }\r\n\r\n // \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n // Persistence\r\n // \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\r\n /**\r\n * Read persisted state from localStorage and apply it.\r\n * Must be called after construction, before the first enable().\r\n */\r\n hydrate() {\r\n try {\r\n if (typeof localStorage === 'undefined') return;\r\n const raw = localStorage.getItem(this.#persistenceKey);\r\n if (raw == null) return;\r\n const parsed = JSON.parse(raw);\r\n if (!parsed || typeof parsed !== 'object') return;\r\n\r\n if (typeof parsed.pinned === 'boolean') {\r\n this.#persistedPinned = parsed.pinned;\r\n }\r\n // Always restore collapse/height \u2014 supportsCollapse is set per mode\r\n // and may not be configured yet at hydrate() time.\r\n if (typeof parsed.collapsed === 'boolean') {\r\n this.#collapsed = parsed.collapsed;\r\n }\r\n if (typeof parsed.height === 'number' && parsed.height > 40) {\r\n this.#height = parsed.height;\r\n }\r\n this.#log('debug', 'Hydrated persisted state', {\r\n pinned: this.#persistedPinned,\r\n collapsed: this.#collapsed,\r\n height: this.#height,\r\n });\r\n } catch (err) {\r\n this.#log('warn', 'Failed to hydrate persisted state', { error: err });\r\n }\r\n }\r\n\r\n // \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n // Lifecycle\r\n // \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\r\n dispose() {\r\n // StateMachine doesn't hold subscriptions, but future-proof\r\n this.#machine = null;\r\n this.#eventBus = null;\r\n this.#callbacks = null;\r\n }\r\n\r\n // \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n // Private: state entry/exit hooks\r\n // \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\r\n #onEnterDisabled() {\r\n this.#applyVisibility(false, 'disabled');\r\n this.#callbacks.onDisable?.();\r\n this.#callbacks.onPinChanged?.(false);\r\n this.#emitStateChanged();\r\n }\r\n\r\n #onEnterHidden() {\r\n this.#callbacks.onEnable?.();\r\n this.#callbacks.onPinChanged?.(false);\r\n this.#applyVisibility(false, 'hidden');\r\n this.#persistedPinned = false;\r\n this.#persist();\r\n this.#emitStateChanged();\r\n }\r\n\r\n #onEnterOnDemand() {\r\n this.#callbacks.onEnable?.();\r\n this.#callbacks.onPinChanged?.(false);\r\n this.#persistedPinned = false;\r\n this.#persist();\r\n // Derive visibility from current trigger count\r\n this.#syncVisibility('on-demand-entered');\r\n this.#emitStateChanged();\r\n }\r\n\r\n #onExitOnDemand() {\r\n // Nothing to clean up \u2014 triggers are preserved across states\r\n }\r\n\r\n #onEnterPinned() {\r\n this.#callbacks.onEnable?.();\r\n this.#callbacks.onPinChanged?.(true);\r\n this.#persistedPinned = true;\r\n this.#persist();\r\n // Pinned = always visible (unless override).\r\n // #applyVisibility handles onShow \u2192 onVisibilityChanged \u2192 onCollapseChanged.\r\n this.#applyVisibility(true, 'pinned');\r\n this.#emitStateChanged();\r\n }\r\n\r\n // \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n // Private: visibility logic\r\n // \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\r\n /**\r\n * Derive whether the panel should be visible based on FSM state, triggers,\r\n * and overrides. Call the appropriate show/hide callback if changed.\r\n */\r\n #syncVisibility(reason) {\r\n const state = this.getState();\r\n let shouldBeVisible;\r\n\r\n if (state === PANEL_STATES.DISABLED || state === PANEL_STATES.HIDDEN) {\r\n shouldBeVisible = false;\r\n } else if (state === PANEL_STATES.PINNED) {\r\n shouldBeVisible = true;\r\n } else {\r\n // on-demand: visible when triggers are active\r\n shouldBeVisible = this.#triggerCount > 0;\r\n }\r\n\r\n // Override takes precedence\r\n if (this.#overrideHidden) {\r\n shouldBeVisible = false;\r\n }\r\n\r\n this.#applyVisibility(shouldBeVisible, reason);\r\n }\r\n\r\n /**\r\n * Apply visibility change if it differs from current state.\r\n *\r\n * Callback ordering matters:\r\n * 1. onShow/onHide \u2014 basic DOM setup/teardown\r\n * 2. onVisibilityChanged \u2014 toggle button active state (active = visible)\r\n * 3. onCollapseChanged \u2014 override toggle active if collapsed (active = !collapsed)\r\n *\r\n * This ensures collapse-aware panels (flow mode) get the correct toggle state\r\n * while trigger-based panels (ETL) where supportsCollapse=false just use visibility.\r\n */\r\n #applyVisibility(visible, reason) {\r\n if (visible === this.#visible) return;\r\n this.#visible = visible;\r\n\r\n if (visible) {\r\n this.#callbacks.onShow?.(reason);\r\n } else {\r\n this.#callbacks.onHide?.(reason);\r\n }\r\n\r\n this.#callbacks.onVisibilityChanged?.(visible);\r\n\r\n // Restore collapse state when showing (fires after onVisibilityChanged\r\n // so it can override the toggle active state for collapsed panels).\r\n if (visible && this.#supportsCollapse) {\r\n this.#callbacks.onCollapseChanged?.(this.#collapsed, this.#height);\r\n }\r\n\r\n this.#emitBus(`panel:${this.#name}:visibility:changed`, { visible, reason });\r\n this.#log('debug', `Panel ${visible ? 'shown' : 'hidden'}`, { reason });\r\n }\r\n\r\n // \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n // Private: persistence\r\n // \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\r\n #persist() {\r\n try {\r\n if (typeof localStorage === 'undefined') return;\r\n const payload = {\r\n pinned: this.#persistedPinned,\r\n collapsed: this.#collapsed,\r\n height: this.#height,\r\n };\r\n localStorage.setItem(this.#persistenceKey, JSON.stringify(payload));\r\n } catch (err) {\r\n this.#log('warn', 'Failed to persist panel state', { error: err });\r\n }\r\n }\r\n\r\n // \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n // Private: EventBus + logging\r\n // \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\r\n #emitStateChanged() {\r\n const state = this.getState();\r\n const previous = this.#machine.previousState;\r\n this.#emitBus(`panel:${this.#name}:state:changed`, { state, previousState: previous });\r\n }\r\n\r\n #emitBus(event, detail) {\r\n try { this.#eventBus?.emit?.(event, detail); }\r\n catch { /* swallow event handler errors */ }\r\n }\r\n\r\n #log(level, msg, data) {\r\n this.#logger?.[level]?.('panel-fsm', `[${this.#name}] ${msg}`, data);\r\n }\r\n}\r\n", "/**\n * WindowChromeController\n *\n * Handles frameless window management for the desktop application:\n * - Window minimize, maximize, close buttons\n * - Resize handles (edges and corners)\n * - Top bar dragging for window movement\n * - F11 fullscreen toggle\n *\n * Talks to the embedder ONLY through a Host's `window` capability\n * (see ui/js/host/host.js). A host with no `window` capability \u2014 a browser\n * tab, a VS Code webview, the standalone demo \u2014 is legal: we simply don't\n * install custom chrome. That degraded path is also the production path on\n * Linux, macOS and `--browser`, where the OS/browser draws the title bar.\n */\n\nconst SUPPORTS_POINTER = typeof window !== 'undefined' && 'onpointerdown' in window;\nconst MIN_WIDTH = 500;\nconst MIN_HEIGHT = 350;\nconst DRAG_THRESHOLD = 4;\n\nexport class WindowChromeController {\n constructor({ eventBus, logger, host } = {}) {\n this.eventBus = eventBus;\n this.logger = logger || console;\n\n // The host's window capability, or null. Never throw on a missing\n // one \u2014 see the class comment.\n this.win = host?.window || null;\n\n this.resizingActive = false;\n this.lastDblClickTs = 0;\n this.handles = {};\n this.topBar = null;\n\n this._disposed = false;\n this._disposers = [];\n }\n\n /**\n * Initialize the window chrome controller\n */\n initialize() {\n if (this._disposed) return;\n\n if (!this.win || this.win.chrome() !== 'custom') {\n // Native window decorations (Linux/macOS) or the browser already\n // provide a title bar + window controls; our custom chrome would be\n // a redundant second set. Skip it entirely.\n this.logger.info?.('[WindowChrome] Native/browser chrome detected \u2014 custom window chrome disabled');\n return;\n }\n\n this.#wireWindowButtons();\n this.#createResizeHandles();\n this.#wireTopBarDrag();\n this.#wireKeyboardShortcuts();\n this.#wireNativeStateSync();\n this.#initializeState();\n \n this.logger.info?.('[WindowChrome] Initialized');\n }\n\n /**\n * Wire minimize, maximize, close buttons\n */\n #wireWindowButtons() {\n const minBtn = document.getElementById('win-minimize');\n const maxBtn = document.getElementById('win-maximize');\n const closeBtn = document.getElementById('win-close');\n\n if (minBtn) {\n const handler = () => this.win.minimize();\n minBtn.addEventListener('click', handler);\n this._disposers.push(() => minBtn.removeEventListener('click', handler));\n }\n\n if (maxBtn) {\n const handler = async () => {\n try {\n const isMax = await this.win.setMaximized(!(await this.win.isMaximized()));\n this.#updateMaximizeIcon(isMax);\n this.#setResizeHandlesEnabled(!isMax);\n } catch (e) {\n this.logger.warn?.('[WindowChrome] Maximize toggle failed', e);\n }\n };\n maxBtn.addEventListener('click', handler);\n this._disposers.push(() => maxBtn.removeEventListener('click', handler));\n }\n\n if (closeBtn) {\n const handler = () => this.win.close();\n closeBtn.addEventListener('click', handler);\n this._disposers.push(() => closeBtn.removeEventListener('click', handler));\n }\n }\n\n /**\n * Update maximize button icon and body class\n */\n #updateMaximizeIcon(isMax) {\n const maxBtn = document.getElementById('win-maximize');\n if (!maxBtn) return;\n \n const icon = maxBtn.querySelector('.material-symbols-outlined');\n if (icon) {\n icon.textContent = isMax ? 'filter_none' : 'check_box_outline_blank';\n }\n const tooltipText = isMax ? 'Restore' : 'Maximize';\n window.LatexTooltip?.set(maxBtn, tooltipText);\n maxBtn.setAttribute('aria-label', tooltipText);\n \n document.body.classList.toggle('twm-window-maximized', isMax);\n }\n\n /**\n * Enable/disable resize handles\n */\n #setResizeHandlesEnabled(enabled) {\n Object.values(this.handles).forEach(handle => {\n if (handle) {\n handle.style.pointerEvents = enabled ? 'auto' : 'none';\n }\n });\n }\n\n /**\n * Set fullscreen body class\n */\n #setFullscreenClass(isFs) {\n document.body.classList.toggle('window-fullscreen', isFs);\n }\n\n /**\n * Create all resize handles\n */\n #createResizeHandles() {\n const positions = ['right', 'left', 'top', 'bottom'];\n const corners = ['br', 'bl', 'tr', 'tl'];\n\n positions.forEach(pos => {\n const handle = document.createElement('div');\n handle.className = `twm-resize-handle ${pos}`;\n document.body.appendChild(handle);\n this.handles[pos] = handle;\n this.#setupResize(handle, pos);\n });\n\n corners.forEach(corner => {\n const handle = document.createElement('div');\n handle.className = `twm-resize-handle corner ${corner}`;\n document.body.appendChild(handle);\n const mode = 'corner' + corner.toUpperCase();\n this.handles[mode] = handle;\n this.#setupResize(handle, mode);\n });\n }\n\n /**\n * Setup resize behavior for a handle\n */\n #setupResize(handle, mode) {\n let startX = 0, startY = 0, startScreenX = 0, startScreenY = 0;\n let startW = 0, startH = 0, startLeft = 0, startTop = 0;\n let pending = null;\n let rafScheduled = false;\n let lastSent = null;\n\n const boundsEqual = (a, b) => {\n return !!a && !!b && a.x === b.x && a.y === b.y && a.w === b.w && a.h === b.h;\n };\n\n const sendBounds = () => {\n rafScheduled = false;\n if (!pending) return;\n if (lastSent && boundsEqual(lastSent, pending)) return;\n this.win.setBounds({ x: pending.x, y: pending.y, width: pending.w, height: pending.h });\n lastSent = pending;\n };\n\n const scheduleSend = () => {\n if (!rafScheduled) {\n rafScheduled = true;\n requestAnimationFrame(sendBounds);\n }\n };\n\n let activePointerId = null;\n\n const startDrag = async (e) => {\n e.preventDefault();\n this.resizingActive = true;\n startX = e.clientX;\n startY = e.clientY;\n startScreenX = e.screenX ?? startX;\n startScreenY = e.screenY ?? startY;\n\n try {\n const res = await this.win.getBounds();\n if (res) {\n startLeft = typeof res.x === 'number' ? res.x : 0;\n startTop = typeof res.y === 'number' ? res.y : 0;\n startW = res.width || document.documentElement.clientWidth;\n startH = res.height || document.documentElement.clientHeight;\n } else {\n startLeft = 0;\n startTop = 0;\n startW = document.documentElement.clientWidth;\n startH = document.documentElement.clientHeight;\n }\n } catch (e) {\n startLeft = 0;\n startTop = 0;\n startW = document.documentElement.clientWidth;\n startH = document.documentElement.clientHeight;\n }\n\n startLeft = Math.round(startLeft);\n startTop = Math.round(startTop);\n startW = Math.round(startW);\n startH = Math.round(startH);\n pending = null;\n lastSent = null;\n rafScheduled = false;\n\n // Capture pointer for smooth resize even when cursor escapes the handle\n if (SUPPORTS_POINTER && e.pointerId != null && handle.setPointerCapture) {\n try {\n handle.setPointerCapture(e.pointerId);\n activePointerId = e.pointerId;\n } catch (_) {}\n }\n\n if (SUPPORTS_POINTER) {\n window.addEventListener('pointermove', onMove, { passive: false });\n window.addEventListener('pointerup', endDrag, { once: true });\n } else {\n window.addEventListener('mousemove', onMove, { passive: false });\n window.addEventListener('mouseup', endDrag, { once: true });\n }\n };\n\n const onMove = (e) => {\n const sx = e.screenX ?? e.clientX ?? 0;\n const sy = e.screenY ?? e.clientY ?? 0;\n const dx = sx - startScreenX;\n const dy = sy - startScreenY;\n\n let newX = startLeft;\n let newY = startTop;\n let newW = startW;\n let newH = startH;\n\n const isLeft = mode === 'left' || mode === 'cornerBL' || mode === 'cornerTL';\n const isRight = mode === 'right' || mode === 'cornerBR' || mode === 'cornerTR';\n const isTop = mode === 'top' || mode === 'cornerTR' || mode === 'cornerTL';\n const isBottom = mode === 'bottom' || mode === 'cornerBR' || mode === 'cornerBL';\n\n if (isLeft) {\n const candidateWidth = startW - dx;\n newW = Math.max(MIN_WIDTH, candidateWidth);\n const shift = startW - newW;\n newX = startLeft + shift;\n } else if (isRight) {\n newW = Math.max(MIN_WIDTH, startW + dx);\n }\n\n if (isTop) {\n const candidateHeight = startH - dy;\n newH = Math.max(MIN_HEIGHT, candidateHeight);\n const shiftY = startH - newH;\n newY = startTop + shiftY;\n } else if (isBottom) {\n newH = Math.max(MIN_HEIGHT, startH + dy);\n }\n\n newX = Math.round(newX);\n newY = Math.round(newY);\n newW = Math.max(MIN_WIDTH, Math.round(newW));\n newH = Math.max(MIN_HEIGHT, Math.round(newH));\n\n pending = { x: newX, y: newY, w: newW, h: newH };\n scheduleSend();\n };\n\n const endDrag = () => {\n if (SUPPORTS_POINTER) {\n window.removeEventListener('pointermove', onMove);\n } else {\n window.removeEventListener('mousemove', onMove);\n }\n // Release pointer capture\n if (activePointerId != null && handle.releasePointerCapture) {\n try { handle.releasePointerCapture(activePointerId); } catch (_) {}\n activePointerId = null;\n }\n // Flush any pending bounds update that was waiting for rAF\n if (pending && (!lastSent || !boundsEqual(lastSent, pending))) {\n this.win.setBounds({ x: pending.x, y: pending.y, width: pending.w, height: pending.h });\n }\n pending = null;\n lastSent = null;\n this.resizingActive = false;\n };\n\n const event = SUPPORTS_POINTER ? 'pointerdown' : 'mousedown';\n handle.addEventListener(event, startDrag);\n this._disposers.push(() => handle.removeEventListener(event, startDrag));\n }\n\n /**\n * Setup top bar dragging for window movement\n */\n #wireTopBarDrag() {\n this.topBar = document.querySelector('.twm-global-top-bar');\n if (!this.topBar) return;\n\n const NO_DRAG_SELECTOR = '.no-drag, button, input, select, textarea, .menu-item, .menu-dropdown, .window-controls, .panel-toggles, .global-search-dropdown';\n\n let dragging = false;\n let startSX = 0, startSY = 0, startX = null, startY = null, winW = 0, winH = 0;\n let wasMax = false;\n let didRestore = false;\n let grabRatio = 0.5;\n let raf = null;\n let lastSentX = null, lastSentY = null;\n let activePointerId = null;\n\n // Double-click detection (native drag swallows dblclick events)\n const DBL_CLICK_TIME = 500;\n const DBL_CLICK_DIST = 4;\n let lastDownTime = 0;\n let lastDownX = 0;\n let lastDownY = 0;\n\n const isInteractiveTarget = (t) => !!(t && t.closest && t.closest(NO_DRAG_SELECTOR));\n\n const onMove = (e) => {\n // IMPORTANT: This must NOT be async to avoid race conditions on first drag\n const sx = e.screenX ?? e.clientX ?? 0;\n const sy = e.screenY ?? e.clientY ?? 0;\n const dx = Math.abs(sx - startSX);\n const dy = Math.abs(sy - startSY);\n\n if (!dragging) {\n if (wasMax) {\n if ((dx + dy) <= 0) return;\n // Handle restore from maximized state\n if (!didRestore) {\n didRestore = true;\n // Fire-and-forget the restore, then reposition\n this.win.setMaximized(false).then(() => {\n this.#updateMaximizeIcon(false);\n this.#setResizeHandlesEnabled(true);\n return this.win.getBounds();\n }).then((bounds) => {\n if (bounds) {\n const rw = bounds.width || 800;\n const rh = bounds.height || 600;\n const targetX = Math.max(0, Math.round(startSX - (rw * grabRatio)));\n const targetY = Math.max(0, Math.round(sy - 10));\n this.win.setBounds({ x: targetX, y: targetY, width: rw, height: rh });\n startX = targetX;\n startY = targetY;\n winW = rw;\n winH = rh;\n startSX = sx;\n startSY = sy;\n }\n }).catch((err) => {\n this.logger.warn?.('[WindowChrome] Restore on drag failed', err);\n });\n }\n return; // Don't proceed with normal drag until restore completes\n } else {\n if ((dx + dy) < DRAG_THRESHOLD) return;\n // startX/startY should already be set by startDrag - if not, skip this move\n if (startX == null || startY == null) {\n return;\n }\n }\n dragging = true;\n }\n\n // Use the bounds fetched in startDrag (never default to 0)\n if (startX == null || startY == null) return;\n\n const nx = Math.round(startX + (sx - startSX));\n const ny = Math.round(startY + (sy - startSY));\n\n if (lastSentX === nx && lastSentY === ny) return;\n\n if (raf) cancelAnimationFrame(raf);\n raf = requestAnimationFrame(() => {\n lastSentX = nx;\n lastSentY = ny;\n this.win.setBounds({ x: nx, y: ny });\n });\n };\n\n const endDrag = () => {\n dragging = false;\n if (raf) {\n cancelAnimationFrame(raf);\n raf = null;\n }\n if (activePointerId != null && this.topBar.releasePointerCapture) {\n try {\n this.topBar.releasePointerCapture(activePointerId);\n } catch (e) {}\n }\n activePointerId = null;\n didRestore = false;\n\n if (SUPPORTS_POINTER) {\n window.removeEventListener('pointermove', onMove, true);\n window.removeEventListener('pointerup', endDrag, true);\n } else {\n window.removeEventListener('mousemove', onMove, true);\n window.removeEventListener('mouseup', endDrag, true);\n }\n };\n\n const startDrag = async (e) => {\n if (this.resizingActive) return;\n if (isInteractiveTarget(e.target)) return;\n if ((Date.now() - this.lastDblClickTs) < 300) return;\n\n // Detect double-click before entering native drag (which\n // blocks the message loop and prevents dblclick events).\n const now = Date.now();\n const cx = e.clientX ?? 0;\n const cy = e.clientY ?? 0;\n if ((now - lastDownTime) < DBL_CLICK_TIME\n && Math.abs(cx - lastDownX) < DBL_CLICK_DIST\n && Math.abs(cy - lastDownY) < DBL_CLICK_DIST) {\n lastDownTime = 0;\n this.lastDblClickTs = now;\n e.preventDefault();\n try {\n const isMax = await this.win.setMaximized(!(await this.win.isMaximized()));\n this.#updateMaximizeIcon(isMax);\n this.#setResizeHandlesEnabled(!isMax);\n } catch (err) {\n this.logger.warn?.('[WindowChrome] Double-click maximize failed', err);\n }\n return;\n }\n lastDownTime = now;\n lastDownX = cx;\n lastDownY = cy;\n\n try {\n if (!this.win) return;\n\n // \u2500\u2500 Native drag (enables Aero Snap) \u2500\u2500\n // The call blocks until the OS drag loop ends (mouse-up).\n // On return the window has already moved/snapped.\n if (this.win.startNativeDrag) {\n e.preventDefault();\n if (await this.win.startNativeDrag()) {\n // Sync UI state after native drag (may have snapped/maximized)\n try {\n const isMax = await this.win.isMaximized();\n this.#updateMaximizeIcon(isMax);\n this.#setResizeHandlesEnabled(!isMax);\n } catch (_) {}\n return;\n }\n // Native drag unavailable \u2014 fall through to JS drag\n }\n\n // \u2500\u2500 JS drag fallback (non-Windows) \u2500\u2500\n startSX = e.screenX ?? e.clientX ?? 0;\n startSY = e.screenY ?? e.clientY ?? 0;\n\n try {\n wasMax = await this.win.isMaximized();\n } catch (e) {\n wasMax = false;\n }\n\n const barWidth = Math.max(1, window.innerWidth || document.documentElement.clientWidth);\n grabRatio = Math.min(1, Math.max(0, (e.clientX || 0) / barWidth));\n\n if (!wasMax) {\n const bounds = await this.win.getBounds();\n if (bounds) {\n startX = typeof bounds.x === 'number' ? bounds.x : (window.screenX ?? 0);\n startY = typeof bounds.y === 'number' ? bounds.y : (window.screenY ?? 0);\n winW = bounds.width || document.documentElement.clientWidth;\n winH = bounds.height || document.documentElement.clientHeight;\n } else {\n startX = window.screenX ?? 0;\n startY = window.screenY ?? 0;\n winW = document.documentElement.clientWidth;\n winH = document.documentElement.clientHeight;\n }\n }\n\n e.preventDefault();\n\n if (SUPPORTS_POINTER && e.pointerId != null && this.topBar.setPointerCapture) {\n try {\n this.topBar.setPointerCapture(e.pointerId);\n activePointerId = e.pointerId;\n } catch (e) {}\n }\n\n if (SUPPORTS_POINTER) {\n window.addEventListener('pointermove', onMove, true);\n window.addEventListener('pointerup', endDrag, true);\n } else {\n window.addEventListener('mousemove', onMove, true);\n window.addEventListener('mouseup', endDrag, true);\n }\n } catch (err) {\n this.logger.warn?.('[WindowChrome] Start drag failed', err);\n }\n };\n\n // Block drag during resize\n const blocker = (e) => {\n if (this.resizingActive) {\n e.preventDefault();\n e.stopPropagation();\n }\n };\n this.topBar.addEventListener('mousedown', blocker, true);\n this.topBar.addEventListener('pointerdown', blocker, true);\n\n // Double-click to toggle maximize (only on blank surfaces)\n const dblClickHandler = async (e) => {\n // Skip maximize if double-click is on interactive elements\n const interactiveSelector = 'button, input, select, textarea, a, [role=\"button\"], [role=\"menuitem\"], .menu-bar, .fl-bar, .fl-item, .global-search-wrapper, .panel-toggle-btn';\n if (e.target.closest(interactiveSelector)) {\n return;\n }\n\n this.lastDblClickTs = Date.now();\n e.preventDefault();\n e.stopPropagation();\n if (this.resizingActive) return;\n\n try {\n const isMax = await this.win.setMaximized(!(await this.win.isMaximized()));\n this.#updateMaximizeIcon(isMax);\n this.#setResizeHandlesEnabled(!isMax);\n } catch (e) {\n this.logger.warn?.('[WindowChrome] Double-click maximize failed', e);\n }\n };\n this.topBar.addEventListener('dblclick', dblClickHandler);\n\n // Start drag\n const event = SUPPORTS_POINTER ? 'pointerdown' : 'mousedown';\n this.topBar.addEventListener(event, startDrag, false);\n\n this._disposers.push(() => {\n this.topBar.removeEventListener('mousedown', blocker, true);\n this.topBar.removeEventListener('pointerdown', blocker, true);\n this.topBar.removeEventListener('dblclick', dblClickHandler);\n this.topBar.removeEventListener(event, startDrag, false);\n });\n }\n\n /**\n * Listen for browser resize events to sync UI with native state changes\n * (e.g. Win+Arrow maximize/restore, Win+Down minimize).\n */\n #wireNativeStateSync() {\n let syncTimer = null;\n const syncState = async () => {\n if (this.resizingActive || this._disposed) return;\n try {\n if (!this.win) return;\n const isMax = await this.win.isMaximized();\n this.#updateMaximizeIcon(isMax);\n this.#setResizeHandlesEnabled(!isMax);\n } catch (_) {}\n };\n const handler = () => {\n // Debounce: native snap triggers multiple resize events\n clearTimeout(syncTimer);\n syncTimer = setTimeout(syncState, 80);\n };\n window.addEventListener('resize', handler);\n this._disposers.push(() => {\n window.removeEventListener('resize', handler);\n clearTimeout(syncTimer);\n });\n }\n\n /**\n * Wire F11 fullscreen toggle\n */\n #wireKeyboardShortcuts() {\n const handler = async (e) => {\n if (e.code === 'F11') {\n e.preventDefault();\n try {\n const isFs = await this.win.toggleFullscreen();\n this.#setFullscreenClass(isFs);\n const max = await this.win.isMaximized();\n this.#setResizeHandlesEnabled(!(isFs || max));\n } catch (e) {\n this.logger.warn?.('[WindowChrome] F11 toggle failed', e);\n }\n }\n };\n window.addEventListener('keydown', handler, true);\n this._disposers.push(() => window.removeEventListener('keydown', handler, true));\n }\n\n /**\n * Initialize window state on startup\n */\n async #initializeState() {\n try {\n if (!this.win) return;\n\n const isMax = await this.win.isMaximized();\n this.#updateMaximizeIcon(isMax);\n this.#setResizeHandlesEnabled(!isMax);\n\n const isFs = await this.win.isFullscreen();\n this.#setFullscreenClass(isFs);\n if (isFs) this.#setResizeHandlesEnabled(false);\n } catch (e) {\n this.logger.warn?.('[WindowChrome] Initial state check failed', e);\n }\n }\n\n /**\n * Dispose of the controller\n */\n dispose() {\n if (this._disposed) return;\n this._disposed = true;\n\n this._disposers.forEach(dispose => {\n try {\n dispose();\n } catch (e) {}\n });\n this._disposers = [];\n\n // Remove resize handles\n Object.values(this.handles).forEach(handle => {\n if (handle && handle.parentNode) {\n handle.parentNode.removeChild(handle);\n }\n });\n this.handles = {};\n\n this.logger.info?.('[WindowChrome] Disposed');\n }\n}\n", "/**\n * Notification Center (js_new)\n *\n * Purpose\n * -------\n * Unified notifications/toasts/status-line controller consuming events from the rest of the app.\n *\n * Responsibilities\n * - Render queued notifications with namespace context and severity.\n * - Ingest `log:*` and domain-specific events to present user-facing feedback.\n * - Replace scattered `window.notify` / `status_view.js` hooks.\n *\n * Source Material\n * - html/js/status_view.js and ui_manager.js toast helpers.\n * - html/js/ui_utilities.js notification utilities.\n */\nimport { ComponentBase } from './base/component_base.js';\nimport { getSetting } from '../core/settings.js';\n\nconst SEVERITIES = ['info', 'success', 'warn', 'error', 'fatal'];\nconst LOG_SEVERITY_MAP = {\n trace: 'info',\n debug: 'info',\n info: 'info',\n warn: 'warn',\n error: 'error',\n fatal: 'fatal',\n};\n\nconst DEFAULT_LOG_LEVELS = new Set(['warn', 'error', 'fatal']);\n\n// Internal namespace identifiers that should not be shown as toast titles.\n// Messages from these namespaces are self-descriptive and need no category header.\nconst SUPPRESSED_NAMESPACE_TITLES = new Set(['bootstrap', 'app']);\n\nexport class NotificationCenter extends ComponentBase {\n constructor({\n eventBus,\n logger,\n maxVisible = 3,\n historyLimit = 50,\n defaultDurationMs = 6000,\n logLevels = DEFAULT_LOG_LEVELS,\n } = {}) {\n super({ eventBus, logger });\n\n this.maxVisible = maxVisible;\n this.historyLimit = historyLimit;\n this.defaultDurationMs = defaultDurationMs;\n this.logLevels = new Set(logLevels ?? DEFAULT_LOG_LEVELS);\n\n this.notifications = [];\n this.history = [];\n this.sequence = 0;\n this.activeTimers = new Map();\n this.eventDisposers = [];\n\n this.container = null;\n this.rootEl = null;\n this.listEl = null;\n this.liveRegionEl = null;\n }\n\n mount(container, props = {}) {\n // Always mount to document.body for reliable visibility\n // The passed container is ignored - we create our own fixed-position container\n const existingContainer = document.getElementById('notification-center-root');\n if (existingContainer) {\n this.container = existingContainer;\n this.rootEl = existingContainer.querySelector('.twm-notification-center');\n this.listEl = existingContainer.querySelector('.twm-notification-center__list');\n this.liveRegionEl = existingContainer.querySelector('.notification-center__live-region');\n this._mounted = true;\n this.#subscribeEvents();\n return this;\n }\n\n // Create a new fixed-position container directly on body\n this.container = document.createElement('div');\n this.container.id = 'notification-center-root';\n this.container.style.cssText = 'position: fixed; right: 16px; bottom: 24px; z-index: 10000; pointer-events: none;';\n\n this.rootEl = document.createElement('div');\n this.rootEl.className = 'twm-notification-center';\n\n this.listEl = document.createElement('div');\n this.listEl.className = 'twm-notification-center__list';\n\n this.liveRegionEl = document.createElement('div');\n this.liveRegionEl.className = 'notification-center__live-region';\n this.liveRegionEl.setAttribute('aria-live', 'polite');\n this.liveRegionEl.setAttribute('aria-atomic', 'true');\n this.liveRegionEl.style.position = 'absolute';\n this.liveRegionEl.style.width = '1px';\n this.liveRegionEl.style.height = '1px';\n this.liveRegionEl.style.overflow = 'hidden';\n this.liveRegionEl.style.clip = 'rect(1px, 1px, 1px, 1px)';\n\n this.rootEl.appendChild(this.listEl);\n this.rootEl.appendChild(this.liveRegionEl);\n this.container.appendChild(this.rootEl);\n document.body.appendChild(this.container);\n\n this._mounted = true;\n this.#subscribeEvents();\n\n if (Array.isArray(props.initialNotifications)) {\n props.initialNotifications.forEach((notification) => this.show(notification));\n }\n return this;\n }\n\n dispose() {\n this.#clearTimers();\n this.#unsubscribeEvents();\n if (this.rootEl?.parentNode) {\n this.rootEl.parentNode.removeChild(this.rootEl);\n }\n this.container = null;\n this.rootEl = null;\n this.listEl = null;\n this.liveRegionEl = null;\n super.dispose();\n }\n\n show(notification) {\n const normalized = this.#normalizeNotification(notification);\n this.#consoleLog(normalized);\n this.notifications.push(normalized);\n if (this.notifications.length > this.maxVisible) {\n const removed = this.notifications.shift();\n this.#stopTimer(removed.id);\n this.#recordHistory({ ...removed, dismissed: true, reason: 'overflow' });\n }\n\n this.#recordHistory(normalized);\n this.#scheduleAutoDismiss(normalized);\n this.#render();\n this.#announce(normalized);\n return normalized.id;\n }\n\n dismiss(notificationId, reason = 'dismissed') {\n const idx = this.notifications.findIndex((item) => item.id === notificationId);\n if (idx === -1) {\n return false;\n }\n const [removed] = this.notifications.splice(idx, 1);\n this.#stopTimer(notificationId);\n this.#recordHistory({ ...removed, dismissed: true, reason });\n this.#render();\n return true;\n }\n\n /**\n * Update an existing notification's message in place without re-rendering.\n * This prevents the flicker caused by dismiss+show.\n * @param {string} notificationId - The ID of the notification to update\n * @param {Object} updates - Object with fields to update (message, title, etc.)\n * @returns {boolean} True if the notification was found and updated\n */\n update(notificationId, updates = {}) {\n const notification = this.notifications.find((item) => item.id === notificationId);\n if (!notification) {\n return false;\n }\n\n // Update allowed fields\n if (updates.message !== undefined) notification.message = updates.message;\n if (updates.title !== undefined) notification.title = updates.title;\n if (updates.severity !== undefined) notification.severity = this.#normalizeSeverity(updates.severity);\n if (updates.meta !== undefined) notification.meta = updates.meta;\n\n // Update the DOM directly without full re-render\n const notificationEl = this.listEl?.querySelector(`[data-notification-id=\"${notificationId}\"]`);\n if (notificationEl) {\n const bodyEl = notificationEl.querySelector('.twm-notification__body');\n if (bodyEl && updates.message !== undefined) {\n bodyEl.textContent = updates.message;\n }\n const titleEl = notificationEl.querySelector('.twm-notification__title');\n if (titleEl && updates.title !== undefined) {\n titleEl.textContent = updates.title;\n }\n } else {\n // Fallback to full re-render if DOM element not found\n this.#render();\n }\n\n return true;\n }\n\n clearAll(reason = 'cleared') {\n [...this.notifications].forEach((notification) => this.dismiss(notification.id, reason));\n }\n\n ingestLogEntry(entry) {\n if (!entry || !this.logLevels.has(entry.level)) {\n return;\n }\n\n // Suppress state-guard warnings - these are internal and would cause a cascade\n // (NotificationCenter renders -> triggers state-guard -> logs warning -> creates notification -> repeat)\n if (entry.namespace === 'state-guard') {\n return;\n }\n\n const severity = LOG_SEVERITY_MAP[entry.level] ?? 'info';\n const suppressTitle = SUPPRESSED_NAMESPACE_TITLES.has(entry.namespace);\n const title = suppressTitle\n ? null\n : NotificationCenter.#formatNamespaceTitle(entry.namespace);\n // Info-level log entries from internal namespaces are noise in history\n const skipHistory = severity === 'info' && suppressTitle;\n this.show({\n title,\n message: entry.message,\n severity,\n namespace: entry.namespace,\n meta: entry.data,\n skipHistory,\n });\n }\n\n #consoleLog(notification) {\n if (notification.severity !== 'warn' && notification.severity !== 'error' && notification.severity !== 'fatal') {\n return;\n }\n const method = notification.severity === 'warn' ? console.warn : console.error; // eslint-disable-line no-console\n const prefix = notification.title ? `[${notification.title}]` : '[Notification]';\n const details = notification.meta ?? notification.description ?? '';\n method(`${prefix} ${notification.message}`, details); // eslint-disable-line no-console\n }\n\n #normalizeNotification(notification) {\n if (!notification) {\n throw new TypeError('Notification payload is required');\n }\n const id = notification.id ?? `notification-${++this.sequence}`;\n const severity = this.#normalizeSeverity(notification.severity ?? 'info');\n return {\n id,\n title: notification.title ?? null,\n message: notification.message ?? '',\n description: notification.description ?? null,\n timestamp: notification.timestamp ?? Date.now(),\n severity,\n namespace: notification.namespace ?? null,\n durationMs: this.#coerceDuration(notification.durationMs),\n persistent: Boolean(notification.persistent),\n skipHistory: Boolean(notification.skipHistory),\n actions: this.#normalizeActions(notification.actions),\n meta: notification.meta ?? null,\n };\n }\n\n #normalizeSeverity(severity) {\n const value = typeof severity === 'string' ? severity.toLowerCase() : 'info';\n if (!SEVERITIES.includes(value)) {\n return 'info';\n }\n return value;\n }\n\n #coerceDuration(duration) {\n if (duration === null || duration === undefined) {\n return this.defaultDurationMs;\n }\n const value = Number(duration);\n if (!Number.isFinite(value) || value < 0) {\n return this.defaultDurationMs;\n }\n return value;\n }\n\n toast(title, message, type = 'info') {\n // Legacy compatibility method\n this.show({\n title,\n message,\n severity: type,\n persistent: type === 'error' || type === 'fatal',\n });\n }\n\n error(titleOrMessage, message) {\n const hasTitle = message !== undefined;\n return this.show({\n title: hasTitle ? titleOrMessage : null,\n message: hasTitle ? message : titleOrMessage,\n severity: 'error',\n persistent: true,\n });\n }\n\n warn(titleOrMessage, message) {\n const hasTitle = message !== undefined;\n return this.show({\n title: hasTitle ? titleOrMessage : null,\n message: hasTitle ? message : titleOrMessage,\n severity: 'warn',\n });\n }\n\n info(titleOrMessage, message) {\n const hasTitle = message !== undefined;\n return this.show({\n title: hasTitle ? titleOrMessage : null,\n message: hasTitle ? message : titleOrMessage,\n severity: 'info',\n });\n }\n\n success(titleOrMessage, message) {\n const hasTitle = message !== undefined;\n return this.show({\n title: hasTitle ? titleOrMessage : null,\n message: hasTitle ? message : titleOrMessage,\n severity: 'success',\n });\n }\n\n #normalizeActions(actions) {\n if (!Array.isArray(actions) || actions.length === 0) {\n return [];\n }\n return actions.map((action, idx) => ({\n id: action.id ?? `action-${idx}`,\n label: action.label ?? 'Action',\n handler: typeof action.handler === 'function' ? action.handler : null,\n eventName: action.eventName ?? null,\n payload: action.payload ?? null,\n }));\n }\n\n #scheduleAutoDismiss(notification) {\n if (notification.persistent || notification.durationMs === 0) {\n return;\n }\n const timer = setTimeout(() => {\n this.dismiss(notification.id, 'timeout');\n }, notification.durationMs);\n this.activeTimers.set(notification.id, timer);\n }\n\n #stopTimer(notificationId) {\n const timer = this.activeTimers.get(notificationId);\n if (timer) {\n clearTimeout(timer);\n this.activeTimers.delete(notificationId);\n }\n }\n\n #clearTimers() {\n this.activeTimers.forEach((timer) => clearTimeout(timer));\n this.activeTimers.clear();\n }\n\n #recordHistory(entry) {\n if (entry.skipHistory) return;\n this.history.push(entry);\n if (this.history.length > this.historyLimit) {\n this.history.shift();\n }\n }\n\n #render() {\n if (!this._mounted || !this.listEl) {\n return;\n }\n this.listEl.innerHTML = '';\n const fragment = document.createDocumentFragment();\n\n this.notifications.forEach((notification) => {\n const item = document.createElement('div');\n item.className = `notification notification--${notification.severity}`;\n // Use setAttribute to avoid StateGuard blocking dataset mutations\n item.setAttribute('data-notification-id', notification.id);\n\n const header = document.createElement('div');\n header.className = 'twm-notification__header';\n if (notification.title) {\n const titleEl = document.createElement('span');\n titleEl.className = 'twm-notification__title';\n titleEl.textContent = notification.title;\n header.appendChild(titleEl);\n }\n\n const timeEl = document.createElement('span');\n timeEl.className = 'twm-notification__timestamp';\n timeEl.textContent = this.#formatTimestamp(notification.timestamp);\n header.appendChild(timeEl);\n\n const closeBtn = document.createElement('button');\n closeBtn.className = 'twm-notification__close';\n closeBtn.type = 'button';\n closeBtn.setAttribute('aria-label', 'Dismiss notification');\n closeBtn.innerHTML = '<span class=\"material-symbols-outlined\">close</span>';\n closeBtn.addEventListener('click', () => this.dismiss(notification.id, 'manual'));\n header.appendChild(closeBtn);\n item.appendChild(header);\n\n const body = document.createElement('div');\n body.className = 'twm-notification__body';\n body.textContent = notification.message;\n item.appendChild(body);\n\n if (notification.description) {\n const descriptionEl = document.createElement('div');\n descriptionEl.className = 'twm-notification__description';\n descriptionEl.textContent = notification.description;\n item.appendChild(descriptionEl);\n }\n\n if (notification.actions.length > 0) {\n const actionsEl = document.createElement('div');\n actionsEl.className = 'twm-notification__actions';\n notification.actions.forEach((action) => {\n const button = document.createElement('button');\n button.type = 'button';\n button.className = 'twm-notification__action-btn';\n button.textContent = action.label;\n button.addEventListener('click', () => {\n try {\n if (action.handler) {\n action.handler(notification, action);\n } else if (action.eventName && this.eventBus) {\n this.eventBus.emit(action.eventName, action.payload ?? { notificationId: notification.id });\n }\n } catch (err) {\n this.logger?.error?.('twm-notification-center', 'Notification action failed', { err });\n } finally {\n // Don't auto-dismiss error/fatal notifications after action clicks\n if (notification.severity !== 'error' && notification.severity !== 'fatal') {\n this.dismiss(notification.id, 'action');\n }\n }\n });\n actionsEl.appendChild(button);\n });\n item.appendChild(actionsEl);\n }\n\n item.addEventListener('click', (event) => {\n if (event.target.closest('button')) {\n return;\n }\n this.dismiss(notification.id, 'click');\n });\n\n fragment.appendChild(item);\n });\n\n this.listEl.appendChild(fragment);\n }\n\n #formatTimestamp(timestamp) {\n const date = new Date(timestamp);\n return date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', second: '2-digit' });\n }\n\n #announce(notification) {\n if (!this.liveRegionEl) {\n return;\n }\n const parts = [notification.title, notification.message].filter(Boolean);\n this.liveRegionEl.textContent = parts.join(': ');\n }\n\n #handleToast(payload = {}) {\n const message = payload.text ?? payload.message ?? (typeof payload === 'string' ? payload : '');\n if (!message) {\n return;\n }\n\n const persistent = payload.persistent === true || payload.autoHide === false;\n const durationMs = persistent ? 0 : (payload.durationMs ?? payload.duration ?? payload.timeout);\n this.show({\n title: payload.title ?? null,\n message,\n severity: payload.type ?? payload.severity ?? 'info',\n durationMs,\n persistent,\n namespace: payload.namespace ?? null,\n actions: payload.actions,\n meta: payload.meta ?? null,\n });\n }\n\n #subscribeEvents() {\n if (!this.eventBus) {\n return;\n }\n this.eventDisposers.push(\n this.eventBus.on('toast:show', (payload) => this.#handleToast(payload)),\n this.eventBus.on('notification:show', (payload) => this.show(payload)),\n this.eventBus.on('notification:update', (payload) => {\n if (payload?.id) {\n this.update(payload.id, payload);\n }\n }),\n this.eventBus.on('log:entry', (entry) => this.ingestLogEntry(entry)),\n this.eventBus.on('workspace:save:failed', (payload) => {\n // Error toasts are shown by default unless explicitly disabled\n if (getSetting('workspace.save.showErrorToast', true)) {\n this.show({\n title: 'Workspace Save Failed',\n message: payload?.reason ? `Save failed: ${payload.reason}` : 'Workspace save failed',\n severity: 'error',\n meta: payload,\n persistent: true,\n });\n }\n }),\n this.eventBus.on('workspace:save:completed', (payload) => {\n // Only show toast if enabled in settings\n if (getSetting('workspace.save.showToast', false)) {\n this.show({\n title: 'Workspace Saved',\n message: 'Changes saved successfully',\n severity: 'success',\n durationMs: 3000,\n meta: payload,\n skipHistory: true,\n });\n }\n }),\n this.eventBus.on('workspace:import:failed', (payload) => {\n // Error toasts are shown by default unless explicitly disabled\n if (getSetting('workspace.import.showErrorToast', true)) {\n this.show({\n title: 'Workspace Import Failed',\n message: payload?.error?.message || 'Import failed',\n severity: 'error',\n meta: payload,\n persistent: true,\n });\n }\n }),\n this.eventBus.on('workspace:import:completed', (payload) => {\n // Show import completion toast if enabled in settings\n if (getSetting('workspace.import.showToast', true)) {\n this.show({\n title: 'Workspace Ready',\n message: 'Workspace import completed',\n severity: 'success',\n durationMs: 3000,\n meta: payload,\n skipHistory: true,\n });\n }\n }),\n );\n }\n\n #unsubscribeEvents() {\n this.eventDisposers.forEach((disposer) => {\n try {\n disposer?.dispose?.();\n } catch (err) {\n this.logger?.warn?.('twm-notification-center', 'Failed to remove event listener', { err });\n }\n });\n this.eventDisposers = [];\n }\n\n static #formatNamespaceTitle(namespace) {\n if (!namespace) return null;\n return namespace\n .split(/[-_]/)\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(' ');\n }\n}\n\nNotificationCenter.SEVERITIES = SEVERITIES;\n", "/**\n * Overlay scrollbar utilities for the js_new UI stack.\n * Ports the unified hover-only scrollbar system from the legacy UI manager.\n */\n\nimport { createRafResizeObserver } from './raf_resize_observer.js';\n\nfunction normalizeOrientation(value) {\n return String(value || 'horizontal').toLowerCase() === 'vertical' ? 'vertical' : 'horizontal';\n}\n\nfunction ensureInstallState(container) {\n if (!container.__overlayScrollbarInstalled) {\n Object.defineProperty(container, '__overlayScrollbarInstalled', {\n value: {},\n writable: true,\n configurable: true,\n });\n }\n}\n\nexport function installOverlayScrollbar(container, options = {}) {\n if (!container) return null;\n\n const orientation = normalizeOrientation(options.orientation);\n const className = options.className || 'overlay-scrollbar';\n const isHorizontal = orientation !== 'vertical';\n const orientationKey = isHorizontal ? 'horizontal' : 'vertical';\n\n ensureInstallState(container);\n if (container.__overlayScrollbarInstalled[orientationKey]) {\n return container.__overlayScrollbarInstalled[orientationKey];\n }\n\n if (options.setOverflow !== false) {\n container.style.overflow = options.overflow || 'auto';\n }\n if (options.setPosition !== false && getComputedStyle(container).position === 'static') {\n container.style.position = 'relative';\n }\n\n // When externalBar is true, place the bar on the parent element instead of\n // inside the scroll container. This avoids overflow clipping issues in certain\n // flex+overflow layouts (e.g. bottom-tabs-header .tabs).\n const externalBar = !!options.externalBar;\n const barHost = externalBar ? container.parentElement : container;\n if (externalBar && barHost && getComputedStyle(barHost).position === 'static') {\n barHost.style.position = 'relative';\n }\n\n const bar = document.createElement('div');\n bar.className = className;\n bar.classList.add(`overlay-scrollbar-${isHorizontal ? 'h' : 'v'}`);\n const track = document.createElement('div');\n track.className = 'track';\n const thumb = document.createElement('div');\n thumb.className = 'thumb';\n bar.appendChild(track);\n bar.appendChild(thumb);\n (barHost || container).appendChild(bar);\n\n const getScrollProps = () => ({\n scrollSize: isHorizontal ? container.scrollWidth : container.scrollHeight,\n clientSize: isHorizontal ? container.clientWidth : container.clientHeight,\n scrollPos: isHorizontal ? (container.scrollLeft || 0) : (container.scrollTop || 0),\n });\n\n // Dragging and hover state - must be declared early so event handlers can access it\n let dragging = false;\n let hovered = false;\n let startPos = 0;\n let thumbStartPos = 0;\n\n let previousHasOverflow = null;\n let previousClientSize = null;\n let isResettingScroll = false;\n\n const update = () => {\n if (isResettingScroll) return;\n\n const { scrollSize, clientSize, scrollPos } = getScrollProps();\n const scrollLeft = container.scrollLeft || 0;\n const scrollTop = container.scrollTop || 0;\n const maxScroll = scrollSize - clientSize;\n const hasOverflow = maxScroll > 2;\n\n if (previousClientSize !== null && clientSize > previousClientSize && hasOverflow && scrollPos > 0) {\n const delta = clientSize - previousClientSize;\n const targetScroll = Math.max(0, scrollPos - delta);\n if (targetScroll !== scrollPos) {\n isResettingScroll = true;\n if (isHorizontal) {\n container.scrollLeft = targetScroll;\n } else {\n container.scrollTop = targetScroll;\n }\n requestAnimationFrame(() => {\n isResettingScroll = false;\n update();\n });\n previousClientSize = clientSize;\n previousHasOverflow = hasOverflow;\n return;\n }\n }\n\n previousClientSize = clientSize;\n\n if (previousHasOverflow === true && !hasOverflow && scrollPos > 0) {\n isResettingScroll = true;\n if (isHorizontal) {\n container.scrollLeft = 0;\n } else {\n container.scrollTop = 0;\n }\n requestAnimationFrame(() => {\n isResettingScroll = false;\n update();\n });\n previousHasOverflow = hasOverflow;\n return;\n }\n\n const clampedMaxScroll = Math.max(0, maxScroll);\n if (hasOverflow && scrollPos > clampedMaxScroll) {\n isResettingScroll = true;\n if (isHorizontal) {\n container.scrollLeft = clampedMaxScroll;\n } else {\n container.scrollTop = clampedMaxScroll;\n }\n requestAnimationFrame(() => {\n isResettingScroll = false;\n update();\n });\n previousHasOverflow = hasOverflow;\n return;\n }\n previousHasOverflow = hasOverflow;\n\n container.dataset.scrollable = hasOverflow ? '1' : '0';\n\n // Position the bar at the scroll viewport edge.\n if (externalBar) {\n // Bar lives on the parent element \u2014 position using container's offset.\n // No scroll-offset compensation needed since bar is outside scroll context.\n if (isHorizontal) {\n bar.style.left = `${container.offsetLeft}px`;\n bar.style.bottom = 'auto';\n bar.style.top = `${container.offsetTop + container.offsetHeight - 6}px`;\n bar.style.width = `${container.clientWidth}px`;\n } else {\n bar.style.top = `${container.offsetTop}px`;\n bar.style.right = 'auto';\n bar.style.left = `${container.offsetLeft + container.offsetWidth - 6}px`;\n bar.style.height = `${container.clientHeight}px`;\n }\n } else {\n // Bar lives inside the container \u2014 compensate for scroll offset\n // on BOTH axes so the bar stays pinned to the viewport edge.\n if (isHorizontal) {\n bar.style.left = `${scrollLeft}px`;\n bar.style.top = `${scrollTop + container.clientHeight - bar.offsetHeight}px`;\n bar.style.bottom = 'auto';\n bar.style.width = `${clientSize}px`;\n } else {\n bar.style.top = `${scrollTop}px`;\n bar.style.left = `${scrollLeft + container.clientWidth - bar.offsetWidth}px`;\n bar.style.right = 'auto';\n bar.style.height = `${clientSize}px`;\n }\n }\n\n if (!hasOverflow) {\n bar.style.opacity = '0';\n bar.style.pointerEvents = 'none';\n thumb.style[isHorizontal ? 'width' : 'height'] = '0px';\n thumb.style[isHorizontal ? 'left' : 'top'] = '0px';\n return;\n }\n\n // Don't hide while dragging or hovering\n if (!dragging && !hovered) {\n bar.style.opacity = '0'; // hidden until hover\n bar.style.pointerEvents = 'none';\n }\n\n const ratio = clientSize / scrollSize;\n const thumbSize = Math.max(30, Math.floor(ratio * clientSize));\n const maxThumbPos = clientSize - thumbSize;\n const scrollRatio = maxScroll > 0 ? scrollPos / maxScroll : 0;\n const thumbPos = Math.round(maxThumbPos * scrollRatio);\n\n if (isHorizontal) {\n thumb.style.width = `${thumbSize}px`;\n thumb.style.left = `${thumbPos}px`;\n } else {\n thumb.style.height = `${thumbSize}px`;\n thumb.style.top = `${thumbPos}px`;\n }\n };\n\n const onScroll = () => update();\n container.addEventListener('scroll', onScroll, { passive: true });\n \n // Manage hover visibility entirely in JS to avoid CSS specificity issues.\n // Show bar on mouseenter if scrollable, hide on mouseleave.\n const onMouseEnter = () => {\n hovered = true;\n update();\n if (container.dataset.scrollable === '1') {\n bar.style.opacity = '1';\n bar.style.pointerEvents = '';\n }\n };\n const onMouseLeave = () => {\n hovered = false;\n // Don't hide while dragging\n if (dragging) return;\n bar.style.opacity = '0';\n bar.style.pointerEvents = 'none';\n };\n container.addEventListener('mouseenter', onMouseEnter, { passive: true });\n container.addEventListener('mouseleave', onMouseLeave, { passive: true });\n // When bar is external (sibling of container), also listen for hover on the bar\n // itself so moving the mouse to the thumb doesn't trigger a hide.\n if (externalBar) {\n bar.addEventListener('mouseenter', onMouseEnter, { passive: true });\n bar.addEventListener('mouseleave', onMouseLeave, { passive: true });\n }\n\n // Also handle focus-within for keyboard accessibility\n container.addEventListener('focusin', onMouseEnter, { passive: true });\n container.addEventListener('focusout', onMouseLeave, { passive: true });\n\n const resizeObserver = createRafResizeObserver(update);\n try { resizeObserver.observe(container); } catch (_) {}\n\n const mo = new MutationObserver(update);\n try { mo.observe(container, { childList: true, subtree: options.watchSubtree !== false }); } catch (_) {}\n\n let resizeTimeout;\n const onWindowResize = () => {\n update();\n clearTimeout(resizeTimeout);\n resizeTimeout = setTimeout(update, 150);\n };\n window.addEventListener('resize', onWindowResize, { passive: true });\n\n const onMouseDown = (e) => {\n dragging = true;\n startPos = isHorizontal ? e.clientX : e.clientY;\n thumbStartPos = parseFloat(thumb.style[isHorizontal ? 'left' : 'top']) || 0;\n // Keep bar visible while dragging\n bar.style.opacity = '1';\n bar.style.pointerEvents = '';\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp, { once: true });\n e.preventDefault();\n e.stopPropagation();\n };\n\n const onMouseMove = (e) => {\n if (!dragging) return;\n e.preventDefault();\n\n const { scrollSize, clientSize } = getScrollProps();\n const maxScroll = scrollSize - clientSize;\n if (maxScroll <= 0) return;\n\n const thumbSize = parseFloat(thumb.style[isHorizontal ? 'width' : 'height']) || 30;\n const maxThumbPos = clientSize - thumbSize;\n\n const delta = (isHorizontal ? e.clientX : e.clientY) - startPos;\n let newThumbPos = thumbStartPos + delta;\n newThumbPos = Math.max(0, Math.min(maxThumbPos, newThumbPos));\n\n const thumbRatio = maxThumbPos > 0 ? newThumbPos / maxThumbPos : 0;\n if (isHorizontal) {\n container.scrollLeft = thumbRatio * maxScroll;\n } else {\n container.scrollTop = thumbRatio * maxScroll;\n }\n };\n\n const onMouseUp = () => {\n dragging = false;\n document.removeEventListener('mousemove', onMouseMove);\n // Check if mouse is still over container - if not, hide the bar\n const rect = container.getBoundingClientRect();\n const isMouseOver = document.elementsFromPoint(\n (rect.left + rect.right) / 2,\n (rect.top + rect.bottom) / 2\n ).includes(container);\n if (!isMouseOver) {\n bar.style.opacity = '0';\n bar.style.pointerEvents = 'none';\n }\n };\n\n thumb.addEventListener('mousedown', onMouseDown);\n\n // Wheel-to-horizontal: convert vertical wheel into horizontal scroll,\n // but only when the container has no vertical overflow (otherwise let\n // the browser handle normal vertical scrolling).\n let onWheel = null;\n if (isHorizontal) {\n onWheel = (e) => {\n const { scrollSize, clientSize } = getScrollProps();\n if (scrollSize <= clientSize) return;\n if (Math.abs(e.deltaX) > Math.abs(e.deltaY)) return;\n // If the container also scrolls vertically, don't hijack the wheel\n if (container.scrollHeight > container.clientHeight) return;\n e.preventDefault();\n container.scrollLeft += e.deltaY;\n };\n container.addEventListener('wheel', onWheel, { passive: false });\n }\n\n requestAnimationFrame(() => {\n requestAnimationFrame(update);\n });\n setTimeout(update, 50);\n\n const cleanup = () => {\n container.removeEventListener('scroll', onScroll);\n container.removeEventListener('mouseenter', onMouseEnter);\n container.removeEventListener('mouseleave', onMouseLeave);\n container.removeEventListener('focusin', onMouseEnter);\n container.removeEventListener('focusout', onMouseLeave);\n if (externalBar) {\n bar.removeEventListener('mouseenter', onMouseEnter);\n bar.removeEventListener('mouseleave', onMouseLeave);\n }\n if (onWheel) container.removeEventListener('wheel', onWheel);\n window.removeEventListener('resize', onWindowResize);\n try { resizeObserver.disconnect(); } catch (_) {}\n try { mo.disconnect(); } catch (_) {}\n bar.remove();\n };\n\n const handle = { update, cleanup, bar, thumb };\n container.__overlayScrollbarInstalled[orientationKey] = handle;\n return handle;\n}\n\nexport function installWorkspaceScrollbars(workspace, options = {}) {\n if (!workspace) return null;\n if (workspace.__workspaceOverlayScrollbarsInstalled) return workspace.__workspaceOverlayScrollbarsUpdate;\n\n installOverlayScrollbar(workspace, {\n orientation: 'vertical',\n className: options.verticalClass || 'panel-scrollbar',\n watchSubtree: options.watchSubtree ?? true,\n });\n installOverlayScrollbar(workspace, {\n orientation: 'horizontal',\n className: options.horizontalClass || 'tabs-scrollbar',\n watchSubtree: options.watchSubtree ?? true,\n });\n\n const update = () => {\n const maxX = Math.max(0, workspace.scrollWidth - workspace.clientWidth);\n const maxY = Math.max(0, workspace.scrollHeight - workspace.clientHeight);\n workspace.dataset.scrollableX = maxX > 1 ? '1' : '0';\n workspace.dataset.scrollableY = maxY > 1 ? '1' : '0';\n };\n\n workspace.__workspaceOverlayScrollbarsInstalled = true;\n workspace.__workspaceOverlayScrollbarsUpdate = update;\n workspace.addEventListener('scroll', update, { passive: true });\n const ro = createRafResizeObserver(update);\n try { ro.observe(workspace); } catch (_) {}\n const mo = new MutationObserver(update);\n try { mo.observe(workspace, { childList: true, subtree: true }); } catch (_) {}\n requestAnimationFrame(update);\n return update;\n}\n\n/**\n * Auto-discover and install vertical overlay scrollbars on `.collapsible-content.visible`\n * elements inside `#fixed-200`. Uses a MutationObserver to handle dynamically created\n * content (pages mount lazily) and class toggles (expand/collapse).\n *\n * Only adds the visual overlay bar \u2014 does NOT change overflow. Elements that are already\n * scrollable via CSS (e.g. accordion `.collapsible-content.visible { overflow-y: auto }`)\n * get the bar; non-scrollable elements get a no-op bar that stays hidden.\n *\n * @returns {Function} disconnect \u2014 stops watching\n */\nexport function installCollapsibleScrollbars() {\n const installOnElement = (el) => {\n installOverlayScrollbar(el, {\n orientation: 'vertical',\n setOverflow: false,\n watchSubtree: true,\n });\n };\n\n const root = document.getElementById('twm-fixed-200');\n if (root) {\n root.querySelectorAll('.twm-collapsible-content.visible').forEach(installOnElement);\n }\n\n // Watch for new elements AND class changes (visible toggled by toggleCategory)\n const observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n // Class change \u2014 check if .collapsible-content just gained .visible\n if (mutation.type === 'attributes' && mutation.attributeName === 'class') {\n const el = mutation.target;\n if (el.classList.contains('twm-collapsible-content') && el.classList.contains('visible')) {\n installOnElement(el);\n }\n continue;\n }\n // New subtrees added (lazy page mount)\n for (const node of mutation.addedNodes) {\n if (node.nodeType !== 1) continue;\n if (node.classList?.contains('twm-collapsible-content') && node.classList?.contains('visible')) {\n installOnElement(node);\n }\n node.querySelectorAll?.('.twm-collapsible-content.visible')?.forEach(installOnElement);\n }\n }\n });\n\n const target = root || document.body;\n observer.observe(target, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['class'],\n });\n return () => observer.disconnect();\n}\n\n/**\n * Auto-discover and install horizontal overlay scrollbars on tab strips.\n *\n * Uses a MutationObserver so dynamically created tab strips are picked up\n * without per-page manual setup.\n *\n * The selector list used to be hardcoded as `.tabs, .scenario-detail-tabs`, so\n * a generic scrollbar utility carried the name of one EcoAgent page's tab bar.\n * The caller names its own strips now.\n *\n * @param {string[]} [selectors=['.tabs']] Which elements count as a tab strip.\n * @returns {Function} disconnect \u2014 stops watching for new tabs\n */\nexport function installTabsScrollbars(selectors = ['.tabs']) {\n const selector = selectors.join(', ');\n const classes = selectors\n .filter((s) => s.startsWith('.'))\n .map((s) => s.slice(1));\n const installOnElement = (el) => {\n installOverlayScrollbar(el, {\n orientation: 'horizontal',\n className: 'tabs-scrollbar',\n setOverflow: false,\n externalBar: true,\n watchSubtree: true,\n });\n };\n\n const cleanupElement = (el) => {\n el.__overlayScrollbarInstalled?.horizontal?.cleanup?.();\n delete el.__overlayScrollbarInstalled;\n };\n\n const matches = (el) => classes.some((c) => el.classList?.contains(c));\n\n document.querySelectorAll(selector).forEach(installOnElement);\n\n // Watch for dynamically added/removed elements\n const observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n for (const node of mutation.addedNodes) {\n if (node.nodeType !== 1) continue;\n if (matches(node)) installOnElement(node);\n node.querySelectorAll?.(selector)?.forEach(installOnElement);\n }\n for (const node of mutation.removedNodes) {\n if (node.nodeType !== 1) continue;\n if (matches(node)) cleanupElement(node);\n node.querySelectorAll?.(selector)?.forEach(cleanupElement);\n }\n }\n });\n\n observer.observe(document.body, { childList: true, subtree: true });\n return () => observer.disconnect();\n}\n", "/**\n * tooltip_service.js\n *\n * JS-driven tooltip system for elements with `has-tooltip` class and `data-tooltip` attribute.\n * Also supports LaTeX tooltips with `has-latex-tooltip` and `data-latex-tooltip`.\n *\n * This replaces CSS-based ::after pseudo-element tooltips for better stacking context\n * and dynamic content support.\n */\n\nlet tooltipElement = null;\nlet currentTarget = null;\nlet listenersAttached = false;\nlet mouseCheckInterval = null;\nlet lastMousePosition = { x: 0, y: 0 };\n\n/**\n * Create or get the tooltip DOM element.\n * @returns {HTMLElement}\n */\nfunction createTooltipElement() {\n if (tooltipElement) return tooltipElement;\n\n tooltipElement = document.createElement('div');\n tooltipElement.className = 'twm-latex-tooltip';\n document.body.appendChild(tooltipElement);\n return tooltipElement;\n}\n\n/**\n * Position the tooltip relative to target element with smart auto-positioning.\n * Automatically flips placement if tooltip would extend outside viewport.\n * @param {HTMLElement} target - Element to position near\n * @param {HTMLElement} tooltip - Tooltip element\n */\nfunction positionTooltip(target, tooltip) {\n const rect = target.getBoundingClientRect();\n const tooltipRect = tooltip.getBoundingClientRect();\n const gap = 12;\n const margin = 10; // Minimum distance from viewport edge\n\n // Get requested placement from data attributes or context\n const requestedPlacement = (target.dataset?.tooltipPlacement || target.getAttribute('data-tooltip-placement') || '').toLowerCase() ||\n (target.dataset?.latexPlacement || target.getAttribute('data-latex-placement') || '').toLowerCase() ||\n (target.closest('.twm-global-top-bar') ? 'bottom' : (target.closest('.twm-fl-bar') ? 'right' : 'top'));\n\n // Auto-positioning: determine best placement based on available space\n let placement = requestedPlacement || 'top';\n\n // Check if explicit placement is set (not auto)\n const isExplicitPlacement = target.hasAttribute('data-tooltip-placement') ||\n target.hasAttribute('data-latex-placement');\n\n if (!isExplicitPlacement) {\n // Calculate available space in each direction\n const spaceAbove = rect.top - margin;\n const spaceBelow = window.innerHeight - rect.bottom - margin;\n const spaceLeft = rect.left - margin;\n const spaceRight = window.innerWidth - rect.right - margin;\n\n // Auto-select placement based on available space\n if (placement === 'top' && tooltipRect.height > spaceAbove && spaceBelow > spaceAbove) {\n placement = 'bottom';\n } else if (placement === 'bottom' && tooltipRect.height > spaceBelow && spaceAbove > spaceBelow) {\n placement = 'top';\n } else if (placement === 'left' && tooltipRect.width > spaceLeft && spaceRight > spaceLeft) {\n placement = 'right';\n } else if (placement === 'right' && tooltipRect.width > spaceRight && spaceLeft > spaceRight) {\n placement = 'left';\n }\n }\n\n // Calculate position based on final placement\n let left, top;\n\n if (placement === 'top') {\n left = rect.left + (rect.width / 2) - (tooltipRect.width / 2);\n top = rect.top - tooltipRect.height - gap;\n } else if (placement === 'bottom') {\n left = rect.left + (rect.width / 2) - (tooltipRect.width / 2);\n top = rect.bottom + gap;\n } else if (placement === 'left') {\n left = rect.left - tooltipRect.width - gap;\n top = rect.top + (rect.height / 2) - (tooltipRect.height / 2);\n } else if (placement === 'right') {\n left = rect.right + gap;\n top = rect.top + (rect.height / 2) - (tooltipRect.height / 2);\n }\n\n // Clamp to viewport\n const clampedLeft = Math.max(margin, Math.min(left, window.innerWidth - tooltipRect.width - margin));\n const clampedTop = Math.max(margin, Math.min(top, window.innerHeight - tooltipRect.height - margin));\n\n tooltip.style.left = `${clampedLeft}px`;\n tooltip.style.top = `${clampedTop}px`;\n\n // Calculate notch/arrow offset to point toward the target element center\n const targetCenterX = rect.left + rect.width / 2;\n const targetCenterY = rect.top + rect.height / 2;\n let notchOffset = 0;\n\n if (placement === 'top' || placement === 'bottom') {\n // Horizontal offset for notch\n const tooltipCenterX = clampedLeft + tooltipRect.width / 2;\n notchOffset = targetCenterX - tooltipCenterX;\n // Clamp notch offset to stay within tooltip bounds\n const maxOffset = (tooltipRect.width / 2) - 16; // 16px from edge minimum\n notchOffset = Math.max(-maxOffset, Math.min(notchOffset, maxOffset));\n } else {\n // Vertical offset for notch\n const tooltipCenterY = clampedTop + tooltipRect.height / 2;\n notchOffset = targetCenterY - tooltipCenterY;\n // Clamp notch offset\n const maxOffset = (tooltipRect.height / 2) - 16;\n notchOffset = Math.max(-maxOffset, Math.min(notchOffset, maxOffset));\n }\n\n // Set placement and notch offset attributes for CSS styling\n const setAttributes = () => {\n tooltip.setAttribute('data-placement', placement);\n tooltip.style.setProperty('--notch-offset', `${notchOffset}px`);\n };\n\n const guard = window.stateGuard;\n if (guard?.executeWithBypass) {\n guard.executeWithBypass('latex-tooltip:set-placement', setAttributes);\n } else {\n setAttributes();\n }\n}\n\n/**\n * Show tooltip for a target element.\n * @param {HTMLElement} target - Element with tooltip data\n */\nfunction showTooltip(target) {\n if (!target || !target.getAttribute) return;\n\n const hasLatex = target.classList && target.classList.contains('has-latex-tooltip');\n const hasPlain = target.classList && target.classList.contains('twm-has-tooltip');\n\n if (!hasLatex && !hasPlain) return;\n\n currentTarget = target;\n const tooltip = createTooltipElement();\n\n if (hasLatex) {\n // Render LaTeX using KaTeX\n const latex = target.getAttribute('data-latex-tooltip');\n if (!latex) return;\n\n try {\n if (typeof katex !== 'undefined') {\n katex.render(latex, tooltip, {\n displayMode: true,\n throwOnError: false,\n trust: false\n });\n } else {\n tooltip.textContent = latex;\n }\n } catch (err) {\n window.logger?.error('nodes', 'KaTeX rendering error:', err);\n tooltip.textContent = latex;\n }\n } else if (hasPlain) {\n // Plain text tooltip with line breaks preserved\n const text = target.getAttribute('data-tooltip');\n if (!text) return;\n\n // Replace &#10; with actual line breaks, preserve formatting\n const formattedText = text.replace(/&#10;/g, '\\n');\n const lines = formattedText.split('\\n');\n\n tooltip.innerHTML = '';\n lines.forEach((line, index) => {\n if (index === 0) {\n // First line is bold header\n const header = document.createElement('strong');\n header.textContent = line;\n tooltip.appendChild(header);\n } else {\n // Add line break and text\n tooltip.appendChild(document.createElement('br'));\n const textNode = document.createTextNode(line);\n tooltip.appendChild(textNode);\n }\n });\n }\n\n // Optional per-target width override (for long plain-text content like\n // widget documentation). Set data-tooltip-max-width on the target with a\n // CSS length (e.g. \"420px\"). Reset between shows so sticky values don't\n // leak across unrelated targets.\n const widthOverride = target.getAttribute('data-tooltip-max-width');\n tooltip.style.maxWidth = widthOverride || '';\n\n // Position and show\n requestAnimationFrame(() => {\n positionTooltip(target, tooltip);\n tooltip.classList.add('visible');\n\n // Start mouse position check for auto-hide\n startMouseCheck();\n });\n}\n\n/**\n * Hide the tooltip and clean up.\n */\nfunction hideTooltip() {\n if (tooltipElement) {\n tooltipElement.classList.remove('visible');\n }\n currentTarget = null;\n\n // Clear mouse check interval\n if (mouseCheckInterval) {\n clearInterval(mouseCheckInterval);\n mouseCheckInterval = null;\n }\n}\n\n/**\n * Start the mouse position check interval.\n * Hides tooltip if mouse is no longer over the target element.\n */\nfunction startMouseCheck() {\n // Clear any existing interval\n if (mouseCheckInterval) {\n clearInterval(mouseCheckInterval);\n }\n\n // Check every 3 seconds if mouse is still on the target element\n mouseCheckInterval = setInterval(() => {\n if (!currentTarget) {\n clearInterval(mouseCheckInterval);\n mouseCheckInterval = null;\n return;\n }\n\n // Get element under the last known mouse position\n const elementUnderMouse = document.elementFromPoint(lastMousePosition.x, lastMousePosition.y);\n\n // Check if the element under mouse is the target or a child of it\n if (elementUnderMouse) {\n const isStillOnTarget = elementUnderMouse === currentTarget ||\n currentTarget.contains(elementUnderMouse) ||\n elementUnderMouse.closest('.twm-has-tooltip, .has-latex-tooltip') === currentTarget;\n\n if (!isStillOnTarget) {\n hideTooltip();\n }\n } else {\n // Mouse is outside the document\n hideTooltip();\n }\n }, 3000);\n}\n\n/**\n * Attach global event listeners for tooltips.\n */\nfunction attachListeners() {\n if (listenersAttached) return;\n listenersAttached = true;\n\n // Remove all title attributes from elements with custom tooltips\n document.querySelectorAll('.twm-has-tooltip, .has-latex-tooltip').forEach(el => {\n el.removeAttribute('title');\n });\n\n // Track mouse position for the 3-second auto-hide check\n document.addEventListener('mousemove', (event) => {\n lastMousePosition.x = event.clientX;\n lastMousePosition.y = event.clientY;\n }, { passive: true });\n\n document.addEventListener('mouseenter', (event) => {\n const target = event.target;\n if (!(target instanceof Element)) return;\n const tooltipTarget = target.closest('.has-latex-tooltip, .twm-has-tooltip');\n if (!tooltipTarget) return;\n // Skip template nodes in fixed-200 panel - handled elsewhere\n if (tooltipTarget.closest('.panel.twm-fixed-200 .node.template')) {\n return;\n }\n showTooltip(tooltipTarget);\n }, true);\n\n document.addEventListener('mouseleave', (event) => {\n const target = event.target;\n if (!(target instanceof Element)) return;\n const tooltipTarget = target.closest('.has-latex-tooltip, .twm-has-tooltip');\n if (!tooltipTarget) return;\n // Skip template nodes in fixed-200 panel\n if (tooltipTarget.closest('.panel.twm-fixed-200 .node.template')) {\n return;\n }\n hideTooltip();\n }, true);\n\n // Hide on scroll\n document.addEventListener('scroll', hideTooltip, true);\n\n // ESC key hides all tooltips application-wide (does not stop propagation)\n document.addEventListener('keydown', (event) => {\n if (event.key === 'Escape') {\n hideTooltip();\n // Note: We intentionally do NOT call event.stopPropagation()\n // so other listeners can also respond to ESC\n }\n }, true);\n}\n\n/**\n * Initialize the tooltip system.\n */\nfunction initializeTooltips() {\n // Wait for KaTeX to load (optional, for latex tooltips)\n const initInterval = setInterval(() => {\n if (typeof katex !== 'undefined') {\n clearInterval(initInterval);\n if (!listenersAttached) {\n attachListeners();\n }\n }\n }, 100);\n\n // Timeout after 2 seconds - attach listeners anyway for plain tooltips\n setTimeout(() => {\n clearInterval(initInterval);\n if (!listenersAttached) {\n attachListeners();\n }\n }, 2000);\n}\n\n/**\n * Set a tooltip on an element programmatically.\n * @param {HTMLElement} element - Target element\n * @param {string} text - Tooltip text\n * @param {boolean} [isLatex=false] - Whether to render as LaTeX\n */\nfunction setTooltip(element, text, isLatex = false) {\n if (!element || !text) return;\n\n // Remove any existing title attribute\n element.removeAttribute('title');\n\n if (isLatex) {\n element.classList.add('has-latex-tooltip');\n element.classList.remove('twm-has-tooltip');\n element.setAttribute('data-latex-tooltip', text);\n } else {\n element.classList.add('twm-has-tooltip');\n element.classList.remove('has-latex-tooltip');\n element.setAttribute('data-tooltip', text);\n }\n}\n\n/**\n * Refresh tooltips for dynamically added content.\n * Removes title attributes that might cause native tooltips.\n * @param {HTMLElement} [container=document] - Container to search within\n */\nfunction refreshTooltips(container = document) {\n container.querySelectorAll('.twm-has-tooltip, .has-latex-tooltip').forEach(el => {\n el.removeAttribute('title');\n });\n}\n\n// ES module exports \u2014 the real interface.\nexport const TooltipService = {\n show: showTooltip,\n hide: hideTooltip,\n set: setTooltip,\n refresh: refreshTooltips,\n init: initializeTooltips\n};\n\nexport default TooltipService;\n\n// Everything below is a side effect of IMPORTING this file, and it is guarded.\n//\n// Unguarded, it touched `document` and `window` at module scope, which made\n// @flexdesk/widgets throw `ReferenceError: window is not defined` the moment anything\n// imported it outside a browser. The DOM check is not defensive programming; it\n// is the difference between a module and a script.\n//\n// `window.LatexTooltip` stays, because unlike `window.InlineRenamer` it is real:\n// roughly 25 call sites read it, all as `window.LatexTooltip?.set(...)`, and one\n// of them is INSIDE the library (window_chrome_controller.js). That last one is a\n// hidden dependency on a global and should import TooltipService instead \u2014 a small\n// piece of P6 cleanup, noted rather than smuggled in here.\nif (typeof document !== 'undefined') {\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', initializeTooltips);\n } else {\n initializeTooltips();\n }\n}\n\nif (typeof window !== 'undefined') {\n window.LatexTooltip = TooltipService;\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["list", "el", "options", "e"]
7
+ }