@ixfx/components 0.15.3 → 0.15.5

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 (39) hide show
  1. package/bundle/index.d.ts +473 -17
  2. package/bundle/index.js +432 -225
  3. package/dist/crumbs.d.ts +1 -1
  4. package/dist/{data-grid-Dx3l3dxw.js → data-grid-C1sZX6n9.js} +37 -9
  5. package/dist/{data-grid-DmkId8bu.d.ts → data-grid-D7qzmMMp.d.ts} +13 -6
  6. package/dist/data-grid.d.ts +2 -2
  7. package/dist/data-grid.js +1 -1
  8. package/dist/{detail-list-CmQqeXvp.d.ts → detail-list-CKIKlszv.d.ts} +3 -3
  9. package/dist/detail-list.d.ts +3 -3
  10. package/dist/{flat-list-BmQBB3ZC.d.ts → flat-list-DXMyDiSH.d.ts} +2 -2
  11. package/dist/flat-list.d.ts +1 -1
  12. package/dist/{grid-list-BVsUEvgd.d.ts → grid-list-0e7snW6t.d.ts} +3 -3
  13. package/dist/grid-list.d.ts +2 -2
  14. package/dist/incr-search.d.ts +1 -1
  15. package/dist/{index-DuhzWWTr.d.ts → index-DEVyVIn8.d.ts} +28 -8
  16. package/dist/{index-BvoXLnBf.d.ts → index-KN2MW_xD.d.ts} +1 -1
  17. package/dist/index.d.ts +176 -15
  18. package/dist/index.js +274 -64
  19. package/dist/{list-native-drag-controller-NMspr0E1.d.ts → list-native-drag-controller-O2Nruqpi.d.ts} +1 -1
  20. package/dist/miller.d.ts +2 -2
  21. package/dist/sunburst-tree.d.ts +2 -0
  22. package/dist/sunburst-tree.js +2 -0
  23. package/dist/sunbursttree-list--Z0uyh8O.d.ts +266 -0
  24. package/dist/sunbursttree-list-yXwS-uEI.js +1337 -0
  25. package/dist/{tree-2_TRrLAV.js → tree-D8VxvR9u.js} +44 -5
  26. package/dist/{tree-component-CDsYTBDi.d.ts → tree-component-C6UHO-w9.d.ts} +12 -3
  27. package/dist/tree.d.ts +3 -3
  28. package/dist/tree.js +1 -1
  29. package/dist/{vertical-list-ztrdFvyT.d.ts → vertical-list-D8MksoTp.d.ts} +2 -2
  30. package/dist/vertical-list.d.ts +2 -2
  31. package/docs-user/README.md +1 -0
  32. package/docs-user/data-grid.md +11 -4
  33. package/docs-user/dock.md +62 -1
  34. package/docs-user/index.json +7 -2
  35. package/docs-user/llms.txt +1 -0
  36. package/docs-user/sunburst-tree.md +193 -0
  37. package/docs-user/tree.md +40 -1
  38. package/llms.txt +1 -0
  39. package/package.json +5 -1
package/dist/index.js CHANGED
@@ -26,13 +26,13 @@ import { t as CheckedSelect } from "./checked-select-CBUidG7n.js";
26
26
  import { n as ColourPicker, t as ColourPickerPopup } from "./colour-picker-DwAa6RDh.js";
27
27
  import { LabelledRangeInput } from "./labelled-range-input.js";
28
28
  import { t as collectDataResult } from "./data-provider-35TyWclX.js";
29
- import { a as TreeDataModel, c as pruneDraggedDescendants, i as TreeDropController, n as TreeListElement, o as applyTreeDrop, r as TreeBaseElement, s as dropTargetFor, t as TreeController } from "./tree-2_TRrLAV.js";
29
+ import { a as TreeDataModel, c as pruneDraggedDescendants, i as TreeDropController, n as TreeListElement, o as applyTreeDrop, r as TreeBaseElement, s as dropTargetFor, t as TreeController } from "./tree-D8VxvR9u.js";
30
30
  import { t as scrollFadeStyles } from "./scroll-fade-Xx28D7mH.js";
31
31
  import { NarrowedTextElement } from "./narrowed-text.js";
32
32
  import { CrumbNavigationElement } from "./crumbs.js";
33
33
  import { DataDisplayComponent } from "./data-display.js";
34
34
  import { t as createDragGhost } from "./drag-ghost-DtSDvjri.js";
35
- import { t as DataGridElement } from "./data-grid-Dx3l3dxw.js";
35
+ import { t as DataGridElement } from "./data-grid-C1sZX6n9.js";
36
36
  import { a as menuFromTreeToElements, t as menu_exports } from "./menu-CU9KAm8s.js";
37
37
  import { t as PanTextElement } from "./pan-text-CqtvjPyK.js";
38
38
  import { t as DetailListElement } from "./detail-list-q8bs67BM.js";
@@ -64,6 +64,7 @@ import { RangeElement } from "./range.js";
64
64
  import { SelectHorizElement } from "./select-horiz.js";
65
65
  import { SnackbarElement } from "./snackbar.js";
66
66
  import { SnapContainer } from "./snap-container.js";
67
+ import { a as findSunburstId, c as sunburstChildId, d as sunburstParentId, f as sunburstPathToId, i as defaultSunburstValueAccessor, l as sunburstHasChildren, n as computeSunburstLayout, o as findSunburstNodeById, p as SUNBURST_PATH_SEPARATOR, r as createValueResolver, s as isSunburstAncestorId, t as SunburstTreeListElement, u as sunburstIdToPath } from "./sunbursttree-list-yXwS-uEI.js";
67
68
  import { SwipeElement } from "./swipe.js";
68
69
  import { a as resolveCssVars, i as attachTimelineInteractions, n as TimelineTrackTabElement, o as resolveGrid, r as timelineStyles, s as TimelineController, t as IxfxTimelineElement } from "./timeline-BP1Ux2EV.js";
69
70
  import { TransitoryLabelElement } from "./transitory-label.js";
@@ -2723,7 +2724,10 @@ function startDrag(panelId, sourceHost, pointerId, clientX, clientY, kind) {
2723
2724
  ghost: createGhostForPanel(sourceHost, panelId),
2724
2725
  outside: false
2725
2726
  };
2726
- for (const host of dragHosts) host.setDragActive(true);
2727
+ for (const host of dragHosts) host.setDragActive(true, hostsExchange(sourceHost, host) ? {
2728
+ panelId,
2729
+ kind
2730
+ } : void 0);
2727
2731
  activeDrag.ghost?.move(clientX, clientY);
2728
2732
  window.addEventListener(`pointermove`, onPointerMove);
2729
2733
  window.addEventListener(`pointerup`, onPointerUp);
@@ -2788,10 +2792,18 @@ function onKeyDown(event) {
2788
2792
  if (event.key !== `Escape`) return;
2789
2793
  endDrag();
2790
2794
  }
2795
+ /**
2796
+ * Whether `target` may receive panels dragged from `source`: always for the
2797
+ * same host; otherwise only when the source is not `isolated` and both hosts
2798
+ * share a `family`.
2799
+ */
2800
+ function hostsExchange(source, target) {
2801
+ if (source === target) return true;
2802
+ return !source.isolated && source.family === target.family;
2803
+ }
2791
2804
  function findDropZone(drag, clientX, clientY) {
2792
- const sourceIsolated = drag.sourceHost.isolated;
2793
2805
  for (const host of dragHosts) {
2794
- if (sourceIsolated && host !== drag.sourceHost) continue;
2806
+ if (!hostsExchange(drag.sourceHost, host)) continue;
2795
2807
  const zone = host.computeDropZone(clientX, clientY, drag.panelId, drag.kind);
2796
2808
  if (zone !== null) return zone;
2797
2809
  }
@@ -2957,6 +2969,8 @@ function replaceNodeContents(target, source) {
2957
2969
  else delete t.name;
2958
2970
  if (source.hideLabels !== void 0) t.hideLabels = source.hideLabels;
2959
2971
  else delete t.hideLabels;
2972
+ if (source.hideSingleTabStrip !== void 0) t.hideSingleTabStrip = source.hideSingleTabStrip;
2973
+ else delete t.hideSingleTabStrip;
2960
2974
  delete t.collapsed;
2961
2975
  delete t.preCollapseSize;
2962
2976
  if (source.collapsed !== void 0) t.collapsed = source.collapsed;
@@ -2971,6 +2985,8 @@ function replaceNodeContents(target, source) {
2971
2985
  delete stale.panels;
2972
2986
  delete stale.active;
2973
2987
  delete stale.name;
2988
+ delete stale.hideLabels;
2989
+ delete stale.hideSingleTabStrip;
2974
2990
  delete stale.collapsed;
2975
2991
  delete stale.preCollapseSize;
2976
2992
  }
@@ -3387,6 +3403,8 @@ function moveLeafNodeToEdge(root, ref, edge) {
3387
3403
  active: rest.active
3388
3404
  };
3389
3405
  if (rest.name !== void 0) remaining.name = rest.name;
3406
+ if (rest.hideLabels !== void 0) remaining.hideLabels = rest.hideLabels;
3407
+ if (rest.hideSingleTabStrip !== void 0) remaining.hideSingleTabStrip = rest.hideSingleTabStrip;
3390
3408
  if (rest.collapsed !== void 0) remaining.collapsed = rest.collapsed;
3391
3409
  if (rest.preCollapseSize !== void 0) remaining.preCollapseSize = rest.preCollapseSize;
3392
3410
  replaceNodeContents(root, {
@@ -3436,6 +3454,7 @@ function serializeNode(node) {
3436
3454
  };
3437
3455
  if (node.name !== void 0) out.name = node.name;
3438
3456
  if (node.hideLabels !== void 0) out.hideLabels = node.hideLabels;
3457
+ if (node.hideSingleTabStrip !== void 0) out.hideSingleTabStrip = node.hideSingleTabStrip;
3439
3458
  if (node.collapsed !== void 0) out.collapsed = node.collapsed;
3440
3459
  if (node.preCollapseSize !== void 0) out.preCollapseSize = node.preCollapseSize;
3441
3460
  return out;
@@ -3465,6 +3484,36 @@ function parseLayout(json) {
3465
3484
  return null;
3466
3485
  }
3467
3486
  }
3487
+ /** Every stack holding at least one panel, keyed by node identity. */
3488
+ function snapshotNonEmptyStacks(root) {
3489
+ const out = /* @__PURE__ */ new Map();
3490
+ const visit = (node) => {
3491
+ if (isStack(node)) {
3492
+ if (node.panels.length > 0) out.set(node, {
3493
+ name: node.name,
3494
+ key: node.panels.join(`\n`)
3495
+ });
3496
+ return;
3497
+ }
3498
+ node.children.forEach(visit);
3499
+ };
3500
+ visit(root);
3501
+ return out;
3502
+ }
3503
+ /**
3504
+ * Stacks in `before` that no longer hold their panels in `after`. A stack
3505
+ * node that was re-created with the same panels (some leaf moves rebuild
3506
+ * nodes) does not count as emptied.
3507
+ */
3508
+ function findEmptiedStacks(before, after) {
3509
+ const afterKeys = new Set([...after.values()].map((s) => s.key));
3510
+ const emptied = [];
3511
+ for (const [node, snapshot] of before) {
3512
+ if (after.has(node) || afterKeys.has(snapshot.key)) continue;
3513
+ emptied.push(snapshot);
3514
+ }
3515
+ return emptied;
3516
+ }
3468
3517
  //#endregion
3469
3518
  //#region src/tabs/tab-list-item.ts
3470
3519
  const resizeHandlers = /* @__PURE__ */ new WeakMap();
@@ -4078,6 +4127,8 @@ DockPanelElement = __decorate([safeCustomElement(`ixfx-dock-panel`)], DockPanelE
4078
4127
  const BAND = .25;
4079
4128
  /** Pointer movement threshold before a press becomes a dock drag (matches tab-list). */
4080
4129
  const DRAG_THRESHOLD_PX$3 = 5;
4130
+ /** Tab items of a strip, or the stand-in tab of a hidden strip's drop hint. */
4131
+ const STRIP_ITEMS = `ixfx-tab-list-item, .ghost-tab`;
4081
4132
  /** Tolerance (px) when matching a child gutter endpoint to a parent gutter line. */
4082
4133
  const JUNCTION_TOL_PX = 6;
4083
4134
  /** Junction points closer than this merge into one handle (a 4-way cross yields one per side). */
@@ -4088,10 +4139,15 @@ let DockHostElement = class DockHostElement extends LitElement {
4088
4139
  this.layout = null;
4089
4140
  this.accepts = `tabs horizontal vertical`;
4090
4141
  this.isolated = false;
4142
+ this.hideSingleTabStrip = false;
4143
+ this.family = ``;
4144
+ this.acceptsKinds = null;
4091
4145
  this._model = createStack([]);
4092
4146
  this._pool = [];
4093
4147
  this._dropZone = null;
4094
4148
  this._dragActive = false;
4149
+ this._dragPanel = null;
4150
+ this._liveStacks = /* @__PURE__ */ new Map();
4095
4151
  this._junctions = [];
4096
4152
  this._toolbarsOut = /* @__PURE__ */ new Map();
4097
4153
  this._leafContentRules = /* @__PURE__ */ new Map();
@@ -4104,6 +4160,7 @@ let DockHostElement = class DockHostElement extends LitElement {
4104
4160
  this._toolbarObserver = null;
4105
4161
  this._panelObservers = /* @__PURE__ */ new Map();
4106
4162
  this._onDragStart = (event) => {
4163
+ if (event.composedPath().find((n) => n instanceof HTMLElement && n.tagName === `IXFX-DOCK-HOST`) !== this) return;
4107
4164
  const { panelId, pointerId, clientX, clientY } = event.detail;
4108
4165
  startDrag(panelId, this, pointerId, clientX, clientY, this._findPanelEl(panelId)?.kind);
4109
4166
  };
@@ -4179,17 +4236,18 @@ let DockHostElement = class DockHostElement extends LitElement {
4179
4236
  if (!(node instanceof HTMLElement)) continue;
4180
4237
  if (node.classList.contains(`list-toolbar`) || node.classList.contains(`close-btn`)) return;
4181
4238
  }
4182
- const item = path.find((node) => node instanceof HTMLElement && node.tagName === `IXFX-TAB-LIST-ITEM`) ?? null;
4183
- if (item === null || !item.id) return;
4184
- this._tabDragPending = {
4239
+ const item = tabItemIn(path);
4240
+ if (item === null) return;
4241
+ this._armPanelDrag(item.id, event);
4242
+ };
4243
+ this._onStripContextMenu = (event) => {
4244
+ const item = tabItemIn(event.composedPath());
4245
+ if (item === null) return;
4246
+ if (!this._emit(`dock-tab-contextmenu`, {
4185
4247
  panelId: item.id,
4186
- pointerId: event.pointerId,
4187
- startX: event.clientX,
4188
- startY: event.clientY
4189
- };
4190
- window.addEventListener(`pointermove`, this._onTabDragMove);
4191
- window.addEventListener(`pointerup`, this._onTabDragUp);
4192
- window.addEventListener(`pointercancel`, this._onTabDragUp);
4248
+ clientX: event.clientX,
4249
+ clientY: event.clientY
4250
+ }, true)) event.preventDefault();
4193
4251
  };
4194
4252
  this._onTabDragMove = (event) => {
4195
4253
  const pending = this._tabDragPending;
@@ -4218,6 +4276,7 @@ let DockHostElement = class DockHostElement extends LitElement {
4218
4276
  connectedCallback() {
4219
4277
  super.connectedCallback();
4220
4278
  this._buildInitialModel();
4279
+ this._liveStacks = snapshotNonEmptyStacks(this._model);
4221
4280
  registerDockHost(this);
4222
4281
  this.addEventListener(`dock-panel-drag-start`, this._onDragStart);
4223
4282
  this._hostResizeObserver = new ResizeObserver(() => this._scheduleJunctions());
@@ -4256,8 +4315,25 @@ let DockHostElement = class DockHostElement extends LitElement {
4256
4315
  if (parsed) {
4257
4316
  this._model = parsed.root;
4258
4317
  this._mergePoolIntoModel();
4318
+ this._liveStacks = snapshotNonEmptyStacks(this._model);
4259
4319
  }
4260
4320
  }
4321
+ this._returnToolbarsOfHiddenStrips();
4322
+ }
4323
+ /**
4324
+ * A toolbar parked in a tab item would be destroyed with the strip, so
4325
+ * hand it back before a hidden strip stops rendering.
4326
+ */
4327
+ _returnToolbarsOfHiddenStrips() {
4328
+ for (const [panelId, nodes] of [...this._toolbarsOut]) {
4329
+ const path = findStackOf(this._model, panelId);
4330
+ const stack = path === null ? null : findNode(this._model, path);
4331
+ if (stack === null || !isStack(stack) || this._stripHidden(stack)) this._returnToolbar(panelId, nodes);
4332
+ }
4333
+ }
4334
+ /** Whether `stack` currently renders without a tab strip. */
4335
+ _stripHidden(stack) {
4336
+ return stack.panels.length === 1 && (stack.hideSingleTabStrip ?? this.hideSingleTabStrip);
4261
4337
  }
4262
4338
  updated(changed) {
4263
4339
  super.updated(changed);
@@ -4386,11 +4462,7 @@ let DockHostElement = class DockHostElement extends LitElement {
4386
4462
  this._unobservePanel(el);
4387
4463
  this._toolbarsOut.delete(el.panelId);
4388
4464
  this._removeFromModel(el.panelId);
4389
- this.dispatchEvent(new CustomEvent(`dock-panel-removed`, {
4390
- detail: { panelId: el.panelId },
4391
- bubbles: true,
4392
- composed: true
4393
- }));
4465
+ this._emitRemoved(el.panelId);
4394
4466
  structuralChange = true;
4395
4467
  }
4396
4468
  for (const el of current) {
@@ -4398,11 +4470,7 @@ let DockHostElement = class DockHostElement extends LitElement {
4398
4470
  if (!collectPanelIds(this._model).includes(el.panelId)) {
4399
4471
  this._appendPanelToFirstStack(el.panelId);
4400
4472
  normalize(this._model);
4401
- this.dispatchEvent(new CustomEvent(`dock-panel-added`, {
4402
- detail: { panelId: el.panelId },
4403
- bubbles: true,
4404
- composed: true
4405
- }));
4473
+ this._emitAdded(el.panelId);
4406
4474
  structuralChange = true;
4407
4475
  }
4408
4476
  }
@@ -4420,6 +4488,7 @@ let DockHostElement = class DockHostElement extends LitElement {
4420
4488
  this._loadGeneration++;
4421
4489
  this._model = normalize(cloneNode(layout.root));
4422
4490
  this._mergePoolIntoModel();
4491
+ this._liveStacks = snapshotNonEmptyStacks(this._model);
4423
4492
  this.requestUpdate();
4424
4493
  this._emitChange();
4425
4494
  }
@@ -4479,11 +4548,7 @@ let DockHostElement = class DockHostElement extends LitElement {
4479
4548
  } else this._appendPanelToFirstStack(el.panelId);
4480
4549
  normalize(this._model);
4481
4550
  this.requestUpdate();
4482
- this.dispatchEvent(new CustomEvent(`dock-panel-added`, {
4483
- detail: { panelId: el.panelId },
4484
- bubbles: true,
4485
- composed: true
4486
- }));
4551
+ this._emitAdded(el.panelId);
4487
4552
  this._emitChange();
4488
4553
  return true;
4489
4554
  }
@@ -4506,11 +4571,7 @@ let DockHostElement = class DockHostElement extends LitElement {
4506
4571
  this._scanPanels().find((p) => p.panelId === panelId)?.remove();
4507
4572
  normalize(this._model);
4508
4573
  this.requestUpdate();
4509
- this.dispatchEvent(new CustomEvent(`dock-panel-removed`, {
4510
- detail: { panelId },
4511
- bubbles: true,
4512
- composed: true
4513
- }));
4574
+ this._emitRemoved(panelId);
4514
4575
  this._emitChange();
4515
4576
  return true;
4516
4577
  }
@@ -4753,7 +4814,10 @@ let DockHostElement = class DockHostElement extends LitElement {
4753
4814
  * {@link endExternalDrop} when the drag leaves or ends.
4754
4815
  */
4755
4816
  previewExternalDrop(clientX, clientY, panelId = `__external__`, kind) {
4756
- this.setDragActive(true);
4817
+ this.setDragActive(true, {
4818
+ panelId,
4819
+ kind
4820
+ });
4757
4821
  const zone = this.computeDropZone(clientX, clientY, panelId, kind);
4758
4822
  this.setDropZone(zone);
4759
4823
  return zone === null ? null : zoneToTarget(zone);
@@ -4769,11 +4833,12 @@ let DockHostElement = class DockHostElement extends LitElement {
4769
4833
  * panel lands where a drop there would put it (respecting `accepts` /
4770
4834
  * `canAccept` and leaf content rules); without them, or when the point
4771
4835
  * misses the host, it goes into the first stack admitting its kind.
4772
- * Returns the created element, or null when a panel
4773
- * with that id is already docked here.
4836
+ * Returns the created element, or null when a panel with that id is
4837
+ * already docked here or its kind is refused by `acceptsKinds`.
4774
4838
  */
4775
4839
  acceptExternalPanel(snapshot, at) {
4776
4840
  if (collectPanelIds(this._model).includes(snapshot.panelId)) return null;
4841
+ if (this.acceptsKinds !== null && !this.acceptsKinds.includes(normalizeKind(snapshot.kind))) return null;
4777
4842
  const el = document.createElement(`ixfx-dock-panel`);
4778
4843
  el.panelId = snapshot.panelId;
4779
4844
  if (snapshot.title !== void 0) el.title = snapshot.title;
@@ -4784,20 +4849,16 @@ let DockHostElement = class DockHostElement extends LitElement {
4784
4849
  if (`accepts` in snapshot && snapshot.accepts) el.setAttribute(`accepts`, snapshot.accepts);
4785
4850
  if (`contentHTML` in snapshot && snapshot.contentHTML) el.innerHTML = snapshot.contentHTML;
4786
4851
  this._returnAllToolbars();
4787
- this.appendChild(el);
4788
4852
  this._pool = [...this._pool, el];
4789
4853
  this._appendPanelToFirstStack(el.panelId);
4854
+ this.appendChild(el);
4790
4855
  normalize(this._model);
4791
4856
  this.endExternalDrop();
4792
4857
  const zone = at ? this.computeDropZone(at.clientX, at.clientY, el.panelId) : null;
4793
4858
  if (zone !== null) this._applyZone(el.panelId, zone);
4794
4859
  normalize(this._model);
4795
4860
  this.requestUpdate();
4796
- this.dispatchEvent(new CustomEvent(`dock-panel-added`, {
4797
- detail: { panelId: el.panelId },
4798
- bubbles: true,
4799
- composed: true
4800
- }));
4861
+ this._emitAdded(el.panelId);
4801
4862
  this._emitChange();
4802
4863
  return el;
4803
4864
  }
@@ -4816,6 +4877,7 @@ let DockHostElement = class DockHostElement extends LitElement {
4816
4877
  w: r.width,
4817
4878
  h: r.height
4818
4879
  });
4880
+ const splitsAllowed = tokenAllows(this.accepts, `horizontal`) || tokenAllows(this.accepts, `vertical`);
4819
4881
  for (const path of collectStackPaths(this._model)) {
4820
4882
  const leaf = this.shadowRoot?.querySelector(`[data-dock-path="${path.join(`-`)}"]`);
4821
4883
  if (!leaf) continue;
@@ -4823,7 +4885,7 @@ let DockHostElement = class DockHostElement extends LitElement {
4823
4885
  if (clientX < leafRect.left || clientX > leafRect.right || clientY < leafRect.top || clientY > leafRect.bottom) continue;
4824
4886
  const stack = findNode(this._model, path);
4825
4887
  if (stack === null || !isStack(stack)) continue;
4826
- const strip = leaf.querySelector(`ixfx-tab-list`);
4888
+ const strip = leaf.querySelector(`ixfx-tab-list`) ?? leaf.querySelector(`.ghost-strip`);
4827
4889
  if (strip !== null) {
4828
4890
  const stripRect = strip.getBoundingClientRect();
4829
4891
  if (clientX >= stripRect.left && clientX <= stripRect.right && clientY >= stripRect.top && clientY <= stripRect.bottom) {
@@ -4842,7 +4904,7 @@ let DockHostElement = class DockHostElement extends LitElement {
4842
4904
  }
4843
4905
  const relX = (clientX - leafRect.left) / Math.max(leafRect.width, 1);
4844
4906
  const relY = (clientY - leafRect.top) / Math.max(leafRect.height, 1);
4845
- if (relX >= BAND && relX <= .75 && relY >= BAND && relY <= .75) {
4907
+ if (!splitsAllowed || relX >= BAND && relX <= .75 && relY >= BAND && relY <= .75) {
4846
4908
  const zone = {
4847
4909
  host: this,
4848
4910
  operation: `tabs`,
@@ -4956,6 +5018,7 @@ let DockHostElement = class DockHostElement extends LitElement {
4956
5018
  return this._zoneAllowed(panelId, zone, resolvedKind) ? zone : null;
4957
5019
  }
4958
5020
  _zoneAllowed(panelId, zone, kind) {
5021
+ if (this.acceptsKinds !== null && !collectPanelIds(this._model).includes(panelId) && !this.acceptsKinds.includes(normalizeKind(kind))) return false;
4959
5022
  if (!tokenAllows(this.accepts, operationToToken(zone.operation))) return false;
4960
5023
  const stack = findNode(this._model, zone.targetPath);
4961
5024
  if (stack !== null && isStack(stack) && stack.panels.length === 1) {
@@ -4982,6 +5045,11 @@ let DockHostElement = class DockHostElement extends LitElement {
4982
5045
  }
4983
5046
  this._applyZone(panelId, zone, sourceHost === void 0 || sourceHost === this);
4984
5047
  this._commit();
5048
+ if (sourceHost !== void 0 && sourceHost !== this) this._emit(`dock-panel-moved`, {
5049
+ panelId,
5050
+ sourceHost,
5051
+ targetHost: this
5052
+ });
4985
5053
  }
4986
5054
  /**
4987
5055
  * Move `panelId` (already present somewhere in the model) to the position
@@ -5022,26 +5090,34 @@ let DockHostElement = class DockHostElement extends LitElement {
5022
5090
  }
5023
5091
  normalize(this._model);
5024
5092
  this._pool = this._pool.filter((p) => p !== el);
5025
- if (el !== void 0) target.adoptPanelElement(el);
5093
+ this._toolbarsOut.delete(panelId);
5094
+ this._emitRemoved(panelId, target);
5095
+ if (el !== void 0) target.adoptPanelElement(el, this);
5026
5096
  this.requestUpdate();
5097
+ this._emitChange();
5027
5098
  }
5028
- /** Adopt a panel element from another host (the one sanctioned reparent). */
5029
- adoptPanelElement(el) {
5030
- this.appendChild(el);
5099
+ /**
5100
+ * Adopt a panel element from another host (the one sanctioned reparent).
5101
+ * `sourceHost` is reported in `dock-panel-added`.
5102
+ */
5103
+ adoptPanelElement(el, sourceHost = null) {
5031
5104
  if (!this._pool.some((p) => p.panelId === el.panelId)) this._pool = [...this._pool, el];
5032
- this._appendPanelToFirstStack(el.panelId);
5105
+ if (!collectPanelIds(this._model).includes(el.panelId)) this._appendPanelToFirstStack(el.panelId);
5106
+ this.appendChild(el);
5033
5107
  normalize(this._model);
5034
- this.dispatchEvent(new CustomEvent(`dock-panel-added`, {
5035
- detail: { panelId: el.panelId },
5036
- bubbles: true,
5037
- composed: true
5038
- }));
5108
+ this._emitAdded(el.panelId, sourceHost);
5039
5109
  }
5040
- setDragActive(active) {
5110
+ /**
5111
+ * `drag` names the panel in flight when this host may receive it; it drives
5112
+ * the drop hint over a leaf whose tab strip is hidden.
5113
+ */
5114
+ setDragActive(active, drag) {
5115
+ const next = active && drag !== void 0 ? drag : null;
5041
5116
  if (this._dragActive !== active) {
5042
5117
  this._dragActive = active;
5043
5118
  this.requestUpdate();
5044
5119
  }
5120
+ if (this._dragPanel?.panelId !== next?.panelId || this._dragPanel?.kind !== next?.kind) this._dragPanel = next;
5045
5121
  }
5046
5122
  setDropZone(zone) {
5047
5123
  if (this._dropZone !== zone) {
@@ -5133,6 +5209,29 @@ let DockHostElement = class DockHostElement extends LitElement {
5133
5209
  }
5134
5210
  }
5135
5211
  }
5212
+ /**
5213
+ * Start a panel drag from an app-supplied handle — the way to move a panel
5214
+ * whose tab strip is hidden. Call it from the handle's `pointerdown`. The
5215
+ * drag begins once the pointer moves a few pixels (a plain click is left
5216
+ * alone) and then behaves exactly like a tab-item drag. Returns false when
5217
+ * the panel is not docked here or the press is not a primary-button press.
5218
+ */
5219
+ beginPanelDrag(panelId, event) {
5220
+ if (event.button !== 0 || !collectPanelIds(this._model).includes(panelId)) return false;
5221
+ this._armPanelDrag(panelId, event);
5222
+ return true;
5223
+ }
5224
+ _armPanelDrag(panelId, event) {
5225
+ this._tabDragPending = {
5226
+ panelId,
5227
+ pointerId: event.pointerId,
5228
+ startX: event.clientX,
5229
+ startY: event.clientY
5230
+ };
5231
+ window.addEventListener(`pointermove`, this._onTabDragMove);
5232
+ window.addEventListener(`pointerup`, this._onTabDragUp);
5233
+ window.addEventListener(`pointercancel`, this._onTabDragUp);
5234
+ }
5136
5235
  _teardownTabDragListeners() {
5137
5236
  window.removeEventListener(`pointermove`, this._onTabDragMove);
5138
5237
  window.removeEventListener(`pointerup`, this._onTabDragUp);
@@ -5214,13 +5313,44 @@ let DockHostElement = class DockHostElement extends LitElement {
5214
5313
  _returnAllToolbars() {
5215
5314
  for (const [panelId, nodes] of [...this._toolbarsOut]) this._returnToolbar(panelId, nodes);
5216
5315
  }
5217
- _emitChange() {
5218
- this.dispatchEvent(new CustomEvent(`dock-change`, {
5219
- detail: { layout: this.saveLayout() },
5316
+ /** Dispatch a bubbling, composed event; returns false when a cancelable one was cancelled. */
5317
+ _emit(type, detail, cancelable = false) {
5318
+ return this.dispatchEvent(new CustomEvent(type, {
5319
+ detail,
5220
5320
  bubbles: true,
5221
- composed: true
5321
+ composed: true,
5322
+ cancelable
5222
5323
  }));
5223
5324
  }
5325
+ _emitAdded(panelId, sourceHost = null) {
5326
+ this._emit(`dock-panel-added`, {
5327
+ panelId,
5328
+ sourceHost,
5329
+ targetHost: this
5330
+ });
5331
+ }
5332
+ _emitRemoved(panelId, targetHost = null) {
5333
+ this._emit(`dock-panel-removed`, {
5334
+ panelId,
5335
+ sourceHost: this,
5336
+ targetHost
5337
+ });
5338
+ }
5339
+ /** Announce `dock-stack-empty` for each stack that lost its last panel since the last change. */
5340
+ _announceEmptiedStacks() {
5341
+ const now = snapshotNonEmptyStacks(this._model);
5342
+ const emptied = findEmptiedStacks(this._liveStacks, now);
5343
+ this._liveStacks = now;
5344
+ for (const stack of emptied) this._emit(`dock-stack-empty`, {
5345
+ name: stack.name ?? null,
5346
+ hostEmpty: now.size === 0
5347
+ });
5348
+ }
5349
+ _emitChange() {
5350
+ const layout = this.saveLayout();
5351
+ this._announceEmptiedStacks();
5352
+ this._emit(`dock-change`, { layout });
5353
+ }
5224
5354
  render() {
5225
5355
  return html`
5226
5356
  <div class="root">
@@ -5291,6 +5421,12 @@ let DockHostElement = class DockHostElement extends LitElement {
5291
5421
  </div>
5292
5422
  `);
5293
5423
  const toolbarSlot = stack.name !== void 0 && this._toolbarSlots.has(`toolbar-${stack.name}`) ? html`<slot name="toolbar-${stack.name}" slot="toolbar"></slot>` : nothing;
5424
+ if (this._stripHidden(stack)) return leafAttrs(html`
5425
+ ${this._renderDropHint(stack, path)}
5426
+ <div class="leaf-body">
5427
+ <slot name="dock-panel-${stack.active}"></slot>
5428
+ </div>
5429
+ `);
5294
5430
  return leafAttrs(html`
5295
5431
  <ixfx-tab-list
5296
5432
  class="strip"
@@ -5300,6 +5436,7 @@ let DockHostElement = class DockHostElement extends LitElement {
5300
5436
  ?hide-labels=${stack.hideLabels === true}
5301
5437
  @change=${(e) => this._onTabChange(e, path)}
5302
5438
  @pointerdown=${this._onStripPointerDown}
5439
+ @contextmenu=${this._onStripContextMenu}
5303
5440
  >
5304
5441
  ${repeat(stack.panels, (id) => id, (id) => this._renderTabItem(stack, id))}
5305
5442
  ${toolbarSlot}
@@ -5308,6 +5445,34 @@ let DockHostElement = class DockHostElement extends LitElement {
5308
5445
  <slot name="dock-panel-${stack.active}"></slot>
5309
5446
  </div>
5310
5447
  `);
5448
+ }
5449
+ /**
5450
+ * While a drag that this leaf would accept is in flight, overlay a compact
5451
+ * strip stand-in on the hidden strip's slot: it shows where the dropped tab
5452
+ * will land (the overlay takes no layout space, so nothing jumps).
5453
+ */
5454
+ _renderDropHint(stack, path) {
5455
+ const drag = this._dragPanel;
5456
+ if (!this._dragActive || drag === null || stack.panels[0] === drag.panelId) return nothing;
5457
+ const probe = {
5458
+ host: this,
5459
+ operation: `tabs`,
5460
+ targetPath: path,
5461
+ side: `after`,
5462
+ rect: {
5463
+ x: 0,
5464
+ y: 0,
5465
+ w: 0,
5466
+ h: 0
5467
+ }
5468
+ };
5469
+ if (!this._zoneAllowed(drag.panelId, probe, drag.kind)) return nothing;
5470
+ const id = stack.panels[0];
5471
+ return html`
5472
+ <div class="ghost-strip" part="drop-hint">
5473
+ <span class="ghost-tab">${this._findPanelEl(id)?.title || id}</span>
5474
+ </div>
5475
+ `;
5311
5476
  }
5312
5477
  _renderTabItem(stack, panelId) {
5313
5478
  const el = this._findPanelEl(panelId);
@@ -5322,7 +5487,7 @@ let DockHostElement = class DockHostElement extends LitElement {
5322
5487
  `;
5323
5488
  }
5324
5489
  _stripCaretRect(strip, gapIndex, hostRect) {
5325
- const items = Array.from(strip.querySelectorAll(`ixfx-tab-list-item`));
5490
+ const items = Array.from(strip.querySelectorAll(STRIP_ITEMS));
5326
5491
  if (items.length === 0) return void 0;
5327
5492
  const index = Math.max(0, Math.min(gapIndex ?? items.length, items.length));
5328
5493
  const edge = index < items.length ? items[index].getBoundingClientRect().left : items[items.length - 1].getBoundingClientRect().right;
@@ -5369,6 +5534,7 @@ let DockHostElement = class DockHostElement extends LitElement {
5369
5534
  min-height: 0;
5370
5535
  box-sizing: border-box;
5371
5536
  overflow: hidden;
5537
+ position: relative;
5372
5538
  border: 1px solid var(--surface-4);
5373
5539
  border-radius: var(--radius-m);
5374
5540
  }
@@ -5406,6 +5572,32 @@ let DockHostElement = class DockHostElement extends LitElement {
5406
5572
  padding-right: var(--space-xs);
5407
5573
  }
5408
5574
 
5575
+ /* Drop hint over a hidden strip: overlaid, so it reserves no height. */
5576
+ .ghost-strip {
5577
+ position: absolute;
5578
+ inset: 0 0 auto 0;
5579
+ height: var(--dock-tab-height, 30px);
5580
+ z-index: 1;
5581
+ display: flex;
5582
+ align-items: center;
5583
+ box-sizing: border-box;
5584
+ padding: 0 var(--space-s);
5585
+ background: var(--surface-3);
5586
+ border-bottom: 1px solid var(--surface-4);
5587
+ color: var(--surface-3-text);
5588
+ font-size: var(--text-m);
5589
+ pointer-events: none;
5590
+ }
5591
+
5592
+ .ghost-tab {
5593
+ overflow: hidden;
5594
+ text-overflow: ellipsis;
5595
+ white-space: nowrap;
5596
+ text-decoration: underline;
5597
+ text-decoration-thickness: 2px;
5598
+ text-underline-offset: 4px;
5599
+ }
5600
+
5409
5601
  .leaf-body {
5410
5602
  flex: 1;
5411
5603
  min-height: 0;
@@ -5497,11 +5689,24 @@ __decorate([property({
5497
5689
  type: Boolean,
5498
5690
  attribute: `isolated`
5499
5691
  })], DockHostElement.prototype, "isolated", void 0);
5692
+ __decorate([property({
5693
+ type: Boolean,
5694
+ attribute: `hide-single-tab-strip`
5695
+ })], DockHostElement.prototype, "hideSingleTabStrip", void 0);
5696
+ __decorate([property({
5697
+ type: String,
5698
+ attribute: `family`
5699
+ })], DockHostElement.prototype, "family", void 0);
5700
+ __decorate([property({
5701
+ attribute: `accepts-kinds`,
5702
+ converter: { fromAttribute: (value) => value === null ? null : value.split(/\s+/).filter((k) => k.length > 0) }
5703
+ })], DockHostElement.prototype, "acceptsKinds", void 0);
5500
5704
  __decorate([property({ attribute: false })], DockHostElement.prototype, "canAccept", void 0);
5501
5705
  __decorate([state()], DockHostElement.prototype, "_model", void 0);
5502
5706
  __decorate([state()], DockHostElement.prototype, "_pool", void 0);
5503
5707
  __decorate([state()], DockHostElement.prototype, "_dropZone", void 0);
5504
5708
  __decorate([state()], DockHostElement.prototype, "_dragActive", void 0);
5709
+ __decorate([state()], DockHostElement.prototype, "_dragPanel", void 0);
5505
5710
  __decorate([state()], DockHostElement.prototype, "_junctions", void 0);
5506
5711
  DockHostElement = __decorate([safeCustomElement(`ixfx-dock-host`)], DockHostElement);
5507
5712
  /** `split-horizontal` = horizontal divider = panels stacked vertically. */
@@ -5551,13 +5756,18 @@ function normalizeKind(kind) {
5551
5756
  function parsePath(pathStr) {
5552
5757
  return pathStr.length === 0 ? [] : pathStr.split(`-`).filter((s) => s.length > 0).map(Number);
5553
5758
  }
5759
+ /** The tab item in an event's composed path, if it has a panel id. */
5760
+ function tabItemIn(path) {
5761
+ const item = path.find((node) => node instanceof HTMLElement && node.tagName === `IXFX-TAB-LIST-ITEM`);
5762
+ return item !== void 0 && item.id ? item : null;
5763
+ }
5554
5764
  /** Toolbar-slot light children of a dock panel. */
5555
5765
  function toolbarNodesOf(el) {
5556
5766
  return Array.from(el.children).filter((c) => c instanceof HTMLElement && c.getAttribute(`slot`) === `toolbar`);
5557
5767
  }
5558
5768
  /** Nearest strip gap to the pointer (reuses the tab-list midpoint rule). */
5559
5769
  function computeStripGapIndex(strip, clientX, _clientY) {
5560
- const items = Array.from(strip.querySelectorAll(`ixfx-tab-list-item`));
5770
+ const items = Array.from(strip.querySelectorAll(STRIP_ITEMS));
5561
5771
  if (items.length === 0) return 0;
5562
5772
  for (let i = 0; i < items.length; i++) {
5563
5773
  const r = items[i].getBoundingClientRect();
@@ -16057,4 +16267,4 @@ function init() {
16057
16267
  console.log(`Init`);
16058
16268
  }
16059
16269
  //#endregion
16060
- export { AcTextElement, AcTokenElement, BottomDrawerElement, ButtonElement, Checkbox, CheckedSelect, ColourPicker, ColourPickerPopup, CrumbNavigationElement, CrumbPathController, CrumbPathElement, DEFAULT_SIBLING_SPACING, DataController, DataDisplayComponent, DataGridElement, DataTableElement, DetailListElement, DockHostElement, DockPanelElement, EMPTY_GROUP_LABEL, EditableLabel, EditableNumber, FlatListElement, FormElement, FormGroupElement, FormOptionsElement, FormPartElement, FormRowElement, GridListElement, GroupedItemListerElement, HyperbolicTreeListElement, ICON_CARET_RIGHT, ICON_CHECK, ICON_CHEVRON_DOWN, ICON_CLOSE, IcicleTreeListElement, IncrSearchTreeController as IncrSearchMillerController, IncrSearchTreeController, IxfxHexEditorElement, IxfxIconElement, IxfxTimelineElement, KeyedElementIndex, LIST_ITEM_MOTION_MS, LIST_SEARCH_COMMAND_IDS, LIST_SEARCH_MODES, LabelledRadialInput, LabelledRangeInput, LabelledSliderInput, LedElement, ListDragSelectController, ListGroupHeaderElement, ListNativeDragController, ListSearchController, ListSelectionController, menu_exports as Menu, MillerBaseElement, MillerListElement, MillerTreeController, MulticolListElement, NarrowedTextElement, NotificationManager, NotificationPillElement, PanTextElement, PanelElement, PanelGroupElement, PlotDataSeries, PlotHistogram, PlotMultiAxis, PlotSingleAxis, PlotXyAxis, PolarPad, RadialInputElement, RadioGroup, RangeElement, RangeInput, RangeMultiElement, RatingElement, SelectHorizElement, ShapefillValueElement, SliderInputElement, SlidingNumberElement, SnackbarElement, SnapContainer, SplitButton, SplitLayoutElement, SplitPanelElement, SwipeElement, TabController, TabListElement, TabListItemElement, TabPanelElement, TabPanelsElement, TextShimmerElement, TickledController, TimelineController, TimelineTrackTabElement, TitlebarElement, ToolbarElement, ToolbarGroupElement, TooltipElement, TransitoryLabelElement, TreeBaseElement, TreeController, TreeDataModel, TreeDropController, TreeKeyboardNavController, TreeListElement, TreemapListElement, TwoSplitLayoutElement, VerticalListElement, XyPad, addPanelToStack, animateListItemIn, animateListItemOut, applyAgeModification, applyHighlights, applyIsometry, applySnapshot, applyTreeDrop, attachTimelineInteractions, bottomDrawerCommandId, buildHighlightTargets, buildModel, captionForEntry, clampToDisk, clearHighlights, collectContainerNames, collectDataResult, collectPanelIds, collectStackPaths, composeIsometry, computeCanonicalPositions, computeColour, computeHyperbolicLayout, computeIcicleLayout, computeLeafGeoms, computeTreemapLayout, createAcCompletionProvider, createDataListSearchAdapter, createDefaultListDragPreview, createElementIncrSearch, createElementListSearchAdapter, createEmptyLayout, createEmptyStack, createFuzzySearch, createIncrSearch, createPillRenderer, createSplit, createStack, createTreeListAdapter, createTreeListSearchAdapter, createVerticalListAdapter, decomposeViewIsometry, defaultGroupLabel, distribute, dropTargetFor, euclideanRadiusForHyperbolicDistance, extractStack, findHyperbolicIdOf, findHyperbolicKeyPath, findHyperbolicNode, findHyperbolicPath, findHyperbolicPathById, findIcicleNode, findIciclePath, findNode, findPanelNode, findParentOf, findStackOf, findStackPathByName, findTreemapNode, findTreemapPath, geodesicInterpolate, geodesicPath, geodesicSegment, getActiveDragPanelId, getIcon, getIconEntry, getIconFont, getLeafNeighbours, hasIcon, hyperbolicBranchId, hyperbolicChildIds, hyperbolicDistanceForEuclideanRadius, hyperbolicIdDepth, hyperbolicRelativeFrame, iconBus, identityIsometry, init, insertBeside, invertIsometry, isDragging, isHyperbolicDescendantId, isMultiMode, isSplit, isStack, keyForElement, listItemFadeKeyframes, listSearchStyles, mobiusAdd, mobiusFromOrigin, mobiusToOrigin, monitorIndeterminate, moveLeafNodeToEdge, moveLeafStep, norm, normalise, normaliseValue, normalize, panelGapIndex, parseColourScaleAttr, parseLayout, partitionByGroup, poincareDistance, pointerOverAnyHost, prefersReducedMotion, preserveRestoreWeights, pruneDraggedDescendants, readBaseColour, registerFontIcon, registerIcon, registerListSearchCommands, removePanelFromStack, resolveCssVars, resolveGrid, resolveGroupKey, resolveLeafPath, resolveTracks, rotationIsometry, serializeLayout, setActive, setIconFont, setPanelRestoreWeight, startListItemOutAnimation, svgToDataUri, swapLeaves, tickledItemStyles, tickledStyles, timelineStyles, toGroupKey, toSnapshot, toggleInSet, toolbarGapIndex, translationFromOrigin, viewIsometry, walk, wrapRoot };
16270
+ export { AcTextElement, AcTokenElement, BottomDrawerElement, ButtonElement, Checkbox, CheckedSelect, ColourPicker, ColourPickerPopup, CrumbNavigationElement, CrumbPathController, CrumbPathElement, DEFAULT_SIBLING_SPACING, DataController, DataDisplayComponent, DataGridElement, DataTableElement, DetailListElement, DockHostElement, DockPanelElement, EMPTY_GROUP_LABEL, EditableLabel, EditableNumber, FlatListElement, FormElement, FormGroupElement, FormOptionsElement, FormPartElement, FormRowElement, GridListElement, GroupedItemListerElement, HyperbolicTreeListElement, ICON_CARET_RIGHT, ICON_CHECK, ICON_CHEVRON_DOWN, ICON_CLOSE, IcicleTreeListElement, IncrSearchTreeController as IncrSearchMillerController, IncrSearchTreeController, IxfxHexEditorElement, IxfxIconElement, IxfxTimelineElement, KeyedElementIndex, LIST_ITEM_MOTION_MS, LIST_SEARCH_COMMAND_IDS, LIST_SEARCH_MODES, LabelledRadialInput, LabelledRangeInput, LabelledSliderInput, LedElement, ListDragSelectController, ListGroupHeaderElement, ListNativeDragController, ListSearchController, ListSelectionController, menu_exports as Menu, MillerBaseElement, MillerListElement, MillerTreeController, MulticolListElement, NarrowedTextElement, NotificationManager, NotificationPillElement, PanTextElement, PanelElement, PanelGroupElement, PlotDataSeries, PlotHistogram, PlotMultiAxis, PlotSingleAxis, PlotXyAxis, PolarPad, RadialInputElement, RadioGroup, RangeElement, RangeInput, RangeMultiElement, RatingElement, SUNBURST_PATH_SEPARATOR, SelectHorizElement, ShapefillValueElement, SliderInputElement, SlidingNumberElement, SnackbarElement, SnapContainer, SplitButton, SplitLayoutElement, SplitPanelElement, SunburstTreeListElement, SwipeElement, TabController, TabListElement, TabListItemElement, TabPanelElement, TabPanelsElement, TextShimmerElement, TickledController, TimelineController, TimelineTrackTabElement, TitlebarElement, ToolbarElement, ToolbarGroupElement, TooltipElement, TransitoryLabelElement, TreeBaseElement, TreeController, TreeDataModel, TreeDropController, TreeKeyboardNavController, TreeListElement, TreemapListElement, TwoSplitLayoutElement, VerticalListElement, XyPad, addPanelToStack, animateListItemIn, animateListItemOut, applyAgeModification, applyHighlights, applyIsometry, applySnapshot, applyTreeDrop, attachTimelineInteractions, bottomDrawerCommandId, buildHighlightTargets, buildModel, captionForEntry, clampToDisk, clearHighlights, collectContainerNames, collectDataResult, collectPanelIds, collectStackPaths, composeIsometry, computeCanonicalPositions, computeColour, computeHyperbolicLayout, computeIcicleLayout, computeLeafGeoms, computeSunburstLayout, computeTreemapLayout, createAcCompletionProvider, createDataListSearchAdapter, createDefaultListDragPreview, createElementIncrSearch, createElementListSearchAdapter, createEmptyLayout, createEmptyStack, createFuzzySearch, createIncrSearch, createPillRenderer, createSplit, createStack, createTreeListAdapter, createTreeListSearchAdapter, createValueResolver, createVerticalListAdapter, decomposeViewIsometry, defaultGroupLabel, defaultSunburstValueAccessor, distribute, dropTargetFor, euclideanRadiusForHyperbolicDistance, extractStack, findEmptiedStacks, findHyperbolicIdOf, findHyperbolicKeyPath, findHyperbolicNode, findHyperbolicPath, findHyperbolicPathById, findIcicleNode, findIciclePath, findNode, findPanelNode, findParentOf, findStackOf, findStackPathByName, findSunburstId, findSunburstNodeById, findTreemapNode, findTreemapPath, geodesicInterpolate, geodesicPath, geodesicSegment, getActiveDragPanelId, getIcon, getIconEntry, getIconFont, getLeafNeighbours, hasIcon, hyperbolicBranchId, hyperbolicChildIds, hyperbolicDistanceForEuclideanRadius, hyperbolicIdDepth, hyperbolicRelativeFrame, iconBus, identityIsometry, init, insertBeside, invertIsometry, isDragging, isHyperbolicDescendantId, isMultiMode, isSplit, isStack, isSunburstAncestorId, keyForElement, listItemFadeKeyframes, listSearchStyles, mobiusAdd, mobiusFromOrigin, mobiusToOrigin, monitorIndeterminate, moveLeafNodeToEdge, moveLeafStep, norm, normalise, normaliseValue, normalize, panelGapIndex, parseColourScaleAttr, parseLayout, partitionByGroup, poincareDistance, pointerOverAnyHost, prefersReducedMotion, preserveRestoreWeights, pruneDraggedDescendants, readBaseColour, registerFontIcon, registerIcon, registerListSearchCommands, removePanelFromStack, resolveCssVars, resolveGrid, resolveGroupKey, resolveLeafPath, resolveTracks, rotationIsometry, serializeLayout, setActive, setIconFont, setPanelRestoreWeight, snapshotNonEmptyStacks, startListItemOutAnimation, sunburstChildId, sunburstHasChildren, sunburstIdToPath, sunburstParentId, sunburstPathToId, svgToDataUri, swapLeaves, tickledItemStyles, tickledStyles, timelineStyles, toGroupKey, toSnapshot, toggleInSet, toolbarGapIndex, translationFromOrigin, viewIsometry, walk, wrapRoot };
@@ -1,4 +1,4 @@
1
- import { F as ListDragPreviewContext, I as ListDragPreviewRenderer, L as ListDragPreviewSourceResolver, N as ListDragEntry, R as ListDragSource, z as ListNativeDragStartDetail } from "./tree-component-CDsYTBDi.js";
1
+ import { F as ListDragPreviewContext, I as ListDragPreviewRenderer, L as ListDragPreviewSourceResolver, N as ListDragEntry, R as ListDragSource, z as ListNativeDragStartDetail } from "./tree-component-C6UHO-w9.js";
2
2
  import { ReactiveController, ReactiveControllerHost } from "lit";
3
3
  //#region src/interaction/list-native-drag-controller.d.ts
4
4
  type ListNativeDragControllerConfig<T> = {