@ai-ecoverse/slicc-spectrum 1.62.1 → 1.62.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/slicc-ui.js CHANGED
@@ -14081,6 +14081,20 @@ function deepActive(root2) {
14081
14081
  }
14082
14082
  var scrollback = 1 << 18;
14083
14083
  var laid = ({ width, height }) => width > 0 && height > 0;
14084
+ function settled(element2) {
14085
+ return new Promise((resolve2) => {
14086
+ let last = "";
14087
+ const frame = () => {
14088
+ if (!element2.isConnected) return;
14089
+ const { width, height } = element2.getBoundingClientRect();
14090
+ const size4 = `${width}x${height}`;
14091
+ if (laid({ width, height }) && size4 === last) return resolve2();
14092
+ last = size4;
14093
+ requestAnimationFrame(frame);
14094
+ };
14095
+ requestAnimationFrame(frame);
14096
+ });
14097
+ }
14084
14098
  var ended = { write() {
14085
14099
  }, resize() {
14086
14100
  }, close() {
@@ -14286,7 +14300,7 @@ var SliccTerminalPanel = class extends ThemedElement {
14286
14300
  const backend = keep(model.terminals, info.id);
14287
14301
  terminal.backend = {
14288
14302
  open: async (sink) => {
14289
- await this.#placed(info.id);
14303
+ await this.#placed(info.id, terminal);
14290
14304
  terminal.fit();
14291
14305
  return backend.open(sink, { cols: terminal.cols, rows: terminal.rows });
14292
14306
  }
@@ -14306,17 +14320,18 @@ var SliccTerminalPanel = class extends ThemedElement {
14306
14320
  );
14307
14321
  return terminal;
14308
14322
  }
14309
- #placed(id) {
14323
+ #placed(id, screen) {
14310
14324
  const host4 = this.getRootNode().host;
14311
14325
  const panel = host4?.localName === "slicc-dock" ? host4.api.getPanel(terminalPanel(id)) : void 0;
14312
- if (!panel || laid(panel.api)) return Promise.resolve();
14313
- return new Promise((resolve2) => {
14326
+ if (!panel) return Promise.resolve();
14327
+ const sized = laid(panel.api) ? Promise.resolve() : new Promise((resolve2) => {
14314
14328
  const watch = panel.api.onDidDimensionsChange((size4) => {
14315
14329
  if (!laid(size4)) return;
14316
14330
  watch.dispose();
14317
14331
  resolve2();
14318
14332
  });
14319
14333
  });
14334
+ return sized.then(() => settled(screen));
14320
14335
  }
14321
14336
  #request() {
14322
14337
  this.dispatchEvent(new CustomEvent("new-terminal", { bubbles: true, composed: true }));
@@ -21534,7 +21549,7 @@ function requiresText(item2, all2) {
21534
21549
  return parts2.length ? parts2.join("; ") : null;
21535
21550
  }
21536
21551
  var snapshot = (items) => new Map(items.map(({ id, state: state3, error }) => [id, { state: state3, error }]));
21537
- function settled(failures, before, after) {
21552
+ function settled2(failures, before, after) {
21538
21553
  return new Map(
21539
21554
  [...failures].filter(([id]) => {
21540
21555
  const was = before.get(id);
@@ -21843,7 +21858,7 @@ var SliccUpdates = class extends ModelElement {
21843
21858
  const subscriptions = [
21844
21859
  port.on("items", (items) => {
21845
21860
  const next = snapshot(items);
21846
- this.failures = settled(this.failures, previous, next);
21861
+ this.failures = settled2(this.failures, previous, next);
21847
21862
  previous = next;
21848
21863
  this.requestUpdate();
21849
21864
  })
@@ -21854,7 +21869,7 @@ var SliccUpdates = class extends ModelElement {
21854
21869
  ...subscriptions,
21855
21870
  port.on("packages", (items) => {
21856
21871
  const next = snapshot(items);
21857
- this.problems = settled(this.problems, packages, next);
21872
+ this.problems = settled2(this.problems, packages, next);
21858
21873
  packages = next;
21859
21874
  this.requestUpdate();
21860
21875
  })
@@ -55121,16 +55136,24 @@ var OverflowObserver = class extends CompositeDisposable {
55121
55136
  }
55122
55137
  };
55123
55138
  function watchElementResize(element2, cb) {
55139
+ const pendingFrames = /* @__PURE__ */ new Set();
55124
55140
  const observer = new ResizeObserver((entires) => {
55125
- requestAnimationFrame(() => {
55141
+ let ran = false;
55142
+ let frame;
55143
+ frame = requestAnimationFrame(() => {
55144
+ ran = true;
55145
+ if (frame !== void 0) pendingFrames.delete(frame);
55126
55146
  const firstEntry = entires[0];
55127
55147
  cb(firstEntry);
55128
55148
  });
55149
+ if (!ran) pendingFrames.add(frame);
55129
55150
  });
55130
55151
  observer.observe(element2);
55131
55152
  return { dispose: () => {
55132
55153
  observer.unobserve(element2);
55133
55154
  observer.disconnect();
55155
+ for (const frame of pendingFrames) cancelAnimationFrame(frame);
55156
+ pendingFrames.clear();
55134
55157
  } };
55135
55158
  }
55136
55159
  var removeClasses = (element2, ...classes) => {
@@ -63603,16 +63626,21 @@ var TabsContainer = class extends CompositeDisposable {
63603
63626
  y: event2.clientY,
63604
63627
  zIndex: (relativeParent === null || relativeParent === void 0 ? void 0 : relativeParent.style.zIndex) ? `calc(${relativeParent.style.zIndex} * 2)` : void 0
63605
63628
  };
63606
- const context = this.createOverflowRenderContext(root2, anchor);
63629
+ const { context, rowRenderers } = this.createOverflowRenderContext(root2, anchor);
63607
63630
  const advancedOverflow = this.accessor.advancedOverflowService;
63608
- if (advancedOverflow) advancedOverflow.renderOverflow({
63609
- group: this.group,
63610
- overflowTabs: [...this._overflowTabs],
63611
- overflowTabGroups: [...this._overflowTabGroups],
63612
- pinnedOverflowTabs: [...this._overflowPinnedTabs],
63613
- context
63614
- });
63615
- else context.open(this.renderFreeOverflowList(context));
63631
+ try {
63632
+ if (advancedOverflow) advancedOverflow.renderOverflow({
63633
+ group: this.group,
63634
+ overflowTabs: [...this._overflowTabs],
63635
+ overflowTabGroups: [...this._overflowTabGroups],
63636
+ pinnedOverflowTabs: [...this._overflowPinnedTabs],
63637
+ context
63638
+ });
63639
+ else context.open(this.renderFreeOverflowList(context));
63640
+ } catch (err) {
63641
+ rowRenderers.dispose();
63642
+ throw err;
63643
+ }
63616
63644
  }));
63617
63645
  }
63618
63646
  /**
@@ -63633,6 +63661,7 @@ var TabsContainer = class extends CompositeDisposable {
63633
63661
  if (overflowGroupSet.has(tg.id)) for (const pid of tg.panelIds) panelToGroup.set(pid, tg);
63634
63662
  }
63635
63663
  const popup2 = () => this.accessor.getPopupServiceForGroup(this.group);
63664
+ const rowRenderers = new CompositeDisposable();
63636
63665
  const buildGroupHeader = (tg) => {
63637
63666
  const groupHeader = document.createElement("div");
63638
63667
  groupHeader.className = "dv-tabs-overflow-group-header";
@@ -63662,69 +63691,87 @@ var TabsContainer = class extends CompositeDisposable {
63662
63691
  return groupHeader;
63663
63692
  };
63664
63693
  return {
63665
- overflowGroupIdForPanel: (panelId) => {
63666
- var _panelToGroup$get;
63667
- return (_panelToGroup$get = panelToGroup.get(panelId)) === null || _panelToGroup$get === void 0 ? void 0 : _panelToGroup$get.id;
63668
- },
63669
- buildGroupHeader: (tabGroupId) => {
63670
- const tg = groupById.get(tabGroupId);
63671
- if (!tg || !overflowGroupSet.has(tg.id)) return;
63672
- return buildGroupHeader(tg);
63673
- },
63674
- buildPinnedHeader: () => {
63675
- const header = document.createElement("div");
63676
- header.className = "dv-tabs-overflow-group-header dv-tabs-overflow-pinned-header";
63677
- const glyph = createPinButton();
63678
- glyph.classList.add("dv-tabs-overflow-pinned-icon");
63679
- header.appendChild(glyph);
63680
- const labelSpan = document.createElement("span");
63681
- labelSpan.className = "dv-tabs-overflow-group-label";
63682
- labelSpan.textContent = "Pinned";
63683
- header.appendChild(labelSpan);
63684
- return header;
63685
- },
63686
- buildRow: (panelId) => {
63687
- const panel = this.group.panels.find((p17) => p17.id === panelId);
63688
- if (!panel) return;
63689
- const tab = this.tabs.tabs.find((t88) => t88.panel.id === panelId);
63690
- const tg = panelToGroup.get(panelId);
63691
- const child = panel.view.createTabRenderer("headerOverflow").element;
63692
- const wrapper = document.createElement("div");
63693
- toggleClass(wrapper, "dv-tab", true);
63694
- toggleClass(wrapper, "dv-active-tab", panel.api.isActive);
63695
- toggleClass(wrapper, "dv-inactive-tab", !panel.api.isActive);
63696
- if (tg) toggleClass(wrapper, "dv-tab--grouped", true);
63697
- const doActivate = () => {
63698
- if (tg === null || tg === void 0 ? void 0 : tg.collapsed) tg.expand();
63699
- tab === null || tab === void 0 || tab.element.scrollIntoView({
63700
- block: "nearest",
63701
- inline: "nearest"
63694
+ context: {
63695
+ overflowGroupIdForPanel: (panelId) => {
63696
+ var _panelToGroup$get;
63697
+ return (_panelToGroup$get = panelToGroup.get(panelId)) === null || _panelToGroup$get === void 0 ? void 0 : _panelToGroup$get.id;
63698
+ },
63699
+ buildGroupHeader: (tabGroupId) => {
63700
+ const tg = groupById.get(tabGroupId);
63701
+ if (!tg || !overflowGroupSet.has(tg.id)) return;
63702
+ return buildGroupHeader(tg);
63703
+ },
63704
+ buildPinnedHeader: () => {
63705
+ const header = document.createElement("div");
63706
+ header.className = "dv-tabs-overflow-group-header dv-tabs-overflow-pinned-header";
63707
+ const glyph = createPinButton();
63708
+ glyph.classList.add("dv-tabs-overflow-pinned-icon");
63709
+ header.appendChild(glyph);
63710
+ const labelSpan = document.createElement("span");
63711
+ labelSpan.className = "dv-tabs-overflow-group-label";
63712
+ labelSpan.textContent = "Pinned";
63713
+ header.appendChild(labelSpan);
63714
+ return header;
63715
+ },
63716
+ buildRow: (panelId) => {
63717
+ const panel = this.group.panels.find((p17) => p17.id === panelId);
63718
+ if (!panel) return;
63719
+ const tab = this.tabs.tabs.find((t88) => t88.panel.id === panelId);
63720
+ const tg = panelToGroup.get(panelId);
63721
+ const tabComponent = panel.view.createTabRenderer("headerOverflow");
63722
+ let rowDisposed = false;
63723
+ const disposeRow = Disposable.from(() => {
63724
+ if (!rowDisposed) {
63725
+ var _tabComponent$dispose;
63726
+ rowDisposed = true;
63727
+ (_tabComponent$dispose = tabComponent.dispose) === null || _tabComponent$dispose === void 0 || _tabComponent$dispose.call(tabComponent);
63728
+ }
63702
63729
  });
63703
- this.accessor.withOrigin("user", () => panel.api.setActive());
63704
- };
63705
- wrapper.addEventListener("click", (event2) => {
63706
- popup2().close();
63707
- if (event2.defaultPrevented) return;
63708
- doActivate();
63709
- });
63710
- wrapper.appendChild(child);
63711
- return {
63712
- element: wrapper,
63713
- panel,
63714
- activate: () => {
63730
+ if (rowRenderers.isDisposed) disposeRow.dispose();
63731
+ else rowRenderers.addDisposables(disposeRow);
63732
+ const child = tabComponent.element;
63733
+ const wrapper = document.createElement("div");
63734
+ toggleClass(wrapper, "dv-tab", true);
63735
+ toggleClass(wrapper, "dv-active-tab", panel.api.isActive);
63736
+ toggleClass(wrapper, "dv-inactive-tab", !panel.api.isActive);
63737
+ if (tg) toggleClass(wrapper, "dv-tab--grouped", true);
63738
+ const doActivate = () => {
63739
+ if (tg === null || tg === void 0 ? void 0 : tg.collapsed) tg.expand();
63740
+ tab === null || tab === void 0 || tab.element.scrollIntoView({
63741
+ block: "nearest",
63742
+ inline: "nearest"
63743
+ });
63744
+ this.accessor.withOrigin("user", () => panel.api.setActive());
63745
+ };
63746
+ wrapper.addEventListener("click", (event2) => {
63715
63747
  popup2().close();
63748
+ if (event2.defaultPrevented) return;
63716
63749
  doActivate();
63717
- }
63718
- };
63719
- },
63720
- open: (body4) => {
63721
- popup2().openPopover(body4, anchor);
63750
+ });
63751
+ wrapper.appendChild(child);
63752
+ return {
63753
+ element: wrapper,
63754
+ panel,
63755
+ activate: () => {
63756
+ popup2().close();
63757
+ doActivate();
63758
+ },
63759
+ dispose: () => {
63760
+ rowRenderers.removeDisposable(disposeRow);
63761
+ disposeRow.dispose();
63762
+ }
63763
+ };
63764
+ },
63765
+ open: (body4) => {
63766
+ popup2().openPopover(body4, anchor, { onClose: () => rowRenderers.dispose() });
63767
+ },
63768
+ close: () => popup2().close(),
63769
+ focusTrigger: () => {
63770
+ root2.tabIndex = -1;
63771
+ root2.focus();
63772
+ }
63722
63773
  },
63723
- close: () => popup2().close(),
63724
- focusTrigger: () => {
63725
- root2.tabIndex = -1;
63726
- root2.focus();
63727
- }
63774
+ rowRenderers
63728
63775
  };
63729
63776
  }
63730
63777
  /**
@@ -64638,6 +64685,7 @@ var DockviewGroupPanelModel = class extends CompositeDisposable {
64638
64685
  this.tabsContainer.setRightActionsElement(element2);
64639
64686
  }
64640
64687
  setActive(isGroupActive, force = false) {
64688
+ if (this.isDisposed) return;
64641
64689
  if (!force && this.isActive === isGroupActive) return;
64642
64690
  this._isGroupActive = isGroupActive;
64643
64691
  toggleClass(this.container, "dv-active-group", isGroupActive);
@@ -67291,13 +67339,14 @@ var ContextMenuController = class {
67291
67339
  * menu passes the `tabGroup`. No-op when no renderer could be created (no
67292
67340
  * factory configured, or the factory declined the component).
67293
67341
  */
67294
- appendComponentItem(menuEl, item2, identity, group, close) {
67342
+ appendComponentItem(menuEl, item2, identity, group, close, renderers) {
67295
67343
  var _this$accessor$option4, _this$accessor$option5;
67296
67344
  const renderer = (_this$accessor$option4 = (_this$accessor$option5 = this.accessor.options).createContextMenuItemComponent) === null || _this$accessor$option4 === void 0 ? void 0 : _this$accessor$option4.call(_this$accessor$option5, {
67297
67345
  id: nextContextMenuItemId(),
67298
67346
  component: item2.component
67299
67347
  });
67300
67348
  if (!renderer) return;
67349
+ renderers.addDisposables(renderer);
67301
67350
  renderer.init(_objectSpread2(_objectSpread2({}, identity), {}, {
67302
67351
  group,
67303
67352
  api: this.accessor.api,
@@ -67357,9 +67406,9 @@ var ContextMenuController = class {
67357
67406
  * default row; an item carrying none of the three renders nothing. Shared
67358
67407
  * by both menus, which differ only in `identity`.
67359
67408
  */
67360
- appendConfigItem(menuEl, item2, identity, group, close) {
67409
+ appendConfigItem(menuEl, item2, identity, group, close, renderers) {
67361
67410
  if (item2.element) menuEl.appendChild(item2.element);
67362
- else if (item2.component) this.appendComponentItem(menuEl, item2, identity, group, close);
67411
+ else if (item2.component) this.appendComponentItem(menuEl, item2, identity, group, close, renderers);
67363
67412
  else if (item2.label) menuEl.appendChild(buildItem(item2.label, close, () => {
67364
67413
  var _item$action;
67365
67414
  return (_item$action = item2.action) === null || _item$action === void 0 ? void 0 : _item$action.call(item2);
@@ -67371,22 +67420,28 @@ var ContextMenuController = class {
67371
67420
  event2.preventDefault();
67372
67421
  const popupService = this.accessor.getPopupServiceForGroup(group);
67373
67422
  const close = () => popupService.close();
67423
+ const renderers = new CompositeDisposable();
67374
67424
  const menuEl = document.createElement("div");
67375
67425
  menuEl.className = "dv-context-menu";
67376
67426
  menuEl.setAttribute("role", "menu");
67377
- for (const item2 of items) {
67378
- if (isItemConfig(item2)) {
67379
- this.appendConfigItem(menuEl, item2, { panel }, group, close);
67380
- continue;
67427
+ try {
67428
+ for (const item2 of items) {
67429
+ if (isItemConfig(item2)) {
67430
+ this.appendConfigItem(menuEl, item2, { panel }, group, close, renderers);
67431
+ continue;
67432
+ }
67433
+ const el = this.buildBuiltInTabItem(item2, panel, group, close);
67434
+ if (el) menuEl.appendChild(el);
67381
67435
  }
67382
- const el = this.buildBuiltInTabItem(item2, panel, group, close);
67383
- if (el) menuEl.appendChild(el);
67436
+ } catch (err) {
67437
+ renderers.dispose();
67438
+ throw err;
67384
67439
  }
67385
67440
  popupService.openPopover(menuEl, {
67386
67441
  x: event2.clientX,
67387
67442
  y: event2.clientY,
67388
67443
  zIndex: popoverZIndexFor(event2.target, group)
67389
- });
67444
+ }, { onClose: () => renderers.dispose() });
67390
67445
  }
67391
67446
  showForChip(tabGroup, group, event2) {
67392
67447
  if (!this.accessor.options.getTabGroupChipContextMenuItems) return;
@@ -67400,22 +67455,28 @@ var ContextMenuController = class {
67400
67455
  event2.preventDefault();
67401
67456
  const popupService = this.accessor.getPopupServiceForGroup(group);
67402
67457
  const close = () => popupService.close();
67458
+ const renderers = new CompositeDisposable();
67403
67459
  const menuEl = document.createElement("div");
67404
67460
  menuEl.className = "dv-context-menu";
67405
67461
  menuEl.setAttribute("role", "menu");
67406
- for (const item2 of items) if (item2 === "separator") menuEl.appendChild(buildSeparator());
67407
- else if (item2 === "rename") menuEl.appendChild(buildRenameInput(tabGroup));
67408
- else if (item2 === "colorPicker") menuEl.appendChild(buildColorPicker(tabGroup, this.accessor.tabGroupColorPalette));
67409
- else if (item2 === "collapse") menuEl.appendChild(this.buildCollapseItem(tabGroup, close));
67410
- else if (item2 === "close") menuEl.appendChild(buildItem("Close All", close, () => {
67411
- group.panels.filter((p17) => tabGroup.containsPanel(p17.id)).forEach((p17) => p17.api.close());
67412
- }));
67413
- else if (isItemConfig(item2)) this.appendConfigItem(menuEl, item2, { tabGroup }, group, close);
67462
+ try {
67463
+ for (const item2 of items) if (item2 === "separator") menuEl.appendChild(buildSeparator());
67464
+ else if (item2 === "rename") menuEl.appendChild(buildRenameInput(tabGroup));
67465
+ else if (item2 === "colorPicker") menuEl.appendChild(buildColorPicker(tabGroup, this.accessor.tabGroupColorPalette));
67466
+ else if (item2 === "collapse") menuEl.appendChild(this.buildCollapseItem(tabGroup, close));
67467
+ else if (item2 === "close") menuEl.appendChild(buildItem("Close All", close, () => {
67468
+ group.panels.filter((p17) => tabGroup.containsPanel(p17.id)).forEach((p17) => p17.api.close());
67469
+ }));
67470
+ else if (isItemConfig(item2)) this.appendConfigItem(menuEl, item2, { tabGroup }, group, close, renderers);
67471
+ } catch (err) {
67472
+ renderers.dispose();
67473
+ throw err;
67474
+ }
67414
67475
  popupService.openPopover(menuEl, {
67415
67476
  x: event2.clientX,
67416
67477
  y: event2.clientY,
67417
67478
  zIndex: popoverZIndexFor(event2.target, group)
67418
- });
67479
+ }, { onClose: () => renderers.dispose() });
67419
67480
  }
67420
67481
  };
67421
67482
  var ContextMenuModule = defineModule({
@@ -67633,6 +67694,7 @@ var OverlayRenderContainer = class extends CompositeDisposable {
67633
67694
  const observerDisposable = new MutableDisposable();
67634
67695
  const correctLayerPosition = () => {
67635
67696
  if (panel.api.location.type === "floating") queueMicrotask(() => {
67697
+ if (disposable.isDisposed) return;
67636
67698
  const floatingGroup = this.accessor.getFloatingWindowForGroup(panel.api.group);
67637
67699
  if (!floatingGroup) return;
67638
67700
  const element2 = floatingGroup.overlay.element;
@@ -67831,7 +67893,7 @@ var PopupService = class extends CompositeDisposable {
67831
67893
  newRoot.prepend(this._element);
67832
67894
  this._root = newRoot;
67833
67895
  }
67834
- openPopover(element2, position) {
67896
+ openPopover(element2, position, options) {
67835
67897
  var _position$zIndex;
67836
67898
  this.close();
67837
67899
  const wrapper = this._window.document.createElement("div");
@@ -67846,14 +67908,14 @@ var PopupService = class extends CompositeDisposable {
67846
67908
  this._element.appendChild(wrapper);
67847
67909
  this._active = wrapper;
67848
67910
  const POINTERDOWN_GRACE_MS = 200;
67849
- this._activeDisposable.value = createDismissableLayer({
67911
+ this._activeDisposable.value = new CompositeDisposable(createDismissableLayer({
67850
67912
  window: this._window,
67851
67913
  onDismiss: () => this.close(),
67852
67914
  elements: () => this._active ? [this._active] : [],
67853
67915
  keys: ["Enter"],
67854
67916
  pointerDownGraceMs: POINTERDOWN_GRACE_MS,
67855
67917
  resize: true
67856
- });
67918
+ }), (options === null || options === void 0 ? void 0 : options.onClose) ? Disposable.from(options.onClose) : Disposable.NONE);
67857
67919
  this._window.requestAnimationFrame(() => {
67858
67920
  shiftAbsoluteElementIntoView(wrapper, this._root);
67859
67921
  });
@@ -69142,7 +69204,9 @@ var DockviewComponent = class extends BaseGrid {
69142
69204
  this._onWillDrop = new Emitter2();
69143
69205
  this.onWillDrop = this._onWillDrop.event;
69144
69206
  this._mutationDepth = 0;
69207
+ this._syncMutationDepth = 0;
69145
69208
  this._pendingLocationChanges = /* @__PURE__ */ new Map();
69209
+ this._openingPopoutWindows = /* @__PURE__ */ new Set();
69146
69210
  this._origin = "user";
69147
69211
  this._originDepth = 0;
69148
69212
  this._onWillMutateLayout = new Emitter2();
@@ -69226,6 +69290,10 @@ var DockviewComponent = class extends BaseGrid {
69226
69290
  });
69227
69291
  }));
69228
69292
  this.popupService = new PopupService(this.element);
69293
+ this.addDisposables(this.popupService, Disposable.from(() => {
69294
+ for (const opening2 of this._openingPopoutWindows) opening2.dispose();
69295
+ this._openingPopoutWindows.clear();
69296
+ }));
69229
69297
  this._api = new DockviewApi(this);
69230
69298
  this.disableResizing = true;
69231
69299
  this.element.remove();
@@ -69370,9 +69438,15 @@ var DockviewComponent = class extends BaseGrid {
69370
69438
  const popoutWindowDisposable = new CompositeDisposable(_window, _window.onDidClose(() => {
69371
69439
  popoutWindowDisposable.dispose();
69372
69440
  }));
69441
+ this._openingPopoutWindows.add(popoutWindowDisposable);
69373
69442
  const openError = getPopoutUrlError(popoutUrl);
69374
69443
  return (openError ? Promise.resolve(null) : _window.open()).then((popoutContainer) => {
69375
69444
  var _options$referenceGro, _options$overridePopo4;
69445
+ this._openingPopoutWindows.delete(popoutWindowDisposable);
69446
+ if (this.isDisposed) {
69447
+ popoutWindowDisposable.dispose();
69448
+ return false;
69449
+ }
69376
69450
  if (_window.isDisposed) {
69377
69451
  const failure2 = _window.failure;
69378
69452
  if (failure2 && !this.isDisposed) {
@@ -69556,6 +69630,7 @@ var DockviewComponent = class extends BaseGrid {
69556
69630
  for (const { panel, from } of movedPanels) this.fireDidMovePanel(panel, from);
69557
69631
  return true;
69558
69632
  }).catch((err) => {
69633
+ this._openingPopoutWindows.delete(popoutWindowDisposable);
69559
69634
  console.error("dockview: failed to create popout.", err);
69560
69635
  return false;
69561
69636
  });
@@ -70079,6 +70154,7 @@ var DockviewComponent = class extends BaseGrid {
70079
70154
  group.dispose();
70080
70155
  this._groups.delete(group.id);
70081
70156
  this._onDidRemoveGroup.fire(group);
70157
+ this.activateFallbackGroupIfRemoved(group);
70082
70158
  });
70083
70159
  }
70084
70160
  setEdgeGroupCollapsed(group, collapsed) {
@@ -70251,10 +70327,12 @@ var DockviewComponent = class extends BaseGrid {
70251
70327
  const record = this._groups.get(temporaryGroup.api.id);
70252
70328
  this._groups.delete(temporaryGroup.api.id);
70253
70329
  temporaryGroupDisposables.push(Disposable.from(() => {
70330
+ var _this$headerActionsSe2;
70254
70331
  this.movingLock(() => {
70255
70332
  for (const panel of temporaryGroup.panels.slice()) temporaryGroup.model.removePanel(panel);
70256
70333
  });
70257
70334
  record === null || record === void 0 || record.disposable.dispose();
70335
+ (_this$headerActionsSe2 = this.headerActionsService) === null || _this$headerActionsSe2 === void 0 || _this$headerActionsSe2.disposeGroup(temporaryGroup);
70258
70336
  temporaryGroup.dispose();
70259
70337
  }));
70260
70338
  return temporaryGroup;
@@ -70873,9 +70951,12 @@ var DockviewComponent = class extends BaseGrid {
70873
70951
  */
70874
70952
  mutation(kind, func) {
70875
70953
  const close = this.openMutation(kind);
70954
+ this._syncMutationDepth++;
70876
70955
  try {
70877
70956
  return func();
70878
70957
  } finally {
70958
+ this._syncMutationDepth--;
70959
+ if (this._syncMutationDepth === 0) this.releaseDisposedActiveGroup();
70879
70960
  close();
70880
70961
  }
70881
70962
  }
@@ -70922,6 +71003,7 @@ var DockviewComponent = class extends BaseGrid {
70922
71003
  return () => {
70923
71004
  this._mutationDepth--;
70924
71005
  if (this._mutationDepth === 0) {
71006
+ this.releaseDisposedActiveGroup();
70925
71007
  this.flushLocationChanges();
70926
71008
  this._onDidMutateLayout.fire({
70927
71009
  kind,
@@ -70930,6 +71012,11 @@ var DockviewComponent = class extends BaseGrid {
70930
71012
  }
70931
71013
  };
70932
71014
  }
71015
+ /** Covers removals with `skipActive` that disposed the active group. */
71016
+ releaseDisposedActiveGroup() {
71017
+ var _this$_activeGroup;
71018
+ if (!this.isDisposed && ((_this$_activeGroup = this._activeGroup) === null || _this$_activeGroup === void 0 ? void 0 : _this$_activeGroup.model.isDisposed)) this.activateFallbackGroupIfRemoved(this._activeGroup);
71019
+ }
70933
71020
  /**
70934
71021
  * Coalesce a panel's `onDidLocationChange` to the end of the enclosing
70935
71022
  * transaction, or fire it immediately when no transaction is in flight.
@@ -71058,7 +71145,7 @@ var DockviewComponent = class extends BaseGrid {
71058
71145
  skipSetActiveGroup: true
71059
71146
  }));
71060
71147
  if (!removedPanel) throw new Error(`dockview: No panel with id ${sourceItemId}`);
71061
- if (!options.keepEmptyGroups && sourceGroup.model.size === 0) this.doRemoveGroup(sourceGroup, { skipActive: true });
71148
+ if (!options.keepEmptyGroups && sourceGroup.model.size === 0 && sourceGroup !== destinationGroup) this.doRemoveGroup(sourceGroup, { skipActive: true });
71062
71149
  const isDestinationGroupEmpty = destinationGroup.model.size === 0;
71063
71150
  this.movingLock(() => {
71064
71151
  var _options$skipSetActiv;
@@ -71192,6 +71279,7 @@ var DockviewComponent = class extends BaseGrid {
71192
71279
  const from = options.from.group;
71193
71280
  const to = options.to.group;
71194
71281
  const target = options.to.position;
71282
+ if (target === "center" && from === to) return;
71195
71283
  let source = from;
71196
71284
  let mergedPanels;
71197
71285
  if (target === "center") {
@@ -81176,7 +81264,7 @@ lit-html/static.js:
81176
81264
  dockview-core/dist/package/main.esm.mjs:
81177
81265
  (**
81178
81266
  * dockview-core
81179
- * @version 8.4.0
81267
+ * @version 8.4.1
81180
81268
  * @link https://github.com/dockview/dockview
81181
81269
  * @license MIT
81182
81270
  *)