@ixfx/components 0.11.2 → 0.11.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 (92) hide show
  1. package/bundle/index.d.ts +62 -4
  2. package/bundle/index.d.ts.map +1 -1
  3. package/bundle/index.js +224 -23
  4. package/bundle/index.js.map +1 -1
  5. package/dist/ac-text.d.ts +1 -1
  6. package/dist/{ac-token--_vCHXWw.d.ts → ac-token-TCLAZeVg.d.ts} +2 -2
  7. package/dist/{ac-token--_vCHXWw.d.ts.map → ac-token-TCLAZeVg.d.ts.map} +1 -1
  8. package/dist/ac-token.d.ts +1 -1
  9. package/dist/{button-BYuf72aR.d.ts → button-CTL45aBl.d.ts} +2 -2
  10. package/dist/{button-BYuf72aR.d.ts.map → button-CTL45aBl.d.ts.map} +1 -1
  11. package/dist/button.d.ts +1 -1
  12. package/dist/colour-picker.d.ts +1 -1
  13. package/dist/crumbs.d.ts +1 -1
  14. package/dist/crumbs.js +1 -1
  15. package/dist/{data-grid-3yIylIH-.d.ts → data-grid-CfiaBqTA.d.ts} +4 -4
  16. package/dist/{data-grid-3yIylIH-.d.ts.map → data-grid-CfiaBqTA.d.ts.map} +1 -1
  17. package/dist/data-grid.d.ts +1 -1
  18. package/dist/data-grid.js +1 -1
  19. package/dist/{detail-list-ccWFyhEc.d.ts → detail-list-DxQZkK-C.d.ts} +4 -4
  20. package/dist/{detail-list-ccWFyhEc.d.ts.map → detail-list-DxQZkK-C.d.ts.map} +1 -1
  21. package/dist/detail-list.d.ts +2 -2
  22. package/dist/{grid-list-BnOVgtLI.d.ts → grid-list-ChgYpUUq.d.ts} +2 -2
  23. package/dist/{grid-list-BnOVgtLI.d.ts.map → grid-list-ChgYpUUq.d.ts.map} +1 -1
  24. package/dist/grid-list.d.ts +1 -1
  25. package/dist/{grouped-item-lister-DETte0Dh.d.ts → grouped-item-lister-Bhyo-dkH.d.ts} +2 -2
  26. package/dist/{grouped-item-lister-DETte0Dh.d.ts.map → grouped-item-lister-Bhyo-dkH.d.ts.map} +1 -1
  27. package/dist/grouped-item-lister.d.ts +1 -1
  28. package/dist/{icon-CDGprSdE.d.ts → icon-DR_3rSyZ.d.ts} +2 -2
  29. package/dist/icon-DR_3rSyZ.d.ts.map +1 -0
  30. package/dist/icons.d.ts +2 -2
  31. package/dist/incr-search.d.ts +1 -1
  32. package/dist/{index-tq6f8007.d.ts → index-BOUaDIW-.d.ts} +2 -2
  33. package/dist/{index-tq6f8007.d.ts.map → index-BOUaDIW-.d.ts.map} +1 -1
  34. package/dist/{index-CoqtMSd9.d.ts → index-BUB5SICW.d.ts} +2 -2
  35. package/dist/{index-CoqtMSd9.d.ts.map → index-BUB5SICW.d.ts.map} +1 -1
  36. package/dist/{index-RImMNo0r.d.ts → index-CDllxjVG.d.ts} +3 -3
  37. package/dist/{index-RImMNo0r.d.ts.map → index-CDllxjVG.d.ts.map} +1 -1
  38. package/dist/{index-5-cwYpmx.d.ts → index-CHbuPyLL.d.ts} +2 -2
  39. package/dist/{index-5-cwYpmx.d.ts.map → index-CHbuPyLL.d.ts.map} +1 -1
  40. package/dist/{index-UvnoZUAo.d.ts → index-CJ5fshD3.d.ts} +2 -2
  41. package/dist/{index-UvnoZUAo.d.ts.map → index-CJ5fshD3.d.ts.map} +1 -1
  42. package/dist/{index-CYndvTWH.d.ts → index-garxxqgV.d.ts} +2 -2
  43. package/dist/{index-CYndvTWH.d.ts.map → index-garxxqgV.d.ts.map} +1 -1
  44. package/dist/index.d.ts +78 -22
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +180 -12
  47. package/dist/index.js.map +1 -1
  48. package/dist/{labelled-input-base-hoKGwyKT.js → labelled-input-base-BFa4xlYV.js} +11 -8
  49. package/dist/labelled-input-base-BFa4xlYV.js.map +1 -0
  50. package/dist/{labelled-input-base-DiTme1JO.d.ts → labelled-input-base-Dp_9KP0G.d.ts} +2 -2
  51. package/dist/{labelled-input-base-DiTme1JO.d.ts.map → labelled-input-base-Dp_9KP0G.d.ts.map} +1 -1
  52. package/dist/labelled-radial-input.d.ts +2 -2
  53. package/dist/labelled-radial-input.d.ts.map +1 -1
  54. package/dist/labelled-radial-input.js +1 -1
  55. package/dist/labelled-range-input.d.ts +1 -1
  56. package/dist/labelled-range-input.js +1 -1
  57. package/dist/{labelled-slider-input-CF2RtzgG.js → labelled-slider-input-FdCRi6st.js} +2 -2
  58. package/dist/{labelled-slider-input-CF2RtzgG.js.map → labelled-slider-input-FdCRi6st.js.map} +1 -1
  59. package/dist/labelled-slider-input.d.ts +1 -1
  60. package/dist/labelled-slider-input.js +1 -1
  61. package/dist/{menu-B2Qv3Oiz.js → menu-BHT6HRND.js} +2 -2
  62. package/dist/{menu-B2Qv3Oiz.js.map → menu-BHT6HRND.js.map} +1 -1
  63. package/dist/{menu-item-CZi9vy5O.d.ts → menu-item-DlxAb0Xr.d.ts} +4 -2
  64. package/dist/menu-item-DlxAb0Xr.d.ts.map +1 -0
  65. package/dist/{menu-item-Woc8jJc1.js → menu-item-JcpHCyF0.js} +30 -6
  66. package/dist/menu-item-JcpHCyF0.js.map +1 -0
  67. package/dist/menu.d.ts +2 -2
  68. package/dist/menu.js +2 -2
  69. package/dist/miller.d.ts +1 -1
  70. package/dist/panel.d.ts +1 -1
  71. package/dist/range-input.js +8 -2
  72. package/dist/range-input.js.map +1 -1
  73. package/dist/{split-layout-JK3xWVX2.d.ts → split-layout-C5SYbDrq.d.ts} +2 -2
  74. package/dist/{split-layout-JK3xWVX2.d.ts.map → split-layout-C5SYbDrq.d.ts.map} +1 -1
  75. package/dist/split-layout.d.ts +1 -1
  76. package/dist/{tab-list-pqfKaVAE.d.ts → tab-list-v8mKX7Fu.d.ts} +2 -2
  77. package/dist/{tab-list-pqfKaVAE.d.ts.map → tab-list-v8mKX7Fu.d.ts.map} +1 -1
  78. package/dist/tabs.d.ts +1 -1
  79. package/dist/{titlebar-Tqu-VvMU.d.ts → titlebar-B5zSTZnF.d.ts} +2 -2
  80. package/dist/{titlebar-Tqu-VvMU.d.ts.map → titlebar-B5zSTZnF.d.ts.map} +1 -1
  81. package/dist/titlebar.d.ts +1 -1
  82. package/dist/tree.d.ts +1 -1
  83. package/dist/{vertical-list-9dJ1R1hU.d.ts → vertical-list-R25WqAVO.d.ts} +2 -2
  84. package/dist/{vertical-list-9dJ1R1hU.d.ts.map → vertical-list-R25WqAVO.d.ts.map} +1 -1
  85. package/dist/vertical-list.d.ts +1 -1
  86. package/docs-user/index.json +2 -2
  87. package/docs-user/multicol-list.md +1 -0
  88. package/package.json +1 -1
  89. package/dist/icon-CDGprSdE.d.ts.map +0 -1
  90. package/dist/labelled-input-base-hoKGwyKT.js.map +0 -1
  91. package/dist/menu-item-CZi9vy5O.d.ts.map +0 -1
  92. package/dist/menu-item-Woc8jJc1.js.map +0 -1
package/dist/index.js CHANGED
@@ -20,7 +20,7 @@ import { n as captionForEntry, r as createDefaultListDragPreview, t as ListNativ
20
20
  import { n as isMultiMode, r as ListDragSelectController, t as ListSelectionController } from "./list-selection-controller-SA4piSBi.js";
21
21
  import { a as prefersReducedMotion, i as listItemFadeKeyframes, n as animateListItemIn, o as startListItemOutAnimation, r as animateListItemOut, t as LIST_ITEM_MOTION_MS } from "./list-item-animation-BUoEKi5s.js";
22
22
  import "./interaction-BskmlA9t.js";
23
- import "./menu-item-Woc8jJc1.js";
23
+ import "./menu-item-JcpHCyF0.js";
24
24
  import { Checkbox } from "./checkbox.js";
25
25
  import { n as ColourPicker, t as ColourPickerPopup } from "./colour-picker-WDrPuqoO.js";
26
26
  import { LabelledRangeInput } from "./labelled-range-input.js";
@@ -31,7 +31,7 @@ import { NarrowedTextElement } from "./narrowed-text.js";
31
31
  import { CrumbNavigationElement } from "./crumbs.js";
32
32
  import { DataDisplayComponent } from "./data-display.js";
33
33
  import { t as createDragGhost } from "./drag-ghost-DtSDvjri.js";
34
- import { a as menuFromTreeToElements, t as menu_exports } from "./menu-B2Qv3Oiz.js";
34
+ import { a as menuFromTreeToElements, t as menu_exports } from "./menu-BHT6HRND.js";
35
35
  import { t as PanTextElement } from "./pan-text-CqtvjPyK.js";
36
36
  import { DataGridElement } from "./data-grid.js";
37
37
  import { DetailListElement } from "./detail-list.js";
@@ -40,7 +40,7 @@ import { TabListElement } from "./tabs.js";
40
40
  import { EditableLabel } from "./editable-label.js";
41
41
  import { t as resolveAxisStep } from "./keyboard-B5xD7Fz-.js";
42
42
  import { t as WheelNudgeMixin } from "./wheel-nudge-D5rmht3v.js";
43
- import { n as EditableNumber, t as LabelledSliderInput } from "./labelled-slider-input-CF2RtzgG.js";
43
+ import { n as EditableNumber, t as LabelledSliderInput } from "./labelled-slider-input-FdCRi6st.js";
44
44
  import { t as FormElement } from "./form-CsXJX15p.js";
45
45
  import { t as GridListElement } from "./grid-list-k89JpiNy.js";
46
46
  import { PanelElement } from "./panel.js";
@@ -1506,7 +1506,10 @@ let CrumbPathElement = class CrumbPathElement extends LitElement {
1506
1506
  this._editingCancelled = false;
1507
1507
  this._editStartIndex = null;
1508
1508
  this._openCumPath = null;
1509
+ this._dragCumPath = null;
1510
+ this._dropCumPath = null;
1509
1511
  this.#uid = Math.random().toString(36).slice(2, 8);
1512
+ this.#clickSuppressUntil = 0;
1510
1513
  this.#onPopoverToggle = (e) => {
1511
1514
  if (e.newState === `closed` && this._openIdx !== null) {
1512
1515
  this._openIdx = null;
@@ -1560,6 +1563,8 @@ let CrumbPathElement = class CrumbPathElement extends LitElement {
1560
1563
  #pendingController;
1561
1564
  #pendingIndex;
1562
1565
  #uid;
1566
+ /** Clicks within this window after a drag are ignored (post-drag click-through guard). */
1567
+ #clickSuppressUntil;
1563
1568
  #anchorName(cumPath) {
1564
1569
  return `--cp-${this.#uid}-${cumPath.replaceAll(this.separator, `-`).replaceAll(` `, `-`).replace(INVALID_ANCHOR_CHARS_RE, `-`)}`;
1565
1570
  }
@@ -1621,6 +1626,23 @@ let CrumbPathElement = class CrumbPathElement extends LitElement {
1621
1626
  if (isRoot) return rootSegments.slice(0, index + 1).join(this.separator);
1622
1627
  return [...rootSegments, ...segments.slice(0, index + 1)].join(this.separator);
1623
1628
  }
1629
+ #resolveFullPathSegments(index, isRoot) {
1630
+ const rootSegments = this.#getRootSegments();
1631
+ if (isRoot) return rootSegments.slice(0, index + 1);
1632
+ return [...rootSegments, ...this.#getSegments().slice(0, index + 1)];
1633
+ }
1634
+ #segmentDragPayloads(fullPathSegments) {
1635
+ try {
1636
+ const result = this.segmentDragLookup?.(fullPathSegments, fullPathSegments.length - 1);
1637
+ if (result === void 0 || result === null) return [];
1638
+ return Array.isArray(result) ? [...result] : [result];
1639
+ } catch {
1640
+ return [];
1641
+ }
1642
+ }
1643
+ #clicksSuppressed() {
1644
+ return Date.now() < this.#clickSuppressUntil || this._dragCumPath !== null;
1645
+ }
1624
1646
  #resolveSegmentIcon(fullPathSegments, index) {
1625
1647
  const direct = this.segmentIconLookup?.(fullPathSegments, index);
1626
1648
  if (typeof direct === `string` && direct.length > 0) return direct;
@@ -1687,7 +1709,87 @@ let CrumbPathElement = class CrumbPathElement extends LitElement {
1687
1709
  }
1688
1710
  this.requestUpdate();
1689
1711
  }
1712
+ #onLabelDragStart(fullPathSegments, cumPath, event) {
1713
+ this.#closeDropdown();
1714
+ const index = fullPathSegments.length - 1;
1715
+ const dt = event.dataTransfer;
1716
+ const detail = {
1717
+ index,
1718
+ label: fullPathSegments[index] ?? ``,
1719
+ pathSegments: fullPathSegments,
1720
+ parentPath: fullPathSegments.slice(0, -1).join(this.separator),
1721
+ fullPath: fullPathSegments.join(this.separator),
1722
+ dataTransfer: dt
1723
+ };
1724
+ const evt = new CustomEvent(`crumb-drag-start`, {
1725
+ detail,
1726
+ bubbles: true,
1727
+ composed: true,
1728
+ cancelable: true
1729
+ });
1730
+ if (!this.dispatchEvent(evt)) {
1731
+ event.preventDefault();
1732
+ return;
1733
+ }
1734
+ this._dragCumPath = cumPath;
1735
+ this.toggleAttribute(`data-native-dragging`, true);
1736
+ if (!dt) return;
1737
+ try {
1738
+ if (dt.effectAllowed === `none` || dt.effectAllowed === `uninitialized`) dt.effectAllowed = `copyMove`;
1739
+ } catch {}
1740
+ try {
1741
+ for (const payload of this.#segmentDragPayloads(fullPathSegments)) dt.setData(payload.type, payload.data);
1742
+ if (!dt.types.includes(`text/plain`)) dt.setData(`text/plain`, detail.fullPath);
1743
+ } catch {}
1744
+ }
1745
+ #onLabelDragEnd() {
1746
+ this._dragCumPath = null;
1747
+ this._dropCumPath = null;
1748
+ this.toggleAttribute(`data-native-dragging`, false);
1749
+ this.#clickSuppressUntil = Date.now() + 150;
1750
+ }
1751
+ #onSegDragOver(cumPath, event) {
1752
+ if (!this.parseExternalDrop) return;
1753
+ if (!event.dataTransfer) return;
1754
+ event.preventDefault();
1755
+ if (this._dropCumPath !== cumPath) this._dropCumPath = cumPath;
1756
+ }
1757
+ #onSegDragLeave(cumPath, _event) {
1758
+ if (!this.parseExternalDrop) return;
1759
+ if (this._dropCumPath === cumPath) this._dropCumPath = null;
1760
+ }
1761
+ #onSegDrop(fullPathSegments, event) {
1762
+ if (!this.parseExternalDrop) return;
1763
+ event.preventDefault();
1764
+ event.stopPropagation();
1765
+ this._dropCumPath = null;
1766
+ const dt = event.dataTransfer;
1767
+ if (!dt) return;
1768
+ let data;
1769
+ try {
1770
+ data = this.parseExternalDrop(dt);
1771
+ } catch (err) {
1772
+ console.error(`parseExternalDrop failed:`, err);
1773
+ return;
1774
+ }
1775
+ if (data === void 0) return;
1776
+ const index = fullPathSegments.length - 1;
1777
+ this.dispatchEvent(new CustomEvent(`crumb-drop`, {
1778
+ detail: {
1779
+ index,
1780
+ label: fullPathSegments[index] ?? ``,
1781
+ pathSegments: fullPathSegments,
1782
+ parentPath: fullPathSegments.slice(0, -1).join(this.separator),
1783
+ fullPath: fullPathSegments.join(this.separator),
1784
+ data,
1785
+ dataTransfer: dt
1786
+ },
1787
+ bubbles: true,
1788
+ composed: true
1789
+ }));
1790
+ }
1690
1791
  #onLabelClick(index, event) {
1792
+ if (this.#clicksSuppressed()) return;
1691
1793
  event.preventDefault();
1692
1794
  event.stopPropagation();
1693
1795
  this.#closeDropdown();
@@ -1769,16 +1871,31 @@ let CrumbPathElement = class CrumbPathElement extends LitElement {
1769
1871
  #renderSegment(label, index, isLast) {
1770
1872
  const isOpen = this._openIdx === index;
1771
1873
  const cumPath = this.#getCumulativePath(index, false);
1772
- const fullPathSegments = [...this.#getRootSegments(), ...this.#getSegments().slice(0, index + 1)];
1874
+ const fullPathSegments = this.#resolveFullPathSegments(index, false);
1773
1875
  const icon = this.#resolveSegmentIcon(fullPathSegments, fullPathSegments.length - 1);
1876
+ const draggable = this.#segmentDragPayloads(fullPathSegments).length > 0;
1877
+ const dragging = this._dragCumPath === cumPath;
1878
+ const dropInto = this._dropCumPath === cumPath;
1774
1879
  return html`
1775
- <div class="seg" data-cumulative=${cumPath} @click=${(e) => this.#onSegmentClick(index, e)}>
1776
- <label title=${label} @click=${(e) => this.#onLabelClick(index, e)}>
1880
+ <div class="seg ${dragging ? `dragging` : ``} ${dropInto ? `drop-into` : ``}"
1881
+ part=${dropInto ? `segment drop-target` : `segment`}
1882
+ data-cumulative=${cumPath}
1883
+ @click=${(e) => this.#onSegmentClick(index, e)}
1884
+ @dragover=${(e) => this.#onSegDragOver(cumPath, e)}
1885
+ @dragleave=${(e) => this.#onSegDragLeave(cumPath, e)}
1886
+ @drop=${(e) => this.#onSegDrop(fullPathSegments, e)}>
1887
+ <label title=${label}
1888
+ part="label"
1889
+ ?draggable=${draggable}
1890
+ @click=${(e) => this.#onLabelClick(index, e)}
1891
+ @dragstart=${(e) => this.#onLabelDragStart(fullPathSegments, cumPath, e)}
1892
+ @dragend=${() => this.#onLabelDragEnd()}>
1777
1893
  ${icon ? html`<ixfx-icon class="crumb-icon segment-icon" name=${icon}></ixfx-icon>` : nothing}
1778
1894
  ${label}
1779
1895
  </label>
1780
1896
  ${(!isLast || this.siblingLookup) && this._leafSegmentIndex !== index ? html`
1781
1897
  <div class="caret ${isOpen ? `open` : ``} ${this._confirmedLeafIndices.has(cumPath) ? `disabled` : ``}"
1898
+ part="caret"
1782
1899
  style="anchor-name: ${this.#anchorName(cumPath)}"
1783
1900
  data-cumulative=${cumPath}
1784
1901
  @click=${(e) => this.#onCaretClick(index, e)}>
@@ -1789,17 +1906,31 @@ let CrumbPathElement = class CrumbPathElement extends LitElement {
1789
1906
  `;
1790
1907
  }
1791
1908
  #renderRootSegment(label, index) {
1792
- const rootSegments = this.#getRootSegments();
1793
- const isLast = index === rootSegments.length - 1;
1909
+ const isLast = index === this.#getRootSegments().length - 1;
1794
1910
  const isOpen = this._openIdx === index;
1795
1911
  const cumPath = this.#getCumulativePath(index, true);
1796
- const fullPathSegments = rootSegments.slice(0, index + 1);
1912
+ const fullPathSegments = this.#resolveFullPathSegments(index, true);
1797
1913
  const icon = this.#resolveSegmentIcon(fullPathSegments, index);
1914
+ const draggable = this.#segmentDragPayloads(fullPathSegments).length > 0;
1915
+ const dragging = this._dragCumPath === cumPath;
1916
+ const dropInto = this._dropCumPath === cumPath;
1798
1917
  return html`
1799
- <div class="seg seg-root" data-cumulative=${cumPath} @click=${(e) => this.#onRootSegmentClick(index, e)}>
1800
- <label title=${label}>${icon ? html`<ixfx-icon class="crumb-icon segment-icon" name=${icon}></ixfx-icon>` : nothing}${label}</label>
1918
+ <div class="seg seg-root ${dragging ? `dragging` : ``} ${dropInto ? `drop-into` : ``}"
1919
+ part=${dropInto ? `segment drop-target` : `segment`}
1920
+ data-cumulative=${cumPath}
1921
+ @click=${(e) => this.#onRootSegmentClick(index, e)}
1922
+ @dragover=${(e) => this.#onSegDragOver(cumPath, e)}
1923
+ @dragleave=${(e) => this.#onSegDragLeave(cumPath, e)}
1924
+ @drop=${(e) => this.#onSegDrop(fullPathSegments, e)}>
1925
+ <label title=${label}
1926
+ part="label"
1927
+ ?draggable=${draggable}
1928
+ @click=${(e) => this.#onLabelClick(index, e)}
1929
+ @dragstart=${(e) => this.#onLabelDragStart(fullPathSegments, cumPath, e)}
1930
+ @dragend=${() => this.#onLabelDragEnd()}>${icon ? html`<ixfx-icon class="crumb-icon segment-icon" name=${icon}></ixfx-icon>` : nothing}${label}</label>
1801
1931
  ${isLast && this.siblingLookup ? html`
1802
1932
  <div class="caret ${isOpen ? `open` : ``} ${this._confirmedLeafIndices.has(cumPath) ? `disabled` : ``}"
1933
+ part="caret"
1803
1934
  style="anchor-name: ${this.#anchorName(cumPath)}"
1804
1935
  data-cumulative=${cumPath}
1805
1936
  @click=${(e) => this.#onCaretClick(index, e)}>
@@ -1810,12 +1941,14 @@ let CrumbPathElement = class CrumbPathElement extends LitElement {
1810
1941
  `;
1811
1942
  }
1812
1943
  #onRootSegmentClick(index, event) {
1944
+ if (this.#clicksSuppressed()) return;
1813
1945
  event.preventDefault();
1814
1946
  event.stopPropagation();
1815
1947
  const newPath = this.#getRootSegments().slice(0, index + 1).join(this.separator);
1816
1948
  this.setPath(newPath);
1817
1949
  }
1818
1950
  #onSegmentClick(index, event) {
1951
+ if (this.#clicksSuppressed()) return;
1819
1952
  event.preventDefault();
1820
1953
  event.stopPropagation();
1821
1954
  this.#closeDropdown();
@@ -1823,6 +1956,7 @@ let CrumbPathElement = class CrumbPathElement extends LitElement {
1823
1956
  this._editStartIndex = index;
1824
1957
  }
1825
1958
  #onTrailingClick() {
1959
+ if (this.#clicksSuppressed()) return;
1826
1960
  this.#closeDropdown();
1827
1961
  this._editing = true;
1828
1962
  this._editStartIndex = null;
@@ -2044,6 +2178,21 @@ let CrumbPathElement = class CrumbPathElement extends LitElement {
2044
2178
  cursor: not-allowed;
2045
2179
  }
2046
2180
 
2181
+ /* Drag and drop styles */
2182
+ label[draggable] {
2183
+ cursor: grab;
2184
+ }
2185
+
2186
+ .seg.dragging {
2187
+ opacity: 0.4;
2188
+ }
2189
+
2190
+ .seg.drop-into {
2191
+ outline: var(--crumb-drop-into-outline, 2px solid var(--accent));
2192
+ outline-offset: -2px;
2193
+ background: var(--crumb-drop-into-bg, color-mix(in srgb, var(--accent) 14%, transparent));
2194
+ }
2195
+
2047
2196
  .crumb-icon {
2048
2197
  width: 1em;
2049
2198
  height: 1em;
@@ -2126,6 +2275,8 @@ __decorate([property({
2126
2275
  })], CrumbPathElement.prototype, "pathRoot", void 0);
2127
2276
  __decorate([property({ type: Object })], CrumbPathElement.prototype, "siblingLookup", void 0);
2128
2277
  __decorate([property({ type: Object })], CrumbPathElement.prototype, "segmentIconLookup", void 0);
2278
+ __decorate([property({ type: Object })], CrumbPathElement.prototype, "segmentDragLookup", void 0);
2279
+ __decorate([property({ type: Object })], CrumbPathElement.prototype, "parseExternalDrop", void 0);
2129
2280
  __decorate([state()], CrumbPathElement.prototype, "_openIdx", void 0);
2130
2281
  __decorate([state()], CrumbPathElement.prototype, "_editing", void 0);
2131
2282
  __decorate([state()], CrumbPathElement.prototype, "_cachedSiblings", void 0);
@@ -2135,6 +2286,8 @@ __decorate([state()], CrumbPathElement.prototype, "_dropdownActiveIndex", void 0
2135
2286
  __decorate([state()], CrumbPathElement.prototype, "_editingCancelled", void 0);
2136
2287
  __decorate([state()], CrumbPathElement.prototype, "_editStartIndex", void 0);
2137
2288
  __decorate([state()], CrumbPathElement.prototype, "_openCumPath", void 0);
2289
+ __decorate([state()], CrumbPathElement.prototype, "_dragCumPath", void 0);
2290
+ __decorate([state()], CrumbPathElement.prototype, "_dropCumPath", void 0);
2138
2291
  CrumbPathElement = __decorate([safeCustomElement(`ixfx-crumb-path`)], CrumbPathElement);
2139
2292
  //#endregion
2140
2293
  //#region src/data-table/data-table.ts
@@ -8169,6 +8322,7 @@ let MulticolListElement = class MulticolListElement extends LitElement {
8169
8322
  --multicol-list-border: var(--border);
8170
8323
  --multicol-list-min-column-width: ${MIN_COLUMN_WIDTH}px;
8171
8324
  --multicol-list-max-column-width: ${MAX_COLUMN_WIDTH}px;
8325
+ --multicol-list-header-font-size: unset;
8172
8326
 
8173
8327
  display: block;
8174
8328
  overflow: hidden;
@@ -8234,7 +8388,7 @@ let MulticolListElement = class MulticolListElement extends LitElement {
8234
8388
  text-overflow: ellipsis;
8235
8389
  white-space: nowrap;
8236
8390
  padding: 0 var(--space-s);
8237
- font-size: var(--text-m);
8391
+ font-size: var(--multicol-list-header-font-size);
8238
8392
  font-weight: 600;
8239
8393
  background: transparent;
8240
8394
  border: none;
@@ -10267,6 +10421,7 @@ let ShapefillValueElement = class ShapefillValueElement extends WheelNudgeMixin(
10267
10421
  this.#dragging = false;
10268
10422
  this.#dragStartY = 0;
10269
10423
  this.#valueAtDragStart = 0;
10424
+ this.#lastPointerY = 0;
10270
10425
  this.#onPointerDown = (event) => {
10271
10426
  if (this.disabled) return;
10272
10427
  event.preventDefault();
@@ -10274,7 +10429,9 @@ let ShapefillValueElement = class ShapefillValueElement extends WheelNudgeMixin(
10274
10429
  svgEl?.focus();
10275
10430
  this.#dragging = true;
10276
10431
  this.#dragStartY = event.clientY;
10432
+ this.#lastPointerY = event.clientY;
10277
10433
  this.#valueAtDragStart = this.value;
10434
+ this.#lastSetValue = this.value;
10278
10435
  this.toggleAttribute(`dragging`, true);
10279
10436
  if (svgEl) svgEl.setPointerCapture(event.pointerId);
10280
10437
  window.addEventListener(`pointermove`, this.#onPointerMove);
@@ -10284,10 +10441,16 @@ let ShapefillValueElement = class ShapefillValueElement extends WheelNudgeMixin(
10284
10441
  this.#onPointerMove = (event) => {
10285
10442
  if (!this.#dragging) return;
10286
10443
  event.preventDefault();
10444
+ if (this.value !== this.#lastSetValue) {
10445
+ this.#valueAtDragStart = this.value;
10446
+ this.#dragStartY = this.#lastPointerY;
10447
+ this.#lastSetValue = this.value;
10448
+ }
10287
10449
  const effectiveSensitivity = this.clientHeight * 2 * (event.shiftKey ? 10 : 1);
10288
10450
  const deltaValue = (this.#dragStartY - event.clientY) / effectiveSensitivity * (this.max - this.min);
10289
10451
  const relativeValue = scale(this.#valueAtDragStart + deltaValue, this.min, this.max, 0, 1);
10290
10452
  this.#setValueFromRelative(clampValue(relativeValue, 0, 1), true);
10453
+ this.#lastPointerY = event.clientY;
10291
10454
  };
10292
10455
  this.#onPointerUp = () => {
10293
10456
  this.#dragging = false;
@@ -10330,6 +10493,10 @@ let ShapefillValueElement = class ShapefillValueElement extends WheelNudgeMixin(
10330
10493
  #dragging;
10331
10494
  #dragStartY;
10332
10495
  #valueAtDragStart;
10496
+ /** Client Y of the last processed pointer event, for external-write re-baselining. */
10497
+ #lastPointerY;
10498
+ /** Value at the drag's last write — detects external `value` writes mid-drag. */
10499
+ #lastSetValue;
10333
10500
  #changeDebounceTimer;
10334
10501
  #getRelativeValue() {
10335
10502
  return scale(this.value, this.min, this.max, 0, 1);
@@ -10347,6 +10514,7 @@ let ShapefillValueElement = class ShapefillValueElement extends WheelNudgeMixin(
10347
10514
  if (clampedValue === this.value) return;
10348
10515
  const previousValue = this.value;
10349
10516
  this.value = clampedValue;
10517
+ this.#lastSetValue = clampedValue;
10350
10518
  if (this.hasAttribute(`data-tooltip-live`)) {
10351
10519
  const percentage = Math.round(this.#getRelativeValue() * 100);
10352
10520
  this.setAttribute(`data-tooltip`, `${percentage}%`);