@ixfx/components 0.13.2 → 0.13.3

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 (76) hide show
  1. package/bundle/index.d.ts +97 -14
  2. package/bundle/index.d.ts.map +1 -1
  3. package/bundle/index.js +2183 -636
  4. package/bundle/index.js.map +1 -1
  5. package/dist/ac-token.js +1 -1
  6. package/dist/{data-grid-Ck1Qx2H1.d.ts → data-grid-DHWJN66w.d.ts} +7 -5
  7. package/dist/{data-grid-Ck1Qx2H1.d.ts.map → data-grid-DHWJN66w.d.ts.map} +1 -1
  8. package/dist/data-grid.d.ts +1 -1
  9. package/dist/data-grid.js +210 -120
  10. package/dist/data-grid.js.map +1 -1
  11. package/dist/detail-list-C96B5Txz.js +2001 -0
  12. package/dist/detail-list-C96B5Txz.js.map +1 -0
  13. package/dist/{detail-list-C1xzr1z7.d.ts → detail-list-dX7jLO6b.d.ts} +12 -3
  14. package/dist/{detail-list-C1xzr1z7.d.ts.map → detail-list-dX7jLO6b.d.ts.map} +1 -1
  15. package/dist/detail-list.d.ts +2 -2
  16. package/dist/detail-list.js +1 -1680
  17. package/dist/{flat-list-Ohxqsy0g.d.ts → flat-list-Y98IqH00.d.ts} +2 -2
  18. package/dist/{flat-list-Ohxqsy0g.d.ts.map → flat-list-Y98IqH00.d.ts.map} +1 -1
  19. package/dist/flat-list.d.ts +1 -1
  20. package/dist/flat-list.js +5 -1
  21. package/dist/flat-list.js.map +1 -1
  22. package/dist/{grid-list-pefLORIr.d.ts → grid-list-CoT9e1jB.d.ts} +9 -2
  23. package/dist/{grid-list-pefLORIr.d.ts.map → grid-list-CoT9e1jB.d.ts.map} +1 -1
  24. package/dist/{grid-list-DjIl910A.js → grid-list-DeqAd9-h.js} +189 -40
  25. package/dist/grid-list-DeqAd9-h.js.map +1 -0
  26. package/dist/grid-list.d.ts +1 -1
  27. package/dist/grid-list.js +1 -1
  28. package/dist/{incr-search-D91M4Ozq.js → incr-search-JIhwB49y.js} +27 -5
  29. package/dist/incr-search-JIhwB49y.js.map +1 -0
  30. package/dist/incr-search.d.ts +1 -1
  31. package/dist/incr-search.js +1 -1
  32. package/dist/index-CnQPCywE.d.ts +325 -0
  33. package/dist/index-CnQPCywE.d.ts.map +1 -0
  34. package/dist/{index-CxZ61DO1.d.ts → index-Dlah7Zfi.d.ts} +8 -1
  35. package/dist/{index-CxZ61DO1.d.ts.map → index-Dlah7Zfi.d.ts.map} +1 -1
  36. package/dist/index.d.ts +9 -9
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +46 -25
  39. package/dist/index.js.map +1 -1
  40. package/dist/miller.d.ts +1 -1
  41. package/dist/miller.d.ts.map +1 -1
  42. package/dist/miller.js +146 -100
  43. package/dist/miller.js.map +1 -1
  44. package/dist/narrowed-text.js +1 -1
  45. package/dist/split-layout-C5SYbDrq.d.ts.map +1 -1
  46. package/dist/{split-layout-CXotkdbx.js → split-layout-Deoxy47d.js} +6 -1
  47. package/dist/{split-layout-CXotkdbx.js.map → split-layout-Deoxy47d.js.map} +1 -1
  48. package/dist/split-layout.js +1 -1
  49. package/dist/{tab-list-v8mKX7Fu.d.ts → tab-list-D_dmImJM.d.ts} +2 -3
  50. package/dist/tab-list-D_dmImJM.d.ts.map +1 -0
  51. package/dist/tabs.d.ts +1 -1
  52. package/dist/tabs.js +22 -0
  53. package/dist/tabs.js.map +1 -1
  54. package/dist/{tree-DGveys4K.js → tree-DD8OaqsK.js} +1010 -230
  55. package/dist/tree-DD8OaqsK.js.map +1 -0
  56. package/dist/tree.d.ts +4 -267
  57. package/dist/tree.js +1 -1
  58. package/dist/{vertical-list-CqBc-t8w.d.ts → vertical-list-lj_19DCx.d.ts} +3 -2
  59. package/dist/{vertical-list-CqBc-t8w.d.ts.map → vertical-list-lj_19DCx.d.ts.map} +1 -1
  60. package/dist/vertical-list.d.ts +1 -1
  61. package/dist/vertical-list.js +113 -24
  62. package/dist/vertical-list.js.map +1 -1
  63. package/docs-user/data-grid.md +74 -4
  64. package/docs-user/detail-list.md +65 -0
  65. package/docs-user/grid-list.md +81 -4
  66. package/docs-user/index.json +1 -1
  67. package/docs-user/miller.md +59 -3
  68. package/docs-user/tree.md +63 -2
  69. package/docs-user/vertical-list.md +9 -1
  70. package/package.json +6 -1
  71. package/dist/detail-list.js.map +0 -1
  72. package/dist/grid-list-DjIl910A.js.map +0 -1
  73. package/dist/incr-search-D91M4Ozq.js.map +0 -1
  74. package/dist/tab-list-v8mKX7Fu.d.ts.map +0 -1
  75. package/dist/tree-DGveys4K.js.map +0 -1
  76. package/dist/tree.d.ts.map +0 -1
package/dist/miller.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { D as TreeTickleDetail, E as TreeSelectEvent, O as TreeTickleEvent, T as TreeSelectDetail, a as TreeComponent, b as TreeItemClickDetail, i as TreeCollapseEvent, k as TreeDataModel, n as TreeActivateEvent, o as TreeComponentEventMap, r as TreeCollapseDetail, t as TreeActivateDetail, v as TreeExpandDetail, w as TreeSearchHost, x as TreeItemClickEvent, y as TreeExpandEvent } from "./tree-component-Cj8V3uar.js";
2
2
  import { a as TreeItem, n as TreeExclusivity, o as TreeNode, r as TreeFilterPredicate, s as TreeSelectionFilter, t as LoadChildrenCallback } from "./types-DQ7KOUIj.js";
3
- import { S as ListSearchController } from "./index-CxZ61DO1.js";
3
+ import { S as ListSearchController } from "./index-Dlah7Zfi.js";
4
4
  import { n as TickledController } from "./tickled-controller-DodxD3eQ.js";
5
5
  import { LitElement, PropertyValues, TemplateResult, nothing } from "lit";
6
6
  import { CommandRegistry } from "@clinth/ui-commands";
@@ -1 +1 @@
1
- {"version":3,"file":"miller.d.ts","names":[],"sources":["../src/miller/types.ts","../src/miller/miller-base.ts","../src/miller/miller-list.ts","../src/miller/miller-tree-controller.ts"],"mappings":"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"}
1
+ {"version":3,"file":"miller.d.ts","names":[],"sources":["../src/miller/types.ts","../src/miller/miller-base.ts","../src/miller/miller-list.ts","../src/miller/miller-tree-controller.ts"],"mappings":"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"}
package/dist/miller.js CHANGED
@@ -2,7 +2,7 @@ import { t as TickledController } from "./tickled-controller-D-HZymaZ.js";
2
2
  import { n as tickledStyles, t as tickledItemStyles } from "./tickled-styles-BrAHEj1q.js";
3
3
  import { t as themeFallbacks } from "./fallbacks-DQ_5OsmR.js";
4
4
  import { n as safeCustomElement, t as __decorate } from "./decorate-VRK8rslU.js";
5
- import { i as ListSearchController, n as listSearchStyles, o as registerListSearchCommands, r as LIST_SEARCH_MODES, t as createTreeListSearchAdapter } from "./incr-search-D91M4Ozq.js";
5
+ import { i as ListSearchController, n as listSearchStyles, o as registerListSearchCommands, r as LIST_SEARCH_MODES, t as createTreeListSearchAdapter } from "./incr-search-JIhwB49y.js";
6
6
  import "./interaction-ZTh4htzr.js";
7
7
  import { t as collectDataResult } from "./data-provider-35TyWclX.js";
8
8
  import { n as appearanceColor, t as appearanceAbsent } from "./item-appearance-BjcMyauw.js";
@@ -52,86 +52,30 @@ let MillerBaseElement = class MillerBaseElement extends LitElement {
52
52
  return;
53
53
  }
54
54
  switch (event.key) {
55
- case `ArrowDown`: {
55
+ case `ArrowDown`:
56
56
  event.preventDefault();
57
- const current = this.#getTickledNodeAndDepth();
58
- let targetIndex = 0;
59
- if (current && current.depth === currentDepth) targetIndex = Math.min(current.index + 1, col.length - 1);
60
- const targetNode = col[targetIndex];
61
- if (!targetNode) break;
62
- this.#setTickledNode(targetNode, currentDepth);
63
- if (this.interactionMode === `standard` || this.interactionMode === `vscode`) {
64
- const prevIndex = current?.index ?? 0;
65
- if (event.shiftKey) {
66
- if (!this.#anchor || this.#anchor.depth !== currentDepth) {
67
- const anchorNode = col[prevIndex];
68
- if (anchorNode) this.#anchor = {
69
- key: anchorNode.item.key,
70
- depth: currentDepth,
71
- index: prevIndex,
72
- selectionSnapshot: this.interactionMode === `vscode` ? new Set(this._selectedKeys) : void 0
73
- };
74
- }
75
- if (this.#anchor) {
76
- const from = Math.min(this.#anchor.index, targetIndex);
77
- const to = Math.max(this.#anchor.index, targetIndex);
78
- const rangeKeys = col.slice(from, to + 1).map((n) => n.item.key);
79
- if (this.interactionMode === `vscode`) {
80
- const snap = this.#anchor.selectionSnapshot;
81
- for (const k of rangeKeys) if (snap.has(k)) this._selectedKeys.delete(k);
82
- else this._selectedKeys.add(k);
83
- } else this._selectedKeys = new Set(rangeKeys);
84
- }
85
- } else if (this.interactionMode === `standard`) this.#anchor = {
86
- key: targetNode.item.key,
87
- depth: currentDepth,
88
- index: targetIndex
89
- };
90
- else this.#anchor = void 0;
91
- }
92
- this.requestUpdate();
57
+ this.#moveCursor(col, currentDepth, event, (current) => Math.min(current + 1, col.length - 1));
93
58
  break;
94
- }
95
- case `ArrowUp`: {
59
+ case `ArrowUp`:
96
60
  event.preventDefault();
97
- const current = this.#getTickledNodeAndDepth();
98
- let targetIndex = 0;
99
- if (current && current.depth === currentDepth) targetIndex = Math.max(current.index - 1, 0);
100
- const targetNode = col[targetIndex];
101
- if (!targetNode) break;
102
- this.#setTickledNode(targetNode, currentDepth);
103
- if (this.interactionMode === `standard` || this.interactionMode === `vscode`) {
104
- const prevIndex = current?.index ?? 0;
105
- if (event.shiftKey) {
106
- if (!this.#anchor || this.#anchor.depth !== currentDepth) {
107
- const anchorNode = col[prevIndex];
108
- if (anchorNode) this.#anchor = {
109
- key: anchorNode.item.key,
110
- depth: currentDepth,
111
- index: prevIndex,
112
- selectionSnapshot: this.interactionMode === `vscode` ? new Set(this._selectedKeys) : void 0
113
- };
114
- }
115
- if (this.#anchor) {
116
- const from = Math.min(this.#anchor.index, targetIndex);
117
- const to = Math.max(this.#anchor.index, targetIndex);
118
- const rangeKeys = col.slice(from, to + 1).map((n) => n.item.key);
119
- if (this.interactionMode === `vscode`) {
120
- const snap = this.#anchor.selectionSnapshot;
121
- for (const k of rangeKeys) if (snap.has(k)) this._selectedKeys.delete(k);
122
- else this._selectedKeys.add(k);
123
- } else this._selectedKeys = new Set(rangeKeys);
124
- }
125
- } else if (this.interactionMode === `standard`) this.#anchor = {
126
- key: targetNode.item.key,
127
- depth: currentDepth,
128
- index: targetIndex
129
- };
130
- else this.#anchor = void 0;
131
- }
132
- this.requestUpdate();
61
+ this.#moveCursor(col, currentDepth, event, (current) => Math.max(current - 1, 0));
62
+ break;
63
+ case `Home`:
64
+ event.preventDefault();
65
+ this.#moveCursor(col, currentDepth, event, () => 0, true);
66
+ break;
67
+ case `End`:
68
+ event.preventDefault();
69
+ this.#moveCursor(col, currentDepth, event, () => col.length - 1, true);
70
+ break;
71
+ case `PageUp`:
72
+ event.preventDefault();
73
+ this.#moveCursor(col, currentDepth, event, (current) => Math.max(current - this.#pageSize(currentDepth), 0), true);
74
+ break;
75
+ case `PageDown`:
76
+ event.preventDefault();
77
+ this.#moveCursor(col, currentDepth, event, (current) => Math.min(current + this.#pageSize(currentDepth), col.length - 1), true);
133
78
  break;
134
- }
135
79
  case `ArrowRight`: {
136
80
  event.preventDefault();
137
81
  const tickled = this.#getTickledNodeAndDepth();
@@ -224,14 +168,28 @@ let MillerBaseElement = class MillerBaseElement extends LitElement {
224
168
  window.addEventListener(`pointermove`, this.#onResizeMove);
225
169
  window.addEventListener(`pointerup`, this.#onResizeEnd);
226
170
  };
171
+ this.#resizeRaf = null;
172
+ this.#resizePendingWidth = 0;
227
173
  this.#onResizeMove = (event) => {
228
174
  if (this.#resizingDepth < 0) return;
229
- const delta = event.clientX - this.#resizeStartX;
230
- const newWidth = Math.max(32, this.#resizeStartWidth + delta);
231
- this.#columnWidths.set(this.#resizingDepth, newWidth);
232
- this.requestUpdate();
175
+ this.#resizePendingWidth = Math.max(32, this.#resizeStartWidth + (event.clientX - this.#resizeStartX));
176
+ this.#resizeRaf ??= requestAnimationFrame(this.#applyResizeWidth);
177
+ };
178
+ this.#applyResizeWidth = () => {
179
+ this.#resizeRaf = null;
180
+ if (this.#resizingDepth < 0) return;
181
+ (this.shadowRoot?.querySelectorAll(`.column`)[this.#resizingDepth])?.setAttribute(`style`, this.#explicitWidthStyle(this.#resizePendingWidth));
233
182
  };
234
183
  this.#onResizeEnd = () => {
184
+ if (this.#resizeRaf !== null) {
185
+ cancelAnimationFrame(this.#resizeRaf);
186
+ this.#resizeRaf = null;
187
+ }
188
+ if (this.#resizingDepth >= 0 && this.#resizePendingWidth > 0) {
189
+ this.#columnWidths.set(this.#resizingDepth, this.#resizePendingWidth);
190
+ this.requestUpdate();
191
+ }
192
+ this.#resizePendingWidth = 0;
235
193
  this.#resizingDepth = -1;
236
194
  window.removeEventListener(`pointermove`, this.#onResizeMove);
237
195
  window.removeEventListener(`pointerup`, this.#onResizeEnd);
@@ -838,7 +796,7 @@ let MillerBaseElement = class MillerBaseElement extends LitElement {
838
796
  this.#handleStandardClick(node, depth, event);
839
797
  break;
840
798
  case `manual`: break;
841
- case `checked`: this.#expandNode(node, depth);
799
+ case `checked`: this.#expandNode(node, depth, true);
842
800
  }
843
801
  }
844
802
  #handleImplicitClick(node, depth) {
@@ -848,7 +806,7 @@ let MillerBaseElement = class MillerBaseElement extends LitElement {
848
806
  this._selectedKeys = /* @__PURE__ */ new Set([node.item.key]);
849
807
  this._selectedNodes.clear();
850
808
  this._selectedNodes.add(node);
851
- this.#expandNode(node, depth);
809
+ this.#expandNode(node, depth, true);
852
810
  if (!previous.has(node)) this.#dispatchSelectEvent(previous);
853
811
  }
854
812
  #handleStandardClick(node, depth, event) {
@@ -891,16 +849,22 @@ let MillerBaseElement = class MillerBaseElement extends LitElement {
891
849
  } : void 0;
892
850
  this._selectedByDepth.set(depth, node);
893
851
  this.#lastSelectedNode = node;
894
- this.#expandNode(node, depth);
852
+ this.#expandNode(node, depth, true);
895
853
  if (!previous.has(node) || previous.size !== 1) this.#dispatchSelectEvent(previous);
896
854
  }
897
- #expandNode(node, depth) {
855
+ /**
856
+ * Open the column for `node`. `immediate` skips the lazy-load debounce: use
857
+ * it for deliberate clicks, where the user has committed to this node. The
858
+ * debounce is kept for keyboard navigation, which can sweep over many
859
+ * branches in quick succession.
860
+ */
861
+ #expandNode(node, depth, immediate = false) {
898
862
  if (node.item.isLeaf) {
899
863
  this._columns = this._columns.slice(0, depth + 1);
900
864
  this.requestUpdate();
901
865
  return;
902
866
  }
903
- if (node.children === void 0) this.#loadUnloadedChildren(node, depth, true);
867
+ if (node.children === void 0) this.#loadUnloadedChildren(node, depth, true, immediate);
904
868
  else {
905
869
  const newColumns = this._columns.slice(0, depth + 1);
906
870
  newColumns.push(node.children);
@@ -925,10 +889,11 @@ let MillerBaseElement = class MillerBaseElement extends LitElement {
925
889
  * own depth: its column for expansions, -1 for a view root (it sits above
926
890
  * column 0, so loaders computing child depth as `depth + 1` stay correct).
927
891
  */
928
- #loadUnloadedChildren(node, parentDepth, fireExpandEvent) {
892
+ #loadUnloadedChildren(node, parentDepth, fireExpandEvent, immediate = false) {
929
893
  const nodeDepth = parentDepth + 1;
930
894
  this._columns = this._columns.slice(0, nodeDepth);
931
895
  this._loadingDepth = nodeDepth;
896
+ this.#pendingController?.abort();
932
897
  this.#pendingNode = node;
933
898
  const controller = new AbortController();
934
899
  this.#pendingController = controller;
@@ -959,15 +924,20 @@ let MillerBaseElement = class MillerBaseElement extends LitElement {
959
924
  this.requestUpdate();
960
925
  };
961
926
  if (this.model || this.loadChildren) {
962
- if (this.#expandTimer !== void 0) clearTimeout(this.#expandTimer);
963
- this.#expandTimer = setTimeout(() => {
927
+ if (this.#expandTimer !== void 0) {
928
+ clearTimeout(this.#expandTimer);
929
+ this.#expandTimer = void 0;
930
+ }
931
+ const load = () => {
964
932
  this.#expandTimer = void 0;
965
933
  if (this.#pendingNode !== node) return;
966
934
  (this.model ? this.model.getChildren(node, nodeDepth - 1, controller.signal) : collectDataResult(this.loadChildren({
967
935
  node,
968
936
  depth: nodeDepth - 1
969
937
  }, controller.signal), controller.signal)).then((children) => applyChildren([...children])).catch(handleError);
970
- }, EXPAND_DEBOUNCE_MS);
938
+ };
939
+ if (immediate) load();
940
+ else this.#expandTimer = setTimeout(load, EXPAND_DEBOUNCE_MS);
971
941
  } else {
972
942
  this._loadingDepth = void 0;
973
943
  this.#pendingNode = void 0;
@@ -978,10 +948,12 @@ let MillerBaseElement = class MillerBaseElement extends LitElement {
978
948
  }
979
949
  }
980
950
  #onCheckboxClick(node) {
951
+ const previous = new Set(this._selectedNodes);
981
952
  const currentlySelected = this._selectedKeys.has(node.item.key);
982
953
  if (!!node.children?.length ? this.#allDescendantsSelected(node) : currentlySelected) this.#applyCheckedToggle(node, false);
983
954
  else this.#applyCheckedToggle(node, true);
984
955
  this.requestUpdate();
956
+ this.#dispatchSelectEvent(previous);
985
957
  }
986
958
  #allDescendantsSelected(node) {
987
959
  if (!this._selectedKeys.has(node.item.key)) return false;
@@ -1018,7 +990,7 @@ let MillerBaseElement = class MillerBaseElement extends LitElement {
1018
990
  index
1019
991
  };
1020
992
  }
1021
- #scrollNavigatedItemIntoView() {
993
+ #scrollNavigatedItemIntoView(behavior = `smooth`) {
1022
994
  requestAnimationFrame(() => {
1023
995
  const tickled = this.#getTickledNodeAndDepth();
1024
996
  if (!tickled) return;
@@ -1026,7 +998,7 @@ let MillerBaseElement = class MillerBaseElement extends LitElement {
1026
998
  if (!container) return;
1027
999
  container.querySelectorAll(`.item`)[tickled.index]?.scrollIntoView({
1028
1000
  block: `nearest`,
1029
- behavior: `smooth`
1001
+ behavior
1030
1002
  });
1031
1003
  });
1032
1004
  }
@@ -1041,9 +1013,67 @@ let MillerBaseElement = class MillerBaseElement extends LitElement {
1041
1013
  composed: true
1042
1014
  }));
1043
1015
  }
1016
+ /**
1017
+ * Number of items a PageUp/PageDown moves: how many rows fit in the column's
1018
+ * visible area, less one so the previous page's last row stays in view.
1019
+ */
1020
+ #pageSize(depth) {
1021
+ const content = this.shadowRoot?.querySelectorAll(`.column`)[depth]?.querySelector(`.column-content`);
1022
+ const item = content?.querySelector(`.item`);
1023
+ if (!content || !item || item.offsetHeight === 0) return 10;
1024
+ return Math.max(1, Math.floor(content.clientHeight / item.offsetHeight) - 1);
1025
+ }
1026
+ /**
1027
+ * Move the cursor within column `col` to the index returned by `target`
1028
+ * (given the current cursor index, or -1 when the cursor isn't in this
1029
+ * column, which behaves as "before the first item"). Handles Shift range
1030
+ * extension and anchor seating for `standard` / `vscode` modes.
1031
+ * `scroll` brings the new item into view (for jumps larger than one row).
1032
+ */
1033
+ #moveCursor(col, currentDepth, event, target, scroll = false) {
1034
+ const current = this.#getTickledNodeAndDepth();
1035
+ const targetIndex = target(current !== void 0 && current.depth === currentDepth ? current.index : -1);
1036
+ const targetNode = col[targetIndex];
1037
+ if (!targetNode) return;
1038
+ this.#setTickledNode(targetNode, currentDepth);
1039
+ if (this.interactionMode === `standard` || this.interactionMode === `vscode`) {
1040
+ const prevIndex = current?.index ?? 0;
1041
+ if (event.shiftKey) {
1042
+ if (!this.#anchor || this.#anchor.depth !== currentDepth) {
1043
+ const anchorNode = col[prevIndex];
1044
+ if (anchorNode) this.#anchor = {
1045
+ key: anchorNode.item.key,
1046
+ depth: currentDepth,
1047
+ index: prevIndex,
1048
+ selectionSnapshot: this.interactionMode === `vscode` ? new Set(this._selectedKeys) : void 0
1049
+ };
1050
+ }
1051
+ if (this.#anchor) {
1052
+ const from = Math.min(this.#anchor.index, targetIndex);
1053
+ const to = Math.max(this.#anchor.index, targetIndex);
1054
+ const rangeKeys = col.slice(from, to + 1).map((n) => n.item.key);
1055
+ if (this.interactionMode === `vscode`) {
1056
+ const snap = this.#anchor.selectionSnapshot;
1057
+ for (const k of rangeKeys) if (snap.has(k)) this._selectedKeys.delete(k);
1058
+ else this._selectedKeys.add(k);
1059
+ } else this._selectedKeys = new Set(rangeKeys);
1060
+ }
1061
+ } else if (this.interactionMode === `standard`) this.#anchor = {
1062
+ key: targetNode.item.key,
1063
+ depth: currentDepth,
1064
+ index: targetIndex
1065
+ };
1066
+ else this.#anchor = void 0;
1067
+ }
1068
+ this.requestUpdate();
1069
+ if (scroll) this.#scrollNavigatedItemIntoView(`auto`);
1070
+ }
1044
1071
  #onKeyDown;
1045
1072
  #onResizeStart;
1073
+ #resizeRaf;
1074
+ #resizePendingWidth;
1046
1075
  #onResizeMove;
1076
+ #applyResizeWidth;
1047
1077
  #onResizeEnd;
1048
1078
  #getColumnHeader(depth) {
1049
1079
  if (depth === 0) return this.#displayRoot?.item.label ?? ``;
@@ -1057,9 +1087,12 @@ let MillerBaseElement = class MillerBaseElement extends LitElement {
1057
1087
  }
1058
1088
  return ``;
1059
1089
  }
1090
+ #explicitWidthStyle(width) {
1091
+ return `width:${width}px;flex-grow:0;flex-shrink:0;flex-basis:auto;max-width:none`;
1092
+ }
1060
1093
  #columnStyle(depth, isLast) {
1061
1094
  const w = this.#columnWidths.get(depth);
1062
- if (w !== void 0) return `width:${w}px;flex-grow:0;flex-shrink:0;flex-basis:auto;max-width:none`;
1095
+ if (w !== void 0) return this.#explicitWidthStyle(w);
1063
1096
  if (this.stretchLastColumn && isLast) return `width:max-content;flex-grow:1;flex-shrink:0;flex-basis:auto;min-width:0`;
1064
1097
  return `width:max-content;flex-grow:0;flex-shrink:0;flex-basis:auto`;
1065
1098
  }
@@ -1309,8 +1342,24 @@ __decorate([state()], MillerBaseElement.prototype, "_selectedNodes", void 0);
1309
1342
  MillerBaseElement = __decorate([safeCustomElement(`ixfx-miller-base`)], MillerBaseElement);
1310
1343
  //#endregion
1311
1344
  //#region src/miller/miller-list.ts
1345
+ const HAS_CHECKED = 1;
1346
+ const HAS_UNCHECKED = 2;
1347
+ /**
1348
+ * Walk the loaded subtree under `node`, returning which kinds of leaf were
1349
+ * seen (`HAS_CHECKED` | `HAS_UNCHECKED`). Stops as soon as both have been
1350
+ * seen, since the result can no longer change.
1351
+ */
1352
+ function scanCheckState(node, selectedKeys) {
1353
+ if (node.item.isLeaf || !node.children?.length) return selectedKeys.has(node.item.key) ? HAS_CHECKED : HAS_UNCHECKED;
1354
+ let seen = 0;
1355
+ for (const child of node.children) {
1356
+ seen |= scanCheckState(child, selectedKeys);
1357
+ if (seen === 3) break;
1358
+ }
1359
+ return seen;
1360
+ }
1312
1361
  /**
1313
- * Recursively compute the checkbox state for a node based on `selectedKeys`.
1362
+ * Compute the checkbox state for a node based on `selectedKeys`.
1314
1363
  *
1315
1364
  * - Unloaded branch (`children === undefined`): treated as a leaf — we can only
1316
1365
  * report on what is known.
@@ -1319,12 +1368,9 @@ MillerBaseElement = __decorate([safeCustomElement(`ixfx-miller-base`)], MillerBa
1319
1368
  * indeterminate otherwise.
1320
1369
  */
1321
1370
  function computeCheckboxState(node, selectedKeys) {
1322
- if (node.item.isLeaf || !node.children?.length) return selectedKeys.has(node.item.key) ? `checked` : `unchecked`;
1323
- const childStates = node.children.map((c) => computeCheckboxState(c, selectedKeys));
1324
- const allChecked = childStates.every((s) => s === `checked`);
1325
- const allUnchecked = childStates.every((s) => s === `unchecked`);
1326
- if (allChecked) return `checked`;
1327
- if (allUnchecked) return `unchecked`;
1371
+ const seen = scanCheckState(node, selectedKeys);
1372
+ if (seen === HAS_CHECKED) return `checked`;
1373
+ if (seen === HAS_UNCHECKED) return `unchecked`;
1328
1374
  return `indeterminate`;
1329
1375
  }
1330
1376
  let MillerListElement = class MillerListElement extends MillerBaseElement {