@ixfx/components 0.15.3 → 0.15.4

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 (55) hide show
  1. package/bundle/index.d.ts +167 -13
  2. package/bundle/index.js +202 -164
  3. package/dist/ac-text.d.ts +1 -1
  4. package/dist/{ac-token-qEs3FsQv.d.ts → ac-token-Cq7lsYf-.d.ts} +1 -1
  5. package/dist/ac-token.d.ts +1 -1
  6. package/dist/colour-picker.d.ts +1 -1
  7. package/dist/crumbs.d.ts +2 -2
  8. package/dist/{data-grid-DmkId8bu.d.ts → data-grid-CbiubdG2.d.ts} +4 -4
  9. package/dist/data-grid.d.ts +2 -2
  10. package/dist/{detail-list-CmQqeXvp.d.ts → detail-list-ClkMV0SN.d.ts} +4 -4
  11. package/dist/detail-list.d.ts +3 -3
  12. package/dist/{flat-list-BmQBB3ZC.d.ts → flat-list-0xTZdXzh.d.ts} +3 -3
  13. package/dist/flat-list.d.ts +1 -1
  14. package/dist/{grid-list-BVsUEvgd.d.ts → grid-list-BnWJUIBC.d.ts} +3 -3
  15. package/dist/grid-list.d.ts +2 -2
  16. package/dist/{grouped-item-lister-DETte0Dh.d.ts → grouped-item-lister-Bhyo-dkH.d.ts} +1 -1
  17. package/dist/grouped-item-lister.d.ts +1 -1
  18. package/dist/{icon-CDGprSdE.d.ts → icon-DR_3rSyZ.d.ts} +1 -1
  19. package/dist/icons.d.ts +2 -2
  20. package/dist/incr-search.d.ts +1 -1
  21. package/dist/{index-DuhzWWTr.d.ts → index-BAuqR9El.d.ts} +28 -8
  22. package/dist/{index-BvoXLnBf.d.ts → index-BPTuCRGb.d.ts} +2 -2
  23. package/dist/{index-CoqtMSd9.d.ts → index-BUB5SICW.d.ts} +1 -1
  24. package/dist/{index-DN2BWctP.d.ts → index-Bz3loIAf.d.ts} +1 -1
  25. package/dist/{index-UvnoZUAo.d.ts → index-CJ5fshD3.d.ts} +1 -1
  26. package/dist/{index-DxyyVqzA.d.ts → index-cnaRPQPp.d.ts} +2 -2
  27. package/dist/{index-CYndvTWH.d.ts → index-garxxqgV.d.ts} +1 -1
  28. package/dist/index.d.ts +152 -27
  29. package/dist/index.js +272 -63
  30. package/dist/{labelled-input-base-DiTme1JO.d.ts → labelled-input-base-Dp_9KP0G.d.ts} +1 -1
  31. package/dist/labelled-radial-input.d.ts +2 -2
  32. package/dist/labelled-range-input.d.ts +1 -1
  33. package/dist/labelled-slider-input.d.ts +1 -1
  34. package/dist/list-group-header.d.ts +1 -1
  35. package/dist/{list-native-drag-controller-NMspr0E1.d.ts → list-native-drag-controller-O2Nruqpi.d.ts} +1 -1
  36. package/dist/{menu-item-bF6narIz.d.ts → menu-item-B0zqw2xp.d.ts} +1 -1
  37. package/dist/menu.d.ts +2 -2
  38. package/dist/miller.d.ts +2 -2
  39. package/dist/panel.d.ts +1 -1
  40. package/dist/{split-layout-JK3xWVX2.d.ts → split-layout-C5SYbDrq.d.ts} +1 -1
  41. package/dist/split-layout.d.ts +1 -1
  42. package/dist/{tab-list-Df371rqw.d.ts → tab-list-wC0xNz1b.d.ts} +1 -1
  43. package/dist/tabs.d.ts +1 -1
  44. package/dist/{titlebar-Tqu-VvMU.d.ts → titlebar-B5zSTZnF.d.ts} +1 -1
  45. package/dist/titlebar.d.ts +1 -1
  46. package/dist/{tree-2_TRrLAV.js → tree-D8VxvR9u.js} +44 -5
  47. package/dist/{tree-component-CDsYTBDi.d.ts → tree-component-C6UHO-w9.d.ts} +12 -3
  48. package/dist/tree.d.ts +3 -3
  49. package/dist/tree.js +1 -1
  50. package/dist/{vertical-list-ztrdFvyT.d.ts → vertical-list-B8FoU-pU.d.ts} +2 -2
  51. package/dist/vertical-list.d.ts +2 -2
  52. package/docs-user/dock.md +62 -1
  53. package/docs-user/index.json +2 -2
  54. package/docs-user/tree.md +39 -0
  55. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -26,7 +26,7 @@ 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";
@@ -2723,7 +2723,10 @@ function startDrag(panelId, sourceHost, pointerId, clientX, clientY, kind) {
2723
2723
  ghost: createGhostForPanel(sourceHost, panelId),
2724
2724
  outside: false
2725
2725
  };
2726
- for (const host of dragHosts) host.setDragActive(true);
2726
+ for (const host of dragHosts) host.setDragActive(true, hostsExchange(sourceHost, host) ? {
2727
+ panelId,
2728
+ kind
2729
+ } : void 0);
2727
2730
  activeDrag.ghost?.move(clientX, clientY);
2728
2731
  window.addEventListener(`pointermove`, onPointerMove);
2729
2732
  window.addEventListener(`pointerup`, onPointerUp);
@@ -2788,10 +2791,18 @@ function onKeyDown(event) {
2788
2791
  if (event.key !== `Escape`) return;
2789
2792
  endDrag();
2790
2793
  }
2794
+ /**
2795
+ * Whether `target` may receive panels dragged from `source`: always for the
2796
+ * same host; otherwise only when the source is not `isolated` and both hosts
2797
+ * share a `family`.
2798
+ */
2799
+ function hostsExchange(source, target) {
2800
+ if (source === target) return true;
2801
+ return !source.isolated && source.family === target.family;
2802
+ }
2791
2803
  function findDropZone(drag, clientX, clientY) {
2792
- const sourceIsolated = drag.sourceHost.isolated;
2793
2804
  for (const host of dragHosts) {
2794
- if (sourceIsolated && host !== drag.sourceHost) continue;
2805
+ if (!hostsExchange(drag.sourceHost, host)) continue;
2795
2806
  const zone = host.computeDropZone(clientX, clientY, drag.panelId, drag.kind);
2796
2807
  if (zone !== null) return zone;
2797
2808
  }
@@ -2957,6 +2968,8 @@ function replaceNodeContents(target, source) {
2957
2968
  else delete t.name;
2958
2969
  if (source.hideLabels !== void 0) t.hideLabels = source.hideLabels;
2959
2970
  else delete t.hideLabels;
2971
+ if (source.hideSingleTabStrip !== void 0) t.hideSingleTabStrip = source.hideSingleTabStrip;
2972
+ else delete t.hideSingleTabStrip;
2960
2973
  delete t.collapsed;
2961
2974
  delete t.preCollapseSize;
2962
2975
  if (source.collapsed !== void 0) t.collapsed = source.collapsed;
@@ -2971,6 +2984,8 @@ function replaceNodeContents(target, source) {
2971
2984
  delete stale.panels;
2972
2985
  delete stale.active;
2973
2986
  delete stale.name;
2987
+ delete stale.hideLabels;
2988
+ delete stale.hideSingleTabStrip;
2974
2989
  delete stale.collapsed;
2975
2990
  delete stale.preCollapseSize;
2976
2991
  }
@@ -3387,6 +3402,8 @@ function moveLeafNodeToEdge(root, ref, edge) {
3387
3402
  active: rest.active
3388
3403
  };
3389
3404
  if (rest.name !== void 0) remaining.name = rest.name;
3405
+ if (rest.hideLabels !== void 0) remaining.hideLabels = rest.hideLabels;
3406
+ if (rest.hideSingleTabStrip !== void 0) remaining.hideSingleTabStrip = rest.hideSingleTabStrip;
3390
3407
  if (rest.collapsed !== void 0) remaining.collapsed = rest.collapsed;
3391
3408
  if (rest.preCollapseSize !== void 0) remaining.preCollapseSize = rest.preCollapseSize;
3392
3409
  replaceNodeContents(root, {
@@ -3436,6 +3453,7 @@ function serializeNode(node) {
3436
3453
  };
3437
3454
  if (node.name !== void 0) out.name = node.name;
3438
3455
  if (node.hideLabels !== void 0) out.hideLabels = node.hideLabels;
3456
+ if (node.hideSingleTabStrip !== void 0) out.hideSingleTabStrip = node.hideSingleTabStrip;
3439
3457
  if (node.collapsed !== void 0) out.collapsed = node.collapsed;
3440
3458
  if (node.preCollapseSize !== void 0) out.preCollapseSize = node.preCollapseSize;
3441
3459
  return out;
@@ -3465,6 +3483,36 @@ function parseLayout(json) {
3465
3483
  return null;
3466
3484
  }
3467
3485
  }
3486
+ /** Every stack holding at least one panel, keyed by node identity. */
3487
+ function snapshotNonEmptyStacks(root) {
3488
+ const out = /* @__PURE__ */ new Map();
3489
+ const visit = (node) => {
3490
+ if (isStack(node)) {
3491
+ if (node.panels.length > 0) out.set(node, {
3492
+ name: node.name,
3493
+ key: node.panels.join(`\n`)
3494
+ });
3495
+ return;
3496
+ }
3497
+ node.children.forEach(visit);
3498
+ };
3499
+ visit(root);
3500
+ return out;
3501
+ }
3502
+ /**
3503
+ * Stacks in `before` that no longer hold their panels in `after`. A stack
3504
+ * node that was re-created with the same panels (some leaf moves rebuild
3505
+ * nodes) does not count as emptied.
3506
+ */
3507
+ function findEmptiedStacks(before, after) {
3508
+ const afterKeys = new Set([...after.values()].map((s) => s.key));
3509
+ const emptied = [];
3510
+ for (const [node, snapshot] of before) {
3511
+ if (after.has(node) || afterKeys.has(snapshot.key)) continue;
3512
+ emptied.push(snapshot);
3513
+ }
3514
+ return emptied;
3515
+ }
3468
3516
  //#endregion
3469
3517
  //#region src/tabs/tab-list-item.ts
3470
3518
  const resizeHandlers = /* @__PURE__ */ new WeakMap();
@@ -4078,6 +4126,8 @@ DockPanelElement = __decorate([safeCustomElement(`ixfx-dock-panel`)], DockPanelE
4078
4126
  const BAND = .25;
4079
4127
  /** Pointer movement threshold before a press becomes a dock drag (matches tab-list). */
4080
4128
  const DRAG_THRESHOLD_PX$3 = 5;
4129
+ /** Tab items of a strip, or the stand-in tab of a hidden strip's drop hint. */
4130
+ const STRIP_ITEMS = `ixfx-tab-list-item, .ghost-tab`;
4081
4131
  /** Tolerance (px) when matching a child gutter endpoint to a parent gutter line. */
4082
4132
  const JUNCTION_TOL_PX = 6;
4083
4133
  /** Junction points closer than this merge into one handle (a 4-way cross yields one per side). */
@@ -4088,10 +4138,15 @@ let DockHostElement = class DockHostElement extends LitElement {
4088
4138
  this.layout = null;
4089
4139
  this.accepts = `tabs horizontal vertical`;
4090
4140
  this.isolated = false;
4141
+ this.hideSingleTabStrip = false;
4142
+ this.family = ``;
4143
+ this.acceptsKinds = null;
4091
4144
  this._model = createStack([]);
4092
4145
  this._pool = [];
4093
4146
  this._dropZone = null;
4094
4147
  this._dragActive = false;
4148
+ this._dragPanel = null;
4149
+ this._liveStacks = /* @__PURE__ */ new Map();
4095
4150
  this._junctions = [];
4096
4151
  this._toolbarsOut = /* @__PURE__ */ new Map();
4097
4152
  this._leafContentRules = /* @__PURE__ */ new Map();
@@ -4104,6 +4159,7 @@ let DockHostElement = class DockHostElement extends LitElement {
4104
4159
  this._toolbarObserver = null;
4105
4160
  this._panelObservers = /* @__PURE__ */ new Map();
4106
4161
  this._onDragStart = (event) => {
4162
+ if (event.composedPath().find((n) => n instanceof HTMLElement && n.tagName === `IXFX-DOCK-HOST`) !== this) return;
4107
4163
  const { panelId, pointerId, clientX, clientY } = event.detail;
4108
4164
  startDrag(panelId, this, pointerId, clientX, clientY, this._findPanelEl(panelId)?.kind);
4109
4165
  };
@@ -4179,17 +4235,18 @@ let DockHostElement = class DockHostElement extends LitElement {
4179
4235
  if (!(node instanceof HTMLElement)) continue;
4180
4236
  if (node.classList.contains(`list-toolbar`) || node.classList.contains(`close-btn`)) return;
4181
4237
  }
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 = {
4238
+ const item = tabItemIn(path);
4239
+ if (item === null) return;
4240
+ this._armPanelDrag(item.id, event);
4241
+ };
4242
+ this._onStripContextMenu = (event) => {
4243
+ const item = tabItemIn(event.composedPath());
4244
+ if (item === null) return;
4245
+ if (!this._emit(`dock-tab-contextmenu`, {
4185
4246
  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);
4247
+ clientX: event.clientX,
4248
+ clientY: event.clientY
4249
+ }, true)) event.preventDefault();
4193
4250
  };
4194
4251
  this._onTabDragMove = (event) => {
4195
4252
  const pending = this._tabDragPending;
@@ -4218,6 +4275,7 @@ let DockHostElement = class DockHostElement extends LitElement {
4218
4275
  connectedCallback() {
4219
4276
  super.connectedCallback();
4220
4277
  this._buildInitialModel();
4278
+ this._liveStacks = snapshotNonEmptyStacks(this._model);
4221
4279
  registerDockHost(this);
4222
4280
  this.addEventListener(`dock-panel-drag-start`, this._onDragStart);
4223
4281
  this._hostResizeObserver = new ResizeObserver(() => this._scheduleJunctions());
@@ -4256,8 +4314,25 @@ let DockHostElement = class DockHostElement extends LitElement {
4256
4314
  if (parsed) {
4257
4315
  this._model = parsed.root;
4258
4316
  this._mergePoolIntoModel();
4317
+ this._liveStacks = snapshotNonEmptyStacks(this._model);
4259
4318
  }
4260
4319
  }
4320
+ this._returnToolbarsOfHiddenStrips();
4321
+ }
4322
+ /**
4323
+ * A toolbar parked in a tab item would be destroyed with the strip, so
4324
+ * hand it back before a hidden strip stops rendering.
4325
+ */
4326
+ _returnToolbarsOfHiddenStrips() {
4327
+ for (const [panelId, nodes] of [...this._toolbarsOut]) {
4328
+ const path = findStackOf(this._model, panelId);
4329
+ const stack = path === null ? null : findNode(this._model, path);
4330
+ if (stack === null || !isStack(stack) || this._stripHidden(stack)) this._returnToolbar(panelId, nodes);
4331
+ }
4332
+ }
4333
+ /** Whether `stack` currently renders without a tab strip. */
4334
+ _stripHidden(stack) {
4335
+ return stack.panels.length === 1 && (stack.hideSingleTabStrip ?? this.hideSingleTabStrip);
4261
4336
  }
4262
4337
  updated(changed) {
4263
4338
  super.updated(changed);
@@ -4386,11 +4461,7 @@ let DockHostElement = class DockHostElement extends LitElement {
4386
4461
  this._unobservePanel(el);
4387
4462
  this._toolbarsOut.delete(el.panelId);
4388
4463
  this._removeFromModel(el.panelId);
4389
- this.dispatchEvent(new CustomEvent(`dock-panel-removed`, {
4390
- detail: { panelId: el.panelId },
4391
- bubbles: true,
4392
- composed: true
4393
- }));
4464
+ this._emitRemoved(el.panelId);
4394
4465
  structuralChange = true;
4395
4466
  }
4396
4467
  for (const el of current) {
@@ -4398,11 +4469,7 @@ let DockHostElement = class DockHostElement extends LitElement {
4398
4469
  if (!collectPanelIds(this._model).includes(el.panelId)) {
4399
4470
  this._appendPanelToFirstStack(el.panelId);
4400
4471
  normalize(this._model);
4401
- this.dispatchEvent(new CustomEvent(`dock-panel-added`, {
4402
- detail: { panelId: el.panelId },
4403
- bubbles: true,
4404
- composed: true
4405
- }));
4472
+ this._emitAdded(el.panelId);
4406
4473
  structuralChange = true;
4407
4474
  }
4408
4475
  }
@@ -4420,6 +4487,7 @@ let DockHostElement = class DockHostElement extends LitElement {
4420
4487
  this._loadGeneration++;
4421
4488
  this._model = normalize(cloneNode(layout.root));
4422
4489
  this._mergePoolIntoModel();
4490
+ this._liveStacks = snapshotNonEmptyStacks(this._model);
4423
4491
  this.requestUpdate();
4424
4492
  this._emitChange();
4425
4493
  }
@@ -4479,11 +4547,7 @@ let DockHostElement = class DockHostElement extends LitElement {
4479
4547
  } else this._appendPanelToFirstStack(el.panelId);
4480
4548
  normalize(this._model);
4481
4549
  this.requestUpdate();
4482
- this.dispatchEvent(new CustomEvent(`dock-panel-added`, {
4483
- detail: { panelId: el.panelId },
4484
- bubbles: true,
4485
- composed: true
4486
- }));
4550
+ this._emitAdded(el.panelId);
4487
4551
  this._emitChange();
4488
4552
  return true;
4489
4553
  }
@@ -4506,11 +4570,7 @@ let DockHostElement = class DockHostElement extends LitElement {
4506
4570
  this._scanPanels().find((p) => p.panelId === panelId)?.remove();
4507
4571
  normalize(this._model);
4508
4572
  this.requestUpdate();
4509
- this.dispatchEvent(new CustomEvent(`dock-panel-removed`, {
4510
- detail: { panelId },
4511
- bubbles: true,
4512
- composed: true
4513
- }));
4573
+ this._emitRemoved(panelId);
4514
4574
  this._emitChange();
4515
4575
  return true;
4516
4576
  }
@@ -4753,7 +4813,10 @@ let DockHostElement = class DockHostElement extends LitElement {
4753
4813
  * {@link endExternalDrop} when the drag leaves or ends.
4754
4814
  */
4755
4815
  previewExternalDrop(clientX, clientY, panelId = `__external__`, kind) {
4756
- this.setDragActive(true);
4816
+ this.setDragActive(true, {
4817
+ panelId,
4818
+ kind
4819
+ });
4757
4820
  const zone = this.computeDropZone(clientX, clientY, panelId, kind);
4758
4821
  this.setDropZone(zone);
4759
4822
  return zone === null ? null : zoneToTarget(zone);
@@ -4769,11 +4832,12 @@ let DockHostElement = class DockHostElement extends LitElement {
4769
4832
  * panel lands where a drop there would put it (respecting `accepts` /
4770
4833
  * `canAccept` and leaf content rules); without them, or when the point
4771
4834
  * 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.
4835
+ * Returns the created element, or null when a panel with that id is
4836
+ * already docked here or its kind is refused by `acceptsKinds`.
4774
4837
  */
4775
4838
  acceptExternalPanel(snapshot, at) {
4776
4839
  if (collectPanelIds(this._model).includes(snapshot.panelId)) return null;
4840
+ if (this.acceptsKinds !== null && !this.acceptsKinds.includes(normalizeKind(snapshot.kind))) return null;
4777
4841
  const el = document.createElement(`ixfx-dock-panel`);
4778
4842
  el.panelId = snapshot.panelId;
4779
4843
  if (snapshot.title !== void 0) el.title = snapshot.title;
@@ -4784,20 +4848,16 @@ let DockHostElement = class DockHostElement extends LitElement {
4784
4848
  if (`accepts` in snapshot && snapshot.accepts) el.setAttribute(`accepts`, snapshot.accepts);
4785
4849
  if (`contentHTML` in snapshot && snapshot.contentHTML) el.innerHTML = snapshot.contentHTML;
4786
4850
  this._returnAllToolbars();
4787
- this.appendChild(el);
4788
4851
  this._pool = [...this._pool, el];
4789
4852
  this._appendPanelToFirstStack(el.panelId);
4853
+ this.appendChild(el);
4790
4854
  normalize(this._model);
4791
4855
  this.endExternalDrop();
4792
4856
  const zone = at ? this.computeDropZone(at.clientX, at.clientY, el.panelId) : null;
4793
4857
  if (zone !== null) this._applyZone(el.panelId, zone);
4794
4858
  normalize(this._model);
4795
4859
  this.requestUpdate();
4796
- this.dispatchEvent(new CustomEvent(`dock-panel-added`, {
4797
- detail: { panelId: el.panelId },
4798
- bubbles: true,
4799
- composed: true
4800
- }));
4860
+ this._emitAdded(el.panelId);
4801
4861
  this._emitChange();
4802
4862
  return el;
4803
4863
  }
@@ -4816,6 +4876,7 @@ let DockHostElement = class DockHostElement extends LitElement {
4816
4876
  w: r.width,
4817
4877
  h: r.height
4818
4878
  });
4879
+ const splitsAllowed = tokenAllows(this.accepts, `horizontal`) || tokenAllows(this.accepts, `vertical`);
4819
4880
  for (const path of collectStackPaths(this._model)) {
4820
4881
  const leaf = this.shadowRoot?.querySelector(`[data-dock-path="${path.join(`-`)}"]`);
4821
4882
  if (!leaf) continue;
@@ -4823,7 +4884,7 @@ let DockHostElement = class DockHostElement extends LitElement {
4823
4884
  if (clientX < leafRect.left || clientX > leafRect.right || clientY < leafRect.top || clientY > leafRect.bottom) continue;
4824
4885
  const stack = findNode(this._model, path);
4825
4886
  if (stack === null || !isStack(stack)) continue;
4826
- const strip = leaf.querySelector(`ixfx-tab-list`);
4887
+ const strip = leaf.querySelector(`ixfx-tab-list`) ?? leaf.querySelector(`.ghost-strip`);
4827
4888
  if (strip !== null) {
4828
4889
  const stripRect = strip.getBoundingClientRect();
4829
4890
  if (clientX >= stripRect.left && clientX <= stripRect.right && clientY >= stripRect.top && clientY <= stripRect.bottom) {
@@ -4842,7 +4903,7 @@ let DockHostElement = class DockHostElement extends LitElement {
4842
4903
  }
4843
4904
  const relX = (clientX - leafRect.left) / Math.max(leafRect.width, 1);
4844
4905
  const relY = (clientY - leafRect.top) / Math.max(leafRect.height, 1);
4845
- if (relX >= BAND && relX <= .75 && relY >= BAND && relY <= .75) {
4906
+ if (!splitsAllowed || relX >= BAND && relX <= .75 && relY >= BAND && relY <= .75) {
4846
4907
  const zone = {
4847
4908
  host: this,
4848
4909
  operation: `tabs`,
@@ -4956,6 +5017,7 @@ let DockHostElement = class DockHostElement extends LitElement {
4956
5017
  return this._zoneAllowed(panelId, zone, resolvedKind) ? zone : null;
4957
5018
  }
4958
5019
  _zoneAllowed(panelId, zone, kind) {
5020
+ if (this.acceptsKinds !== null && !collectPanelIds(this._model).includes(panelId) && !this.acceptsKinds.includes(normalizeKind(kind))) return false;
4959
5021
  if (!tokenAllows(this.accepts, operationToToken(zone.operation))) return false;
4960
5022
  const stack = findNode(this._model, zone.targetPath);
4961
5023
  if (stack !== null && isStack(stack) && stack.panels.length === 1) {
@@ -4982,6 +5044,11 @@ let DockHostElement = class DockHostElement extends LitElement {
4982
5044
  }
4983
5045
  this._applyZone(panelId, zone, sourceHost === void 0 || sourceHost === this);
4984
5046
  this._commit();
5047
+ if (sourceHost !== void 0 && sourceHost !== this) this._emit(`dock-panel-moved`, {
5048
+ panelId,
5049
+ sourceHost,
5050
+ targetHost: this
5051
+ });
4985
5052
  }
4986
5053
  /**
4987
5054
  * Move `panelId` (already present somewhere in the model) to the position
@@ -5022,26 +5089,34 @@ let DockHostElement = class DockHostElement extends LitElement {
5022
5089
  }
5023
5090
  normalize(this._model);
5024
5091
  this._pool = this._pool.filter((p) => p !== el);
5025
- if (el !== void 0) target.adoptPanelElement(el);
5092
+ this._toolbarsOut.delete(panelId);
5093
+ this._emitRemoved(panelId, target);
5094
+ if (el !== void 0) target.adoptPanelElement(el, this);
5026
5095
  this.requestUpdate();
5096
+ this._emitChange();
5027
5097
  }
5028
- /** Adopt a panel element from another host (the one sanctioned reparent). */
5029
- adoptPanelElement(el) {
5030
- this.appendChild(el);
5098
+ /**
5099
+ * Adopt a panel element from another host (the one sanctioned reparent).
5100
+ * `sourceHost` is reported in `dock-panel-added`.
5101
+ */
5102
+ adoptPanelElement(el, sourceHost = null) {
5031
5103
  if (!this._pool.some((p) => p.panelId === el.panelId)) this._pool = [...this._pool, el];
5032
- this._appendPanelToFirstStack(el.panelId);
5104
+ if (!collectPanelIds(this._model).includes(el.panelId)) this._appendPanelToFirstStack(el.panelId);
5105
+ this.appendChild(el);
5033
5106
  normalize(this._model);
5034
- this.dispatchEvent(new CustomEvent(`dock-panel-added`, {
5035
- detail: { panelId: el.panelId },
5036
- bubbles: true,
5037
- composed: true
5038
- }));
5107
+ this._emitAdded(el.panelId, sourceHost);
5039
5108
  }
5040
- setDragActive(active) {
5109
+ /**
5110
+ * `drag` names the panel in flight when this host may receive it; it drives
5111
+ * the drop hint over a leaf whose tab strip is hidden.
5112
+ */
5113
+ setDragActive(active, drag) {
5114
+ const next = active && drag !== void 0 ? drag : null;
5041
5115
  if (this._dragActive !== active) {
5042
5116
  this._dragActive = active;
5043
5117
  this.requestUpdate();
5044
5118
  }
5119
+ if (this._dragPanel?.panelId !== next?.panelId || this._dragPanel?.kind !== next?.kind) this._dragPanel = next;
5045
5120
  }
5046
5121
  setDropZone(zone) {
5047
5122
  if (this._dropZone !== zone) {
@@ -5133,6 +5208,29 @@ let DockHostElement = class DockHostElement extends LitElement {
5133
5208
  }
5134
5209
  }
5135
5210
  }
5211
+ /**
5212
+ * Start a panel drag from an app-supplied handle — the way to move a panel
5213
+ * whose tab strip is hidden. Call it from the handle's `pointerdown`. The
5214
+ * drag begins once the pointer moves a few pixels (a plain click is left
5215
+ * alone) and then behaves exactly like a tab-item drag. Returns false when
5216
+ * the panel is not docked here or the press is not a primary-button press.
5217
+ */
5218
+ beginPanelDrag(panelId, event) {
5219
+ if (event.button !== 0 || !collectPanelIds(this._model).includes(panelId)) return false;
5220
+ this._armPanelDrag(panelId, event);
5221
+ return true;
5222
+ }
5223
+ _armPanelDrag(panelId, event) {
5224
+ this._tabDragPending = {
5225
+ panelId,
5226
+ pointerId: event.pointerId,
5227
+ startX: event.clientX,
5228
+ startY: event.clientY
5229
+ };
5230
+ window.addEventListener(`pointermove`, this._onTabDragMove);
5231
+ window.addEventListener(`pointerup`, this._onTabDragUp);
5232
+ window.addEventListener(`pointercancel`, this._onTabDragUp);
5233
+ }
5136
5234
  _teardownTabDragListeners() {
5137
5235
  window.removeEventListener(`pointermove`, this._onTabDragMove);
5138
5236
  window.removeEventListener(`pointerup`, this._onTabDragUp);
@@ -5214,13 +5312,44 @@ let DockHostElement = class DockHostElement extends LitElement {
5214
5312
  _returnAllToolbars() {
5215
5313
  for (const [panelId, nodes] of [...this._toolbarsOut]) this._returnToolbar(panelId, nodes);
5216
5314
  }
5217
- _emitChange() {
5218
- this.dispatchEvent(new CustomEvent(`dock-change`, {
5219
- detail: { layout: this.saveLayout() },
5315
+ /** Dispatch a bubbling, composed event; returns false when a cancelable one was cancelled. */
5316
+ _emit(type, detail, cancelable = false) {
5317
+ return this.dispatchEvent(new CustomEvent(type, {
5318
+ detail,
5220
5319
  bubbles: true,
5221
- composed: true
5320
+ composed: true,
5321
+ cancelable
5222
5322
  }));
5223
5323
  }
5324
+ _emitAdded(panelId, sourceHost = null) {
5325
+ this._emit(`dock-panel-added`, {
5326
+ panelId,
5327
+ sourceHost,
5328
+ targetHost: this
5329
+ });
5330
+ }
5331
+ _emitRemoved(panelId, targetHost = null) {
5332
+ this._emit(`dock-panel-removed`, {
5333
+ panelId,
5334
+ sourceHost: this,
5335
+ targetHost
5336
+ });
5337
+ }
5338
+ /** Announce `dock-stack-empty` for each stack that lost its last panel since the last change. */
5339
+ _announceEmptiedStacks() {
5340
+ const now = snapshotNonEmptyStacks(this._model);
5341
+ const emptied = findEmptiedStacks(this._liveStacks, now);
5342
+ this._liveStacks = now;
5343
+ for (const stack of emptied) this._emit(`dock-stack-empty`, {
5344
+ name: stack.name ?? null,
5345
+ hostEmpty: now.size === 0
5346
+ });
5347
+ }
5348
+ _emitChange() {
5349
+ const layout = this.saveLayout();
5350
+ this._announceEmptiedStacks();
5351
+ this._emit(`dock-change`, { layout });
5352
+ }
5224
5353
  render() {
5225
5354
  return html`
5226
5355
  <div class="root">
@@ -5291,6 +5420,12 @@ let DockHostElement = class DockHostElement extends LitElement {
5291
5420
  </div>
5292
5421
  `);
5293
5422
  const toolbarSlot = stack.name !== void 0 && this._toolbarSlots.has(`toolbar-${stack.name}`) ? html`<slot name="toolbar-${stack.name}" slot="toolbar"></slot>` : nothing;
5423
+ if (this._stripHidden(stack)) return leafAttrs(html`
5424
+ ${this._renderDropHint(stack, path)}
5425
+ <div class="leaf-body">
5426
+ <slot name="dock-panel-${stack.active}"></slot>
5427
+ </div>
5428
+ `);
5294
5429
  return leafAttrs(html`
5295
5430
  <ixfx-tab-list
5296
5431
  class="strip"
@@ -5300,6 +5435,7 @@ let DockHostElement = class DockHostElement extends LitElement {
5300
5435
  ?hide-labels=${stack.hideLabels === true}
5301
5436
  @change=${(e) => this._onTabChange(e, path)}
5302
5437
  @pointerdown=${this._onStripPointerDown}
5438
+ @contextmenu=${this._onStripContextMenu}
5303
5439
  >
5304
5440
  ${repeat(stack.panels, (id) => id, (id) => this._renderTabItem(stack, id))}
5305
5441
  ${toolbarSlot}
@@ -5308,6 +5444,34 @@ let DockHostElement = class DockHostElement extends LitElement {
5308
5444
  <slot name="dock-panel-${stack.active}"></slot>
5309
5445
  </div>
5310
5446
  `);
5447
+ }
5448
+ /**
5449
+ * While a drag that this leaf would accept is in flight, overlay a compact
5450
+ * strip stand-in on the hidden strip's slot: it shows where the dropped tab
5451
+ * will land (the overlay takes no layout space, so nothing jumps).
5452
+ */
5453
+ _renderDropHint(stack, path) {
5454
+ const drag = this._dragPanel;
5455
+ if (!this._dragActive || drag === null || stack.panels[0] === drag.panelId) return nothing;
5456
+ const probe = {
5457
+ host: this,
5458
+ operation: `tabs`,
5459
+ targetPath: path,
5460
+ side: `after`,
5461
+ rect: {
5462
+ x: 0,
5463
+ y: 0,
5464
+ w: 0,
5465
+ h: 0
5466
+ }
5467
+ };
5468
+ if (!this._zoneAllowed(drag.panelId, probe, drag.kind)) return nothing;
5469
+ const id = stack.panels[0];
5470
+ return html`
5471
+ <div class="ghost-strip" part="drop-hint">
5472
+ <span class="ghost-tab">${this._findPanelEl(id)?.title || id}</span>
5473
+ </div>
5474
+ `;
5311
5475
  }
5312
5476
  _renderTabItem(stack, panelId) {
5313
5477
  const el = this._findPanelEl(panelId);
@@ -5322,7 +5486,7 @@ let DockHostElement = class DockHostElement extends LitElement {
5322
5486
  `;
5323
5487
  }
5324
5488
  _stripCaretRect(strip, gapIndex, hostRect) {
5325
- const items = Array.from(strip.querySelectorAll(`ixfx-tab-list-item`));
5489
+ const items = Array.from(strip.querySelectorAll(STRIP_ITEMS));
5326
5490
  if (items.length === 0) return void 0;
5327
5491
  const index = Math.max(0, Math.min(gapIndex ?? items.length, items.length));
5328
5492
  const edge = index < items.length ? items[index].getBoundingClientRect().left : items[items.length - 1].getBoundingClientRect().right;
@@ -5369,6 +5533,7 @@ let DockHostElement = class DockHostElement extends LitElement {
5369
5533
  min-height: 0;
5370
5534
  box-sizing: border-box;
5371
5535
  overflow: hidden;
5536
+ position: relative;
5372
5537
  border: 1px solid var(--surface-4);
5373
5538
  border-radius: var(--radius-m);
5374
5539
  }
@@ -5406,6 +5571,32 @@ let DockHostElement = class DockHostElement extends LitElement {
5406
5571
  padding-right: var(--space-xs);
5407
5572
  }
5408
5573
 
5574
+ /* Drop hint over a hidden strip: overlaid, so it reserves no height. */
5575
+ .ghost-strip {
5576
+ position: absolute;
5577
+ inset: 0 0 auto 0;
5578
+ height: var(--dock-tab-height, 30px);
5579
+ z-index: 1;
5580
+ display: flex;
5581
+ align-items: center;
5582
+ box-sizing: border-box;
5583
+ padding: 0 var(--space-s);
5584
+ background: var(--surface-3);
5585
+ border-bottom: 1px solid var(--surface-4);
5586
+ color: var(--surface-3-text);
5587
+ font-size: var(--text-m);
5588
+ pointer-events: none;
5589
+ }
5590
+
5591
+ .ghost-tab {
5592
+ overflow: hidden;
5593
+ text-overflow: ellipsis;
5594
+ white-space: nowrap;
5595
+ text-decoration: underline;
5596
+ text-decoration-thickness: 2px;
5597
+ text-underline-offset: 4px;
5598
+ }
5599
+
5409
5600
  .leaf-body {
5410
5601
  flex: 1;
5411
5602
  min-height: 0;
@@ -5497,11 +5688,24 @@ __decorate([property({
5497
5688
  type: Boolean,
5498
5689
  attribute: `isolated`
5499
5690
  })], DockHostElement.prototype, "isolated", void 0);
5691
+ __decorate([property({
5692
+ type: Boolean,
5693
+ attribute: `hide-single-tab-strip`
5694
+ })], DockHostElement.prototype, "hideSingleTabStrip", void 0);
5695
+ __decorate([property({
5696
+ type: String,
5697
+ attribute: `family`
5698
+ })], DockHostElement.prototype, "family", void 0);
5699
+ __decorate([property({
5700
+ attribute: `accepts-kinds`,
5701
+ converter: { fromAttribute: (value) => value === null ? null : value.split(/\s+/).filter((k) => k.length > 0) }
5702
+ })], DockHostElement.prototype, "acceptsKinds", void 0);
5500
5703
  __decorate([property({ attribute: false })], DockHostElement.prototype, "canAccept", void 0);
5501
5704
  __decorate([state()], DockHostElement.prototype, "_model", void 0);
5502
5705
  __decorate([state()], DockHostElement.prototype, "_pool", void 0);
5503
5706
  __decorate([state()], DockHostElement.prototype, "_dropZone", void 0);
5504
5707
  __decorate([state()], DockHostElement.prototype, "_dragActive", void 0);
5708
+ __decorate([state()], DockHostElement.prototype, "_dragPanel", void 0);
5505
5709
  __decorate([state()], DockHostElement.prototype, "_junctions", void 0);
5506
5710
  DockHostElement = __decorate([safeCustomElement(`ixfx-dock-host`)], DockHostElement);
5507
5711
  /** `split-horizontal` = horizontal divider = panels stacked vertically. */
@@ -5551,13 +5755,18 @@ function normalizeKind(kind) {
5551
5755
  function parsePath(pathStr) {
5552
5756
  return pathStr.length === 0 ? [] : pathStr.split(`-`).filter((s) => s.length > 0).map(Number);
5553
5757
  }
5758
+ /** The tab item in an event's composed path, if it has a panel id. */
5759
+ function tabItemIn(path) {
5760
+ const item = path.find((node) => node instanceof HTMLElement && node.tagName === `IXFX-TAB-LIST-ITEM`);
5761
+ return item !== void 0 && item.id ? item : null;
5762
+ }
5554
5763
  /** Toolbar-slot light children of a dock panel. */
5555
5764
  function toolbarNodesOf(el) {
5556
5765
  return Array.from(el.children).filter((c) => c instanceof HTMLElement && c.getAttribute(`slot`) === `toolbar`);
5557
5766
  }
5558
5767
  /** Nearest strip gap to the pointer (reuses the tab-list midpoint rule). */
5559
5768
  function computeStripGapIndex(strip, clientX, _clientY) {
5560
- const items = Array.from(strip.querySelectorAll(`ixfx-tab-list-item`));
5769
+ const items = Array.from(strip.querySelectorAll(STRIP_ITEMS));
5561
5770
  if (items.length === 0) return 0;
5562
5771
  for (let i = 0; i < items.length; i++) {
5563
5772
  const r = items[i].getBoundingClientRect();
@@ -16057,4 +16266,4 @@ function init() {
16057
16266
  console.log(`Init`);
16058
16267
  }
16059
16268
  //#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 };
16269
+ 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, findEmptiedStacks, 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, snapshotNonEmptyStacks, startListItemOutAnimation, svgToDataUri, swapLeaves, tickledItemStyles, tickledStyles, timelineStyles, toGroupKey, toSnapshot, toggleInSet, toolbarGapIndex, translationFromOrigin, viewIsometry, walk, wrapRoot };
@@ -33,7 +33,7 @@ declare abstract class LabelledInputBase extends LitElement {
33
33
  value: number;
34
34
  }>) => void;
35
35
  protected _syncValue(v: number): void;
36
- protected _renderEditableNumber(): typeof nothing | import("lit").TemplateResult<1>;
36
+ protected _renderEditableNumber(): import("lit").TemplateResult<1> | typeof nothing;
37
37
  updated(changedProperties: Map<string, unknown>): void;
38
38
  }
39
39
  //#endregion
@@ -1,4 +1,4 @@
1
- import { t as LabelledInputBase } from "./labelled-input-base-DiTme1JO.js";
1
+ import { t as LabelledInputBase } from "./labelled-input-base-Dp_9KP0G.js";
2
2
  import { i as MarkerStyle, l as ValueMode } from "./radial-input-DU6t2hYO.js";
3
3
  import { CSSResultGroup, nothing } from "lit";
4
4
  //#region src/labelled-radial-input/labelled-radial-input.d.ts
@@ -19,7 +19,7 @@ declare class LabelledRadialInput extends LabelledInputBase {
19
19
  private _isWide;
20
20
  private _getEffectivePrecision;
21
21
  protected _handleResize(entries: ResizeObserverEntry[]): void;
22
- protected _renderEditableNumber(): typeof nothing | import("lit").TemplateResult<1>;
22
+ protected _renderEditableNumber(): import("lit").TemplateResult<1> | typeof nothing;
23
23
  render(): import("lit").TemplateResult<1>;
24
24
  private _getTooltipValue;
25
25
  static styles: CSSResultGroup;
@@ -1,2 +1,2 @@
1
- import { t as LabelledRangeInput } from "./index-CoqtMSd9.js";
1
+ import { t as LabelledRangeInput } from "./index-BUB5SICW.js";
2
2
  export { LabelledRangeInput };