@ixfx/components 0.16.0 → 0.16.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/bundle/index.d.ts +290 -66
  2. package/bundle/index.js +412 -327
  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/ac-token.js +1 -1
  7. package/dist/{button-N92DKoWb.d.ts → button-D1sPDUCM.d.ts} +1 -1
  8. package/dist/button.d.ts +1 -1
  9. package/dist/colour-picker.d.ts +1 -1
  10. package/dist/{crumb-navigation-YnFVFqrx.js → crumb-navigation-D3ndPgFg.js} +2 -2
  11. package/dist/{crumb-navigation-BbqfmkYs.d.ts → crumb-navigation-nnr881n-.d.ts} +1 -1
  12. package/dist/crumbs.d.ts +1 -1
  13. package/dist/crumbs.js +1 -1
  14. package/dist/{data-grid-CIG2DVip.d.ts → data-grid-BAEpfTkb.d.ts} +32 -5
  15. package/dist/{data-grid-rMkLX2qo.js → data-grid-CaPLWt5E.js} +159 -60
  16. package/dist/data-grid.d.ts +2 -2
  17. package/dist/data-grid.js +1 -1
  18. package/dist/{detail-list-C4pDSoI8.js → detail-list-C3XKTRmE.js} +86 -21
  19. package/dist/{detail-list-6iMTNP4N.d.ts → detail-list-DK49TsJd.d.ts} +26 -4
  20. package/dist/detail-list.d.ts +2 -2
  21. package/dist/detail-list.js +1 -1
  22. package/dist/{flat-list-JPgQSmLW.d.ts → flat-list-Bv4-qfjp.d.ts} +9 -4
  23. package/dist/flat-list.d.ts +1 -1
  24. package/dist/flat-list.js +6 -3
  25. package/dist/{grid-list-CdEkScn-.js → grid-list-51XsR2X2.js} +56 -18
  26. package/dist/{grid-list-D6n7WH8l.d.ts → grid-list-DaeSHv9P.d.ts} +58 -14
  27. package/dist/grid-list.d.ts +2 -2
  28. package/dist/grid-list.js +1 -1
  29. package/dist/{grouped-item-lister-DETte0Dh.d.ts → grouped-item-lister-DZIjo9nO.d.ts} +2 -2
  30. package/dist/grouped-item-lister.d.ts +1 -1
  31. package/dist/{icon-CDGprSdE.d.ts → icon-DR_3rSyZ.d.ts} +1 -1
  32. package/dist/icons.d.ts +2 -2
  33. package/dist/{incr-search-JIhwB49y.js → incr-search-2YaxUUA9.js} +150 -11
  34. package/dist/incr-search.d.ts +1 -1
  35. package/dist/incr-search.js +1 -1
  36. package/dist/{index-CoqtMSd9.d.ts → index-BUB5SICW.d.ts} +1 -1
  37. package/dist/{index-Dr80Zdl6.d.ts → index-BjRoPrwj.d.ts} +31 -4
  38. package/dist/{index-DN2BWctP.d.ts → index-Bz3loIAf.d.ts} +1 -1
  39. package/dist/{index-UvnoZUAo.d.ts → index-CJ5fshD3.d.ts} +1 -1
  40. package/dist/{index-DxyyVqzA.d.ts → index-DM9OLgTH.d.ts} +3 -2
  41. package/dist/{index-CYRc6Dah.d.ts → index-DXDz60XH.d.ts} +20 -1
  42. package/dist/{index-CYndvTWH.d.ts → index-garxxqgV.d.ts} +1 -1
  43. package/dist/{index-Bx0BXPxI.d.ts → index-vdbbGE7N.d.ts} +1 -1
  44. package/dist/index.d.ts +57 -28
  45. package/dist/index.js +58 -35
  46. package/dist/item-appearance-Bl6rMIID.js +60 -0
  47. package/dist/{labelled-input-base-DiTme1JO.d.ts → labelled-input-base-Dp_9KP0G.d.ts} +1 -1
  48. package/dist/labelled-radial-input.d.ts +2 -2
  49. package/dist/labelled-range-input.d.ts +1 -1
  50. package/dist/labelled-slider-input.d.ts +1 -1
  51. package/dist/list-group-header.d.ts +1 -1
  52. package/dist/{list-selection-controller-5L0Nj9tR.js → list-selection-controller-CJDdjH7E.js} +192 -54
  53. package/dist/list-selection-types-hj9Njei3.d.ts +83 -0
  54. package/dist/{menu-CU9KAm8s.js → menu-BX1FHxY8.js} +16 -1
  55. package/dist/{menu-item-bF6narIz.d.ts → menu-item-B0zqw2xp.d.ts} +1 -1
  56. package/dist/{menu-item-BUv8An2k.js → menu-item-oxU1VKiJ.js} +34 -9
  57. package/dist/menu.d.ts +2 -2
  58. package/dist/menu.js +2 -2
  59. package/dist/{miller-BFRfn0ve.js → miller-BfrTcujx.js} +142 -18
  60. package/dist/miller.d.ts +1 -1
  61. package/dist/miller.js +1 -1
  62. package/dist/narrowed-text.js +1 -1
  63. package/dist/panel.d.ts +1 -1
  64. package/dist/{split-layout-CophkNeU.d.ts → split-layout-ChZ0Glrs.d.ts} +1 -1
  65. package/dist/split-layout.d.ts +1 -1
  66. package/dist/sunburst-tree.d.ts +1 -1
  67. package/dist/sunburst-tree.js +1 -1
  68. package/dist/{sunbursttree-list-B_VxOHlo.js → sunbursttree-list-906G33ME.js} +1 -1
  69. package/dist/{sunbursttree-list-D6j5BxVQ.d.ts → sunbursttree-list-BAS0KrDG.d.ts} +1 -1
  70. package/dist/{tab-list-Df371rqw.d.ts → tab-list-wC0xNz1b.d.ts} +1 -1
  71. package/dist/tabs.d.ts +1 -1
  72. package/dist/{titlebar-Tqu-VvMU.d.ts → titlebar-B5zSTZnF.d.ts} +1 -1
  73. package/dist/titlebar.d.ts +1 -1
  74. package/dist/{tree-Crdpl4nc.js → tree-C_H1COTf.js} +1 -1
  75. package/dist/tree.d.ts +1 -1
  76. package/dist/tree.js +1 -1
  77. package/dist/{vertical-list-BPDmZx6T.d.ts → vertical-list-od4050Bo.d.ts} +11 -2
  78. package/dist/{vertical-list-1V1Vg2O5.js → vertical-list-qMRIxZIT.js} +54 -20
  79. package/dist/vertical-list.d.ts +2 -2
  80. package/dist/vertical-list.js +1 -1
  81. package/docs-user/data-grid.md +23 -7
  82. package/docs-user/detail-list.md +16 -1
  83. package/docs-user/dock.md +12 -3
  84. package/docs-user/grid-list.md +9 -3
  85. package/docs-user/index.json +2 -2
  86. package/docs-user/menu.md +11 -1
  87. package/docs-user/vertical-list.md +9 -1
  88. package/package.json +2 -2
  89. package/dist/item-appearance-BjcMyauw.js +0 -29
  90. package/dist/list-selection-types-PjKdhF-a.d.ts +0 -45
@@ -5,6 +5,7 @@ import { t as popupSurfaceStyles } from "./popup-D80sj2QC.js";
5
5
  import { n as safeCustomElement, t as __decorate } from "./decorate-VRK8rslU.js";
6
6
  import "./icon-1gpwtPx8.js";
7
7
  import "./interaction-E-uMGHkJ.js";
8
+ import { t as scrollFadeStyles } from "./scroll-fade-Xx28D7mH.js";
8
9
  import { LitElement, css, html } from "lit";
9
10
  import { property, query, state } from "lit/decorators.js";
10
11
  //#region src/menu/menu-container.ts
@@ -24,6 +25,7 @@ let MenuContainer = class MenuContainer extends LitElement {
24
25
  const item = items[index];
25
26
  item.tabIndex = 0;
26
27
  item.focus({ preventScroll: true });
28
+ if (this.tickled.inputMode === `keyboard`) item.scrollIntoView({ block: `nearest` });
27
29
  }
28
30
  },
29
31
  onStateChange: () => {
@@ -78,16 +80,29 @@ let MenuContainer = class MenuContainer extends LitElement {
78
80
  popupSurfaceStyles,
79
81
  themeFallbacks,
80
82
  tickledStyles,
83
+ scrollFadeStyles(`y`),
81
84
  css`
82
85
  :host {
83
86
  display: block;
84
87
  }
85
88
 
89
+ /* The surface (border, shadow) stays fixed; only the inner scroller
90
+ scrolls, so the scroll fade masks the items and not the surface edges. */
86
91
  .popover {
87
- padding: var(--space-xs) 0;
92
+ display: flex;
93
+ flex-direction: column;
94
+ max-height: var(--menu-max-height, min(60vh, 400px));
88
95
  min-width: 160px;
89
96
  }
90
97
 
98
+ .scroller {
99
+ min-height: 0;
100
+ padding: var(--space-s);
101
+ overflow-y: auto;
102
+ overscroll-behavior: contain;
103
+ --scroll-fade-width: var(--space-l);
104
+ }
105
+
91
106
  :host {
92
107
  opacity: 1;
93
108
  transform: translateY(0) scale(1);
@@ -159,7 +174,9 @@ let MenuContainer = class MenuContainer extends LitElement {
159
174
  @keydown=${this._handleKeydown}
160
175
  @mouseover=${this._handleMouseOver}
161
176
  >
162
- <slot @slotchange=${this._updateIconSections}></slot>
177
+ <div class="scroller scroll-fade-y">
178
+ <slot @slotchange=${this._updateIconSections}></slot>
179
+ </div>
163
180
  </div>
164
181
  `;
165
182
  }
@@ -541,7 +558,6 @@ let MenuTrigger = class MenuTrigger extends LitElement {
541
558
  :host {
542
559
  display: inline-block;
543
560
  position: relative;
544
- --ixfx-button-padding: var(--ixfx-button-padding, var(--space-s) var(--space-m));
545
561
  }
546
562
 
547
563
  /* Context mode with a context-target: dissolve the host's box so the
@@ -584,7 +600,7 @@ let MenuTrigger = class MenuTrigger extends LitElement {
584
600
  border: none;
585
601
  color: var(--surface-3-text);
586
602
  cursor: pointer;
587
- padding: var(--ixfx-button-padding);
603
+ padding: var(--ixfx-button-padding, var(--space-s) var(--space-m));
588
604
  font-family: var(--font-family, inherit);
589
605
  font-size: var(--text-m);
590
606
  font-weight: 600;
@@ -610,18 +626,24 @@ let MenuTrigger = class MenuTrigger extends LitElement {
610
626
  position: fixed;
611
627
  position-anchor: var(--anchor-name);
612
628
  inset: auto;
613
- margin: 8px;
629
+ /* Offset only along the placement axis so the popup's edge lines up
630
+ with the trigger's; flip fallbacks mirror the margin with it. */
631
+ margin: var(--menu-popup-offset, var(--space-xs)) 0;
614
632
  padding: 0;
615
633
  border: none;
616
634
  background: transparent;
617
635
  z-index: 100;
618
- max-height: min(60vh, 400px);
619
636
  max-width: min(90vw, 320px);
620
- overflow: auto;
621
- overscroll-behavior: contain;
637
+ /* Scrolling happens inside ixfx-menu-container (with a scroll fade).
638
+ Overriding the UA overflow:auto also stops the menu's shadow being clipped. */
639
+ overflow: visible;
622
640
  position-try-fallbacks: flip-block, flip-inline, flip-block flip-inline;
623
641
  }
624
642
 
643
+ :host([placement="right-start"]) .popup {
644
+ margin: 0 var(--menu-popup-offset, var(--space-xs));
645
+ }
646
+
625
647
  .popup[popover] {
626
648
  opacity: 1;
627
649
  transform: translateY(0) scale(1);
@@ -670,7 +692,10 @@ __decorate([property({
670
692
  })], MenuTrigger.prototype, "iconName", void 0);
671
693
  __decorate([property({ attribute: false })], MenuTrigger.prototype, "registry", void 0);
672
694
  __decorate([property({ attribute: false })], MenuTrigger.prototype, "keyboardManager", void 0);
673
- __decorate([property({ type: String })], MenuTrigger.prototype, "placement", void 0);
695
+ __decorate([property({
696
+ type: String,
697
+ reflect: true
698
+ })], MenuTrigger.prototype, "placement", void 0);
674
699
  __decorate([property({
675
700
  type: Boolean,
676
701
  attribute: `tab-stop`
package/dist/menu.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- import { i as MenuContainer, n as MenuTrigger, t as MenuItem } from "./menu-item-bF6narIz.js";
2
- import { a as menuFromTree, c as MenuSeparator, d as MenuCheckItem, f as MenuBar, i as MenuFromTreeOptions, l as MenuSubTrigger, n as MenuRadioGroup, o as menuFromTreeToElements, r as MenuRadioItem, s as MenuHeader, u as MenuCommandController } from "./index-DxyyVqzA.js";
1
+ import { i as MenuContainer, n as MenuTrigger, t as MenuItem } from "./menu-item-B0zqw2xp.js";
2
+ import { a as menuFromTree, c as MenuSeparator, d as MenuCheckItem, f as MenuBar, i as MenuFromTreeOptions, l as MenuSubTrigger, n as MenuRadioGroup, o as menuFromTreeToElements, r as MenuRadioItem, s as MenuHeader, u as MenuCommandController } from "./index-DM9OLgTH.js";
3
3
  export { MenuBar, MenuCheckItem, MenuCommandController, MenuContainer, type MenuFromTreeOptions, MenuHeader, MenuItem, MenuRadioGroup, MenuRadioItem, MenuSeparator, MenuSubTrigger, MenuTrigger, menuFromTree, menuFromTreeToElements };
package/dist/menu.js CHANGED
@@ -1,3 +1,3 @@
1
- import { n as MenuTrigger, r as MenuContainer, t as MenuItem } from "./menu-item-BUv8An2k.js";
2
- import { a as menuFromTreeToElements, c as MenuSubTrigger, d as MenuBar, i as menuFromTree, l as MenuCommandController, n as MenuRadioGroup, o as MenuHeader, r as MenuRadioItem, s as MenuSeparator, u as MenuCheckItem } from "./menu-CU9KAm8s.js";
1
+ import { n as MenuTrigger, r as MenuContainer, t as MenuItem } from "./menu-item-oxU1VKiJ.js";
2
+ import { a as menuFromTreeToElements, c as MenuSubTrigger, d as MenuBar, i as menuFromTree, l as MenuCommandController, n as MenuRadioGroup, o as MenuHeader, r as MenuRadioItem, s as MenuSeparator, u as MenuCheckItem } from "./menu-BX1FHxY8.js";
3
3
  export { MenuBar, MenuCheckItem, MenuCommandController, MenuContainer, MenuHeader, MenuItem, MenuRadioGroup, MenuRadioItem, MenuSeparator, MenuSubTrigger, MenuTrigger, menuFromTree, menuFromTreeToElements };
@@ -2,12 +2,12 @@ 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-JIhwB49y.js";
5
+ import { i as ListSearchController, n as listSearchStyles, o as registerListSearchCommands, r as LIST_SEARCH_MODES, t as createTreeListSearchAdapter } from "./incr-search-2YaxUUA9.js";
6
6
  import { a as capKeys, d as partitionKeys, l as keysToArray, n as EMPTY_KEYS } from "./pending-BGidHppL.js";
7
+ import { a as isPartialKey, n as appearanceColor, o as sameKeySet, r as PARTIAL_DESCRIPTION, t as appearanceAbsent } from "./item-appearance-Bl6rMIID.js";
7
8
  import "./interaction-E-uMGHkJ.js";
8
9
  import { t as collectDataResult } from "./data-provider-35TyWclX.js";
9
10
  import { a as restoreElementScroll, i as onUserScrollIntent, o as scrollToOffset, r as captureElementScroll, t as ViewStateController } from "./view-state-controller-BdyXWUUM.js";
10
- import { n as appearanceColor, t as appearanceAbsent } from "./item-appearance-BjcMyauw.js";
11
11
  import { LitElement, css, html, nothing } from "lit";
12
12
  import { property, state } from "lit/decorators.js";
13
13
  import { createCommandRegistry } from "@clinth/ui-commands";
@@ -278,6 +278,8 @@ let MillerBaseElement = class MillerBaseElement extends LitElement {
278
278
  this.#onColumnScroll = (event) => {
279
279
  if (this.#pendingColumnScroll.size === 0 && event.target.classList?.contains(`column-content`)) this.#viewState.notify();
280
280
  };
281
+ this._partialKeys = /* @__PURE__ */ new Set();
282
+ this._partialDescription = PARTIAL_DESCRIPTION;
281
283
  this.#selectOrigin = `user`;
282
284
  this.#selectSilent = false;
283
285
  this.#onKeyDown = (event) => {
@@ -781,6 +783,24 @@ let MillerBaseElement = class MillerBaseElement extends LitElement {
781
783
  }
782
784
  /** Not implemented on miller-list. */
783
785
  selectAll() {}
786
+ /**
787
+ * Nodes shown as *partially* selected (a part of the resource is selected):
788
+ * an indeterminate checkbox in `checked` mode, `.partial` and an accessible
789
+ * description otherwise. Independent of the selection — a key in both counts
790
+ * as selected. In `checked` mode this overrides the state derived from
791
+ * loaded descendants. Replace-on-set.
792
+ */
793
+ get partialKeys() {
794
+ return this._partialKeys;
795
+ }
796
+ set partialKeys(keys) {
797
+ const next = new Set(keys);
798
+ if (!sameKeySet(next, this._partialKeys)) this._partialKeys = next;
799
+ }
800
+ /** Whether `node` is shown as partial (and, being selected, not). */
801
+ _isPartial(node, depth) {
802
+ return isPartialKey(node.item.key, this._partialKeys, this._isSelected(node, depth));
803
+ }
784
804
  /** Not implemented on miller-list. */
785
805
  deselectAll() {}
786
806
  /**
@@ -1171,6 +1191,58 @@ let MillerBaseElement = class MillerBaseElement extends LitElement {
1171
1191
  bubbles: true,
1172
1192
  composed: true
1173
1193
  }));
1194
+ this.dispatchEvent(new CustomEvent(`list-select`, {
1195
+ detail: {
1196
+ selectedKeys: new Set(this._selectedKeys),
1197
+ previousKeys: new Set([...previous].map((n) => n.item.key)),
1198
+ previous
1199
+ },
1200
+ bubbles: true,
1201
+ composed: true
1202
+ }));
1203
+ }
1204
+ /** Report an intent before changing the selection; `true` when the caller took over. */
1205
+ #intercepted(intent) {
1206
+ return !this.dispatchEvent(new CustomEvent(`list-select-intent`, {
1207
+ detail: intent,
1208
+ bubbles: true,
1209
+ composed: true,
1210
+ cancelable: true
1211
+ }));
1212
+ }
1213
+ /** The anchor..`index` range in `col` when `depth` holds the range anchor, else `undefined`. */
1214
+ #rangeNodes(col, depth, index) {
1215
+ if (!this.#anchor || this.#anchor.depth !== depth || !col || index < 0) return void 0;
1216
+ return col.slice(Math.min(this.#anchor.index, index), Math.max(this.#anchor.index, index) + 1);
1217
+ }
1218
+ /** `manual` mode: nothing is selected here, but the caller is told what the click meant. */
1219
+ #reportManualClick(node, depth, event, source) {
1220
+ const key = node.item.key;
1221
+ if (event && (event.metaKey || event.ctrlKey)) {
1222
+ this.#intercepted({
1223
+ kind: `toggle`,
1224
+ keys: [key],
1225
+ source
1226
+ });
1227
+ return;
1228
+ }
1229
+ const col = this._columns[depth];
1230
+ const range = event?.shiftKey ? this.#rangeNodes(col, depth, col ? col.indexOf(node) : -1) : void 0;
1231
+ if (range && this.#anchor) {
1232
+ this.#intercepted({
1233
+ kind: `extend`,
1234
+ keys: range.map((n) => n.item.key),
1235
+ anchorKey: this.#anchor.key,
1236
+ targetKey: key,
1237
+ source
1238
+ });
1239
+ return;
1240
+ }
1241
+ this.#intercepted({
1242
+ kind: `replace`,
1243
+ keys: [key],
1244
+ source
1245
+ });
1174
1246
  }
1175
1247
  #abortPending() {
1176
1248
  if (this.#expandTimer !== void 0) {
@@ -1241,11 +1313,22 @@ let MillerBaseElement = class MillerBaseElement extends LitElement {
1241
1313
  case `vscode`:
1242
1314
  this.#handleStandardClick(node, depth, event);
1243
1315
  break;
1244
- case `manual`: break;
1316
+ case `manual`:
1317
+ this.#reportManualClick(node, depth, event, `pointer`);
1318
+ break;
1245
1319
  case `checked`: this.#expandNode(node, depth, true);
1246
1320
  }
1247
1321
  }
1248
1322
  #handleImplicitClick(node, depth) {
1323
+ if (this.#intercepted({
1324
+ kind: `replace`,
1325
+ keys: [node.item.key],
1326
+ source: `pointer`
1327
+ })) {
1328
+ this.#lastSelectedNode = node;
1329
+ this.#expandNode(node, depth, true);
1330
+ return;
1331
+ }
1249
1332
  const previous = new Set(this._selectedNodes);
1250
1333
  this._selectedByDepth.set(depth, node);
1251
1334
  this.#lastSelectedNode = node;
@@ -1261,6 +1344,18 @@ let MillerBaseElement = class MillerBaseElement extends LitElement {
1261
1344
  const isMeta = event ? event.metaKey || event.ctrlKey : false;
1262
1345
  const isShift = event ? event.shiftKey : false;
1263
1346
  if (isMeta) {
1347
+ if (this.#intercepted({
1348
+ kind: `toggle`,
1349
+ keys: [node.item.key],
1350
+ source: `pointer`
1351
+ })) {
1352
+ this.#anchor = index >= 0 ? {
1353
+ key: node.item.key,
1354
+ depth,
1355
+ index
1356
+ } : this.#anchor;
1357
+ return;
1358
+ }
1264
1359
  if (this._selectedKeys.has(node.item.key)) {
1265
1360
  this._selectedKeys.delete(node.item.key);
1266
1361
  this._selectedNodes.delete(node);
@@ -1278,23 +1373,38 @@ let MillerBaseElement = class MillerBaseElement extends LitElement {
1278
1373
  return;
1279
1374
  }
1280
1375
  if (isShift && this.#anchor && this.#anchor.depth === depth && col) {
1281
- const from = Math.min(this.#anchor.index, index);
1282
- const to = Math.max(this.#anchor.index, index);
1283
- const rangeNodes = col.slice(from, to + 1);
1376
+ const rangeNodes = this.#rangeNodes(col, depth, index) ?? [];
1377
+ if (this.#intercepted({
1378
+ kind: `extend`,
1379
+ keys: rangeNodes.map((n) => n.item.key),
1380
+ anchorKey: this.#anchor.key,
1381
+ targetKey: node.item.key,
1382
+ source: `pointer`
1383
+ })) return;
1284
1384
  this._selectedKeys = new Set(rangeNodes.map((n) => n.item.key));
1285
1385
  this._selectedNodes = new Set(rangeNodes);
1286
1386
  this.#selectionChanged();
1287
1387
  this.requestUpdate();
1288
1388
  return;
1289
1389
  }
1390
+ const intercepted = this.#intercepted({
1391
+ kind: `replace`,
1392
+ keys: [node.item.key],
1393
+ source: `pointer`
1394
+ });
1290
1395
  const previous = new Set(this._selectedNodes);
1291
- this._selectedKeys = /* @__PURE__ */ new Set([node.item.key]);
1292
- this._selectedNodes = /* @__PURE__ */ new Set([node]);
1293
1396
  this.#anchor = index >= 0 ? {
1294
1397
  key: node.item.key,
1295
1398
  depth,
1296
1399
  index
1297
1400
  } : void 0;
1401
+ if (intercepted) {
1402
+ this.#lastSelectedNode = node;
1403
+ this.#expandNode(node, depth, true);
1404
+ return;
1405
+ }
1406
+ this._selectedKeys = /* @__PURE__ */ new Set([node.item.key]);
1407
+ this._selectedNodes = /* @__PURE__ */ new Set([node]);
1298
1408
  this._selectedByDepth.set(depth, node);
1299
1409
  this.#lastSelectedNode = node;
1300
1410
  this.#expandNode(node, depth, true);
@@ -1399,6 +1509,11 @@ let MillerBaseElement = class MillerBaseElement extends LitElement {
1399
1509
  }
1400
1510
  }
1401
1511
  #onCheckboxClick(node) {
1512
+ if (this.#intercepted({
1513
+ kind: `toggle`,
1514
+ keys: [node.item.key],
1515
+ source: `pointer`
1516
+ })) return;
1402
1517
  const previous = new Set(this._selectedNodes);
1403
1518
  const currentlySelected = this._selectedKeys.has(node.item.key);
1404
1519
  if (!!node.children?.length ? this.#allDescendantsSelected(node) : currentlySelected) this.#applyCheckedToggle(node, false);
@@ -1519,7 +1634,13 @@ let MillerBaseElement = class MillerBaseElement extends LitElement {
1519
1634
  const from = Math.min(this.#anchor.index, targetIndex);
1520
1635
  const to = Math.max(this.#anchor.index, targetIndex);
1521
1636
  const rangeKeys = col.slice(from, to + 1).map((n) => n.item.key);
1522
- if (this.interactionMode === `vscode`) {
1637
+ if (this.#intercepted({
1638
+ kind: `extend`,
1639
+ keys: rangeKeys,
1640
+ anchorKey: this.#anchor.key,
1641
+ targetKey: targetNode.item.key,
1642
+ source: `keyboard`
1643
+ })) {} else if (this.interactionMode === `vscode`) {
1523
1644
  const snap = this.#anchor.selectionSnapshot;
1524
1645
  for (const k of rangeKeys) if (snap.has(k)) this._selectedKeys.delete(k);
1525
1646
  else this._selectedKeys.add(k);
@@ -1770,13 +1891,6 @@ let MillerBaseElement = class MillerBaseElement extends LitElement {
1770
1891
  @keyframes miller-spin {
1771
1892
  to { transform: rotate(360deg); }
1772
1893
  }
1773
-
1774
- ::highlight(incr-search-highlight) {
1775
- background: var(--search-highlight-bg, var(--accent));
1776
- color: var(--search-highlight-color, var(--accent-text, #fff));
1777
- border-radius: 2px;
1778
- padding: 0 1px;
1779
- }
1780
1894
  `
1781
1895
  ];
1782
1896
  }
@@ -1810,6 +1924,7 @@ __decorate([state()], MillerBaseElement.prototype, "_columns", void 0);
1810
1924
  __decorate([state()], MillerBaseElement.prototype, "_loadingDepth", void 0);
1811
1925
  __decorate([state()], MillerBaseElement.prototype, "_selectedNodes", void 0);
1812
1926
  __decorate([property({ attribute: false })], MillerBaseElement.prototype, "restoreLoads", void 0);
1927
+ __decorate([state()], MillerBaseElement.prototype, "_partialKeys", void 0);
1813
1928
  MillerBaseElement = __decorate([safeCustomElement(`ixfx-miller-base`)], MillerBaseElement);
1814
1929
  //#endregion
1815
1930
  //#region src/miller/miller-list.ts
@@ -1861,6 +1976,7 @@ let MillerListElement = class MillerListElement extends MillerBaseElement {
1861
1976
  }
1862
1977
  #renderListItem(node, depth) {
1863
1978
  const selected = this._isSelected(node, depth);
1979
+ const partial = this._isPartial(node, depth);
1864
1980
  const tickled = this._isFocused(node, depth);
1865
1981
  const open = this._isOpen(node, depth);
1866
1982
  const isBranch = node.item.isLeaf !== true;
@@ -1872,13 +1988,14 @@ let MillerListElement = class MillerListElement extends MillerBaseElement {
1872
1988
  const isCheckedMode = this.interactionMode === `checked`;
1873
1989
  let checkboxTpl = nothing;
1874
1990
  if (isCheckedMode) {
1875
- const state = computeCheckboxState(node, this._selectedKeys);
1991
+ const state = partial ? `indeterminate` : computeCheckboxState(node, this._selectedKeys);
1876
1992
  checkboxTpl = html`
1877
1993
  <input
1878
1994
  type="checkbox"
1879
1995
  class="item-checkbox"
1880
1996
  .checked=${state === `checked`}
1881
1997
  .indeterminate=${state === `indeterminate`}
1998
+ aria-checked=${state === `indeterminate` ? `mixed` : String(state === `checked`)}
1882
1999
  aria-label="Select ${node.item.label}"
1883
2000
  @click=${(e) => this._handleCheckboxClick(e, node, depth)}
1884
2001
  />
@@ -1886,9 +2003,10 @@ let MillerListElement = class MillerListElement extends MillerBaseElement {
1886
2003
  }
1887
2004
  return html`
1888
2005
  <li
1889
- class="item ${selected ? `selected` : ``} ${open ? `open` : ``} ${tickled ? `tickled` : ``} ${isBranch ? `branch` : `leaf`}"
2006
+ class="item ${selected ? `selected` : ``} ${partial ? `partial` : ``} ${open ? `open` : ``} ${tickled ? `tickled` : ``} ${isBranch ? `branch` : `leaf`}"
1890
2007
  role="option"
1891
2008
  aria-selected=${selected}
2009
+ aria-description=${partial && !isCheckedMode ? this._partialDescription : nothing}
1892
2010
  @click=${(e) => this._handleItemClick(node, depth, e)}
1893
2011
  @dblclick=${(e) => this._handleItemDblClick(node, depth, e)}
1894
2012
  @contextmenu=${(e) => this._handleItemRightClick(node, depth, e)}
@@ -1921,6 +2039,12 @@ let MillerListElement = class MillerListElement extends MillerBaseElement {
1921
2039
  justify-content: space-between;
1922
2040
  }
1923
2041
 
2042
+ .item.partial:not(.selected) {
2043
+ background: var(--item-bg-partial, color-mix(in srgb, var(--item-selected-bg) 35%, transparent));
2044
+ outline: 1px dashed var(--item-border-partial, var(--border, #555));
2045
+ outline-offset: -1px;
2046
+ }
2047
+
1924
2048
  .item.selected {
1925
2049
  background: var(--item-selected-bg);
1926
2050
  color: var(--item-selected-text, #fff);
package/dist/miller.d.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  import { A as TreeTickleDetail, O as TreeSelectDetail, b as TreeItemClickDetail, i as TreeCollapseEvent, j as TreeTickleEvent, k as TreeSelectEvent, n as TreeActivateEvent, r as TreeCollapseDetail, t as TreeActivateDetail, v as TreeExpandDetail, x as TreeItemClickEvent, y as TreeExpandEvent } from "./tree-component-DgfkxmVY.js";
2
2
  import { a as TreeItem, o as TreeNode } from "./types-Jky6oNAp.js";
3
- import { _ as MillerRebaseEvent, a as MillerBaseElementEventMap, c as MillerHeaderClickEvent, d as MillerItemDblClickDetail, f as MillerItemDblClickEvent, g as MillerRebaseDetail, h as MillerItemState, i as MillerBaseElement, l as MillerHeaderRightClickDetail, m as MillerItemRightClickEvent, n as MillerTreeControllerOptions, o as MillerListViewState, p as MillerItemRightClickDetail, r as MillerListElement, s as MillerHeaderClickDetail, t as MillerTreeController, u as MillerHeaderRightClickEvent, v as MillerSelectionMode } from "./index-CYRc6Dah.js";
3
+ import { _ as MillerRebaseEvent, a as MillerBaseElementEventMap, c as MillerHeaderClickEvent, d as MillerItemDblClickDetail, f as MillerItemDblClickEvent, g as MillerRebaseDetail, h as MillerItemState, i as MillerBaseElement, l as MillerHeaderRightClickDetail, m as MillerItemRightClickEvent, n as MillerTreeControllerOptions, o as MillerListViewState, p as MillerItemRightClickDetail, r as MillerListElement, s as MillerHeaderClickDetail, t as MillerTreeController, u as MillerHeaderRightClickEvent, v as MillerSelectionMode } from "./index-DXDz60XH.js";
4
4
  export { type TreeActivateDetail as MillerActivateDetail, type TreeActivateEvent as MillerActivateEvent, MillerBaseElement, MillerBaseElementEventMap, type TreeCollapseDetail as MillerCollapseDetail, type TreeCollapseEvent as MillerCollapseEvent, type TreeExpandDetail as MillerExpandDetail, type TreeExpandEvent as MillerExpandEvent, MillerHeaderClickDetail, MillerHeaderClickEvent, MillerHeaderRightClickDetail, MillerHeaderRightClickEvent, type TreeItem as MillerItem, type TreeItemClickDetail as MillerItemClickDetail, type TreeItemClickEvent as MillerItemClickEvent, MillerItemDblClickDetail, MillerItemDblClickEvent, MillerItemRightClickDetail, MillerItemRightClickEvent, MillerItemState, MillerListElement, type MillerListViewState, type TreeNode as MillerNode, MillerRebaseDetail, MillerRebaseEvent, type TreeSelectDetail as MillerSelectDetail, type TreeSelectEvent as MillerSelectEvent, MillerSelectionMode, type TreeTickleDetail as MillerTickleDetail, type TreeTickleEvent as MillerTickleEvent, MillerTreeController, MillerTreeControllerOptions };
package/dist/miller.js CHANGED
@@ -1,2 +1,2 @@
1
- import { n as MillerListElement, r as MillerBaseElement, t as MillerTreeController } from "./miller-BFRfn0ve.js";
1
+ import { n as MillerListElement, r as MillerBaseElement, t as MillerTreeController } from "./miller-BfrTcujx.js";
2
2
  export { MillerBaseElement, MillerListElement, MillerTreeController };
@@ -3,7 +3,7 @@ import { t as TickledController } from "./tickled-controller-D-HZymaZ.js";
3
3
  import { n as tickledStyles, t as tickledItemStyles } from "./tickled-styles-BrAHEj1q.js";
4
4
  import { t as themeFallbacks } from "./fallbacks-DQ_5OsmR.js";
5
5
  import { n as safeCustomElement, t as __decorate } from "./decorate-VRK8rslU.js";
6
- import { p as createIncrSearch } from "./incr-search-JIhwB49y.js";
6
+ import { m as createIncrSearch } from "./incr-search-2YaxUUA9.js";
7
7
  import "./interaction-E-uMGHkJ.js";
8
8
  import { LitElement, css, html, nothing } from "lit";
9
9
  import { property, query, state } from "lit/decorators.js";
package/dist/panel.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { a as TitlebarToggleDetail, c as TitlebarVariant, i as TitlebarOrientation, o as TitlebarToggleEvent, s as TitlebarToggleInteraction, t as TitlebarCloseEvent } from "./titlebar-Tqu-VvMU.js";
1
+ import { a as TitlebarToggleDetail, c as TitlebarVariant, i as TitlebarOrientation, o as TitlebarToggleEvent, s as TitlebarToggleInteraction, t as TitlebarCloseEvent } from "./titlebar-B5zSTZnF.js";
2
2
  import { LitElement } from "lit";
3
3
  //#region src/panel/panel.d.ts
4
4
  /** Backwards-compatible aliases: canonical types now live in `../titlebar/titlebar.js`. */
@@ -194,7 +194,7 @@ declare class SplitLayoutElement extends LitElement {
194
194
  private _onPointerUp;
195
195
  private _emitResize;
196
196
  private _emitChange;
197
- protected render(): typeof nothing | import("lit").TemplateResult<1>;
197
+ protected render(): import("lit").TemplateResult<1> | typeof nothing;
198
198
  private _getTrackSizes;
199
199
  private _resolveTracks;
200
200
  private _renderGutter;
@@ -1,2 +1,2 @@
1
- import { t as SplitLayoutElement } from "./split-layout-CophkNeU.js";
1
+ import { t as SplitLayoutElement } from "./split-layout-ChZ0Glrs.js";
2
2
  export { SplitLayoutElement };
@@ -1,2 +1,2 @@
1
- import { a as SunburstViewState, i as SunburstZoomEvent, n as SunburstTreeListElementEventMap, r as SunburstZoomDetail, t as SunburstTreeListElement } from "./sunbursttree-list-D6j5BxVQ.js";
1
+ import { a as SunburstViewState, i as SunburstZoomEvent, n as SunburstTreeListElementEventMap, r as SunburstZoomDetail, t as SunburstTreeListElement } from "./sunbursttree-list-BAS0KrDG.js";
2
2
  export { SunburstTreeListElement, SunburstTreeListElementEventMap, type SunburstViewState, SunburstZoomDetail, SunburstZoomEvent };
@@ -1,2 +1,2 @@
1
- import { t as SunburstTreeListElement } from "./sunbursttree-list-B_VxOHlo.js";
1
+ import { t as SunburstTreeListElement } from "./sunbursttree-list-906G33ME.js";
2
2
  export { SunburstTreeListElement };
@@ -1,7 +1,7 @@
1
1
  import { t as TickledController } from "./tickled-controller-D-HZymaZ.js";
2
2
  import { t as themeFallbacks } from "./fallbacks-DQ_5OsmR.js";
3
3
  import { n as safeCustomElement, t as __decorate } from "./decorate-VRK8rslU.js";
4
- import { i as ListSearchController, n as listSearchStyles, o as registerListSearchCommands, r as LIST_SEARCH_MODES, t as createTreeListSearchAdapter } from "./incr-search-JIhwB49y.js";
4
+ import { i as ListSearchController, n as listSearchStyles, o as registerListSearchCommands, r as LIST_SEARCH_MODES, t as createTreeListSearchAdapter } from "./incr-search-2YaxUUA9.js";
5
5
  import { a as capKeys, l as keysToArray, n as EMPTY_KEYS } from "./pending-BGidHppL.js";
6
6
  import { t as collectDataResult } from "./data-provider-35TyWclX.js";
7
7
  import { t as ViewStateController } from "./view-state-controller-BdyXWUUM.js";
@@ -2,7 +2,7 @@ import { C as TreeItemDblClickEvent, E as TreeSearchHost, M as TreeDataModel, a
2
2
  import { a as TreeItem, n as TreeExclusivity, o as TreeNode, r as TreeFilterPredicate, s as TreeSelectionFilter, t as LoadChildrenCallback } from "./types-Jky6oNAp.js";
3
3
  import { a as ViewStateBase, t as GetViewStateOptions } from "./types-LU1u0CB8.js";
4
4
  import "./index-9ttcdwlL.js";
5
- import { S as ListSearchController } from "./index-Dr80Zdl6.js";
5
+ import { S as ListSearchController } from "./index-BjRoPrwj.js";
6
6
  import { LitElement, PropertyValues } from "lit";
7
7
  import { CommandRegistry } from "@clinth/ui-commands";
8
8
  //#region src/sunburst-tree/types.d.ts
@@ -1,4 +1,4 @@
1
- import "./icon-CDGprSdE.js";
1
+ import "./icon-DR_3rSyZ.js";
2
2
  import { LitElement, PropertyValues } from "lit";
3
3
  import { CommandRegistry } from "@clinth/ui-commands";
4
4
  //#region src/tabs/tab-list-item.d.ts
package/dist/tabs.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- import { a as TabListReorderDetail, i as TabListElement, n as TabListChangeEvent, o as TabListReorderEvent, r as TabListDragMode, t as TabListChangeDetail } from "./tab-list-Df371rqw.js";
1
+ import { a as TabListReorderDetail, i as TabListElement, n as TabListChangeEvent, o as TabListReorderEvent, r as TabListDragMode, t as TabListChangeDetail } from "./tab-list-wC0xNz1b.js";
2
2
  export { TabListChangeDetail, TabListChangeEvent, TabListDragMode, TabListElement, TabListReorderDetail, TabListReorderEvent };
@@ -1,4 +1,4 @@
1
- import "./icon-CDGprSdE.js";
1
+ import "./icon-DR_3rSyZ.js";
2
2
  import { LitElement } from "lit";
3
3
  //#region src/titlebar/titlebar.d.ts
4
4
  type TitlebarOrientation = `horizontal` | `vertical`;
@@ -1,2 +1,2 @@
1
- import { a as TitlebarToggleDetail, c as TitlebarVariant, i as TitlebarOrientation, n as TitlebarElement, o as TitlebarToggleEvent, r as TitlebarElementEventMap, s as TitlebarToggleInteraction, t as TitlebarCloseEvent } from "./titlebar-Tqu-VvMU.js";
1
+ import { a as TitlebarToggleDetail, c as TitlebarVariant, i as TitlebarOrientation, n as TitlebarElement, o as TitlebarToggleEvent, r as TitlebarElementEventMap, s as TitlebarToggleInteraction, t as TitlebarCloseEvent } from "./titlebar-B5zSTZnF.js";
2
2
  export { TitlebarCloseEvent, TitlebarElement, TitlebarElementEventMap, TitlebarOrientation, TitlebarToggleDetail, TitlebarToggleEvent, TitlebarToggleInteraction, TitlebarVariant };
@@ -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-JIhwB49y.js";
5
+ import { i as ListSearchController, n as listSearchStyles, o as registerListSearchCommands, r as LIST_SEARCH_MODES, t as createTreeListSearchAdapter } from "./incr-search-2YaxUUA9.js";
6
6
  import { i as animateListItemOut, o as prefersReducedMotion, r as animateListItemIn, t as ListNativeDragController } from "./list-native-drag-controller-CcXoS0YX.js";
7
7
  import { a as capKeys, c as keysAsFlags, f as withoutFlag, i as capFlags, l as keysToArray, n as EMPTY_KEYS, o as flagsFromRecord, s as flagsToRecord, t as EMPTY_FLAGS } from "./pending-BGidHppL.js";
8
8
  import { n as createScrollHoverGuard } from "./scroll-hover-guard-Cjw6179Q.js";
package/dist/tree.d.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  import { A as TreeTickleDetail, M as TreeDataModel, N as TreeDataModelOptions, O as TreeSelectDetail, T as TreeRevealMode, _ as TreeDropTarget, b as TreeItemClickDetail, c as TreeDragContext, d as TreeDragStartEvent, g as TreeDropPosition, h as TreeDropEvent, i as TreeCollapseEvent, j as TreeTickleEvent, k as TreeSelectEvent, l as TreeDragEndEvent, m as TreeDropDetail, n as TreeActivateEvent, o as TreeComponentEventMap, p as TreeDropContext, r as TreeCollapseDetail, s as TreeDndMode, t as TreeActivateDetail, u as TreeDragOverEvent, v as TreeExpandDetail, w as TreeNavigateOptions, x as TreeItemClickEvent, y as TreeExpandEvent } from "./tree-component-DgfkxmVY.js";
2
2
  import { a as TreeItem, n as TreeExclusivity, o as TreeNode, r as TreeFilterPredicate, s as TreeSelectionFilter, t as LoadChildrenCallback } from "./types-Jky6oNAp.js";
3
- import { a as TreeDropVisibleRow, c as TreeListElement, d as TreeBaseElement, f as TreeBaseElementEventMap, h as TreeConfig, i as TreeDropRowInfo, l as TreeCheckboxState, m as TreeListViewState, n as TreeDropControllerConfig, o as TreeController, p as TreeVirtualize, r as TreeDropResolvedDrag, s as TreeControllerOptions, t as TreeDropController, u as TreeAnimation } from "./index-Bx0BXPxI.js";
3
+ import { a as TreeDropVisibleRow, c as TreeListElement, d as TreeBaseElement, f as TreeBaseElementEventMap, h as TreeConfig, i as TreeDropRowInfo, l as TreeCheckboxState, m as TreeListViewState, n as TreeDropControllerConfig, o as TreeController, p as TreeVirtualize, r as TreeDropResolvedDrag, s as TreeControllerOptions, t as TreeDropController, u as TreeAnimation } from "./index-vdbbGE7N.js";
4
4
  export { type LoadChildrenCallback, type TreeActivateDetail, type TreeActivateEvent, TreeAnimation, TreeBaseElement, TreeBaseElementEventMap, type TreeCheckboxState, type TreeCollapseDetail, type TreeCollapseEvent, type TreeComponentEventMap, TreeConfig, TreeController, TreeControllerOptions, TreeDataModel, type TreeDataModelOptions, type TreeDndMode, type TreeDragContext, type TreeDragEndEvent, type TreeDragOverEvent, type TreeDragStartEvent, type TreeDropContext, TreeDropController, TreeDropControllerConfig, type TreeDropDetail, type TreeDropEvent, type TreeDropPosition, TreeDropResolvedDrag, TreeDropRowInfo, type TreeDropTarget, TreeDropVisibleRow, type TreeExclusivity, type TreeExpandDetail, type TreeExpandEvent, type TreeFilterPredicate, type TreeItem, type TreeItemClickDetail, type TreeItemClickEvent, TreeListElement, type TreeListViewState, type TreeNavigateOptions, type TreeNode, type TreeRevealMode, type TreeSelectDetail, type TreeSelectEvent, type TreeSelectionFilter, type TreeTickleDetail, type TreeTickleEvent, TreeVirtualize };
package/dist/tree.js CHANGED
@@ -1,2 +1,2 @@
1
- import { a as TreeDataModel, i as TreeDropController, n as TreeListElement, r as TreeBaseElement, t as TreeController } from "./tree-Crdpl4nc.js";
1
+ import { a as TreeDataModel, i as TreeDropController, n as TreeListElement, r as TreeBaseElement, t as TreeController } from "./tree-C_H1COTf.js";
2
2
  export { TreeBaseElement, TreeController, TreeDataModel, TreeDropController, TreeListElement };
@@ -2,8 +2,8 @@ import { L as ListDragPreviewRenderer, R as ListDragPreviewSourceResolver, V as
2
2
  import { a as ViewStateBase, t as GetViewStateOptions } from "./types-LU1u0CB8.js";
3
3
  import "./index-9ttcdwlL.js";
4
4
  import { n as ListViewportChangeEvent } from "./list-viewport-types-BRZsLcvp.js";
5
- import { S as ListSearchController } from "./index-Dr80Zdl6.js";
6
- import { i as ListInteractionMode, l as ListSelectionMode, r as ListElementEventMap } from "./list-selection-types-PjKdhF-a.js";
5
+ import { i as ListInteractionMode, m as ListSelectionMode, r as ListElementEventMap } from "./list-selection-types-hj9Njei3.js";
6
+ import { S as ListSearchController } from "./index-BjRoPrwj.js";
7
7
  import "./editable-label-rzXkjf1H.js";
8
8
  import { LitElement, PropertyValues } from "lit";
9
9
  import { CommandId, CommandRegistry } from "@clinth/ui-commands";
@@ -262,6 +262,15 @@ declare class VerticalListElement extends LitElement {
262
262
  selectAll(): void;
263
263
  /** The selection as stable `data-key` / `data-value` strings. */
264
264
  get selectedKeys(): ReadonlySet<string>;
265
+ /**
266
+ * Rows shown as *partially* selected (a part of the resource is selected):
267
+ * `data-partial`, an indeterminate checkbox in `checked` mode, and an
268
+ * accessible description. Independent of `selectedKeys` — a key in both
269
+ * counts as selected. Replace-on-set; keys without a row are kept for when
270
+ * the row appears.
271
+ */
272
+ get partialKeys(): ReadonlySet<string>;
273
+ set partialKeys(keys: Iterable<string>);
265
274
  /** The key of the item under the cursor, or `undefined`. */
266
275
  get tickledKey(): string | undefined;
267
276
  /** Replace the selection with the items carrying these keys (unknown keys ignored). */