@ixfx/components 0.16.3 → 0.16.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 (39) hide show
  1. package/bundle/index.d.ts +2 -2
  2. package/bundle/index.js +5 -5
  3. package/dist/{index-DyaHA9Kk.d.ts → index-YCDugjdu.d.ts} +2 -2
  4. package/dist/index.d.ts +1 -1
  5. package/dist/index.js +1 -1
  6. package/dist/{miller-Be7x4ufN.js → miller-BrmBywNZ.js} +17 -7
  7. package/dist/miller.d.ts +1 -1
  8. package/dist/miller.js +1 -1
  9. package/docs-user/README.md +5 -0
  10. package/docs-user/bottom-drawer.md +2 -2
  11. package/docs-user/crumbs.md +1 -1
  12. package/docs-user/data-grid.md +2 -2
  13. package/docs-user/detail-list.md +3 -3
  14. package/docs-user/dock.md +3 -3
  15. package/docs-user/flat-list.md +7 -7
  16. package/docs-user/grid-list.md +3 -3
  17. package/docs-user/hyperbolic-tree.md +6 -6
  18. package/docs-user/icicle-tree.md +2 -2
  19. package/docs-user/incr-search.md +1 -1
  20. package/docs-user/index.json +22 -2
  21. package/docs-user/infra-handle.md +122 -0
  22. package/docs-user/infra-incremental.md +154 -0
  23. package/docs-user/infra-theming.md +510 -0
  24. package/docs-user/infra-view-state.md +210 -0
  25. package/docs-user/list-state.md +656 -0
  26. package/docs-user/llms.txt +5 -0
  27. package/docs-user/miller.md +2 -2
  28. package/docs-user/panel.md +3 -3
  29. package/docs-user/split-layout.md +2 -2
  30. package/docs-user/sunburst-tree.md +3 -3
  31. package/docs-user/titlebar.md +2 -2
  32. package/docs-user/tree.md +2 -2
  33. package/docs-user/treemap.md +2 -2
  34. package/docs-user/twosplit-layout.md +3 -3
  35. package/docs-user/user-selection-intents.md +3 -3
  36. package/docs-user/user-theming.md +1 -1
  37. package/docs-user/vertical-list.md +2 -2
  38. package/llms.txt +5 -0
  39. package/package.json +1 -1
package/bundle/index.d.ts CHANGED
@@ -11189,8 +11189,8 @@ declare class MillerBaseElement extends LitElement implements TreeComponent, Tre
11189
11189
  * Nodes shown as *partially* selected (a part of the resource is selected):
11190
11190
  * an indeterminate checkbox in `checked` mode, `.partial` and an accessible
11191
11191
  * description otherwise. Independent of the selection — a key in both counts
11192
- * as selected. In `checked` mode this overrides the state derived from
11193
- * loaded descendants. Replace-on-set.
11192
+ * as selected. In `checked` mode a node is indeterminate if either the
11193
+ * loaded descendants or this say so (as in the tree). Replace-on-set.
11194
11194
  */
11195
11195
  get partialKeys(): ReadonlySet<string>;
11196
11196
  set partialKeys(keys: Iterable<string>);
package/bundle/index.js CHANGED
@@ -10165,7 +10165,7 @@ ixfx-form-options[orientation="vertical"] ixfx-form-part > label {
10165
10165
  :host([mode="pulse"]) div {
10166
10166
  transition: none;
10167
10167
  }
10168
- `}};E([d({type:Number})],TE.prototype,`value`,void 0),E([d({type:Boolean,attribute:`lit`,reflect:!0})],TE.prototype,`lit`,void 0),E([d({type:String})],TE.prototype,`color`,void 0),E([d({type:Boolean,attribute:`glow`,reflect:!0})],TE.prototype,`glow`,void 0),E([d({type:String,reflect:!0})],TE.prototype,`mode`,void 0),E([d({type:Boolean,attribute:`blinking`,reflect:!0})],TE.prototype,`blinking`,void 0),E([d({type:Number,attribute:`rate`})],TE.prototype,`rate`,void 0),E([d({type:Number,attribute:`attack-time`})],TE.prototype,`attackTime`,void 0),E([d({type:Number,attribute:`release-time`})],TE.prototype,`releaseTime`,void 0),E([d({type:Boolean,attribute:`pulse-retrigger`})],TE.prototype,`pulseRetrigger`,void 0),TE=E([T(`ixfx-led`)],TE);function EE(e){let n=[];for(let r=0;r<e.length-1;r++){let i=e[r+1],a=e[r].find(e=>e.children===i);if(!a)break;n.push(a.item.key)}return n}function DE(e,n){let r=[e],i=[],a=e;for(let e of n){let n=a.find(n=>n.item.key===e);if(!n)return{columns:r,nodes:i,blocked:void 0,done:!1};if(i.push(n),n.item.isLeaf===!0)return{columns:r,nodes:i,blocked:void 0,done:!0};if(n.children===void 0)return{columns:r,nodes:i,blocked:n,done:!1};r.push(n.children),a=n.children}return{columns:r,nodes:i,blocked:void 0,done:!0}}function OE(e){let n=new Map;for(let[r,i]of Object.entries(e)){let e=Number(r);Number.isInteger(e)&&e>=0&&typeof i==`number`&&Number.isFinite(i)&&i>0&&n.set(e,i)}return n}function kE(e,n){return e.length===n.length&&e.every((e,r)=>e===n[r])}function AE(e,n){return e.findIndex(e=>e.some(e=>e.item.key===n))}function jE(e){let n=new Map,r=[...e];for(;r.length>0;){let e=r.pop();n.set(e.item.key,e),e.children&&r.push(...e.children)}return n}function ME(e,n,r,i){let a=[...e].filter(e=>!r(e)),{present:o,missing:s}=ar(n,r);if(a.length===0&&o.length===0)return{live:e,pending:n,restored:[],changed:!1};if(i&&o.length>0){let e=o.at(-1);return{live:new Set([e]),pending:k,restored:[e],changed:!0}}return{live:new Set([...[...e].filter(r),...o]),pending:sr(a.length===0?s:new Set([...s,...a])),restored:o,changed:!0}}function NE(e,n,r,i,a){let o=DE(e,n),s=o.blocked!==void 0&&o.blocked===a,c=!s&&!kE(o.columns,r),l;if(c){l=new Map(o.nodes.map((e,n)=>[n,e]));let e=i.get(o.nodes.length);e&&o.columns[o.nodes.length]?.includes(e)&&l.set(o.nodes.length,e)}return{columns:c?o.columns:void 0,selectedByDepth:l,pending:o.done?void 0:n,load:o.blocked&&!s&&o.blocked.item.isLeaf!==!0?{node:o.blocked,depth:o.nodes.length-1}:void 0}}function PE(e,n,r,i,a,o,s){let c=ME(e,n,e=>a.has(e),s),l=[...c.live].map(e=>a.get(e));if(!c.changed&&l.length===r.size&&l.every(e=>r.has(e)))return;let u=c.restored.at(-1)??i?.item.key,d=[];for(let e of c.restored){let n=AE(o,e);n>=0&&d.push([n,a.get(e)])}return{keys:new Set(c.live),nodes:new Set(l),pending:c.pending,last:(u===void 0?void 0:a.get(u))??l.at(-1),placed:d,restored:c.restored.length>0}}function FE(e,n,r,i,a){let o=e!==void 0&&!i.has(e),s=r??(o&&n?e:void 0),c=s===void 0?-1:AE(a,s);return c<0?{clear:o,pending:s,tickle:void 0}:{clear:o,pending:void 0,tickle:{node:a[c].find(e=>e.item.key===s),depth:c}}}function IE(e,n,r,i){return{contents:[...e?.querySelectorAll(`.column:not(.loading-column) > .column-content`)??[]],parentKeys:r===void 0?[]:[r,...EE(n)],keysAt:e=>(n[e]??[]).filter(n=>!i||i(n,e)).map(e=>e.item.key)}}function LE(e,n,r){let i={};return e.forEach((e,a)=>{let o=n[a];if(o===void 0||e.scrollTop===0&&e.scrollLeft===0)return;let s=[...e.querySelectorAll(`.item`)],c=r(a);i[o]=a_(e,s,e=>c[s.indexOf(e)])}),i}function RE(e,n,r,i){let a;for(let[o,s]of e){let c=r.indexOf(o),l=n[c];if(c<0||!l)continue;let u;if(s.anchor){let e=i(c).indexOf(s.anchor.key),n=e<0?void 0:l.querySelectorAll(`.item`)[e];u=n?o_(l,n,s.anchor.offset):!1}else u=s_(l,s.top);u&&(a??=new Map(e),a.delete(o))}return a??e}let zE=class extends n{constructor(...e){super(...e),this.headers=!1,this.stretchLastColumn=!1,this.interactionMode=`standard`,this.selectionFilter=`leaf`,this.exclusivity=`none`,this._columns=[],this._selectedByDepth=new Map,this._selectedKeys=new Set,this._selectedNodes=new Set,this.#n=new Map,this.#o=-1,this.#s=0,this.#c=0,this.restoreLoads=!0,this.#u=new f_(this,{kind:`miller-list`,capture:()=>this.getViewState()}),this.#f=k,this.#m=new Map,this.#h=!1,this.#g=[],this.search=new Vt(this,{adapter:Wt(this,{labelSelector:`.label`,highlightKey:`incr-search-highlight`})}),this.tickled=new oe(this,{getItems:()=>{let e=[];for(let n=0;n<this._columns.length;n++){let r=this._columns[n];if(r)for(let i of r)e.push({id:this.#x(i,n)})}return e}}),this.#w=e=>{this.#m.size===0&&e.target.classList?.contains(`column-content`)&&this.#u.notify()},this._partialKeys=new Set,this._partialDescription=_r,this.#N=`user`,this.#P=!1,this.#me=e=>{if(this.search.isOpen)return;let n=this.#ce(),r=this._columns[n];if(!r||r.length===0){let e=this._columns[0];e&&e.length>0&&(this.tickled.setTickled(this.#x(e[0],0)),this.requestUpdate());return}switch(e.key){case`ArrowDown`:e.preventDefault(),this.#pe(r,n,e,e=>Math.min(e+1,r.length-1));break;case`ArrowUp`:e.preventDefault(),this.#pe(r,n,e,e=>Math.max(e-1,0));break;case`Home`:e.preventDefault(),this.#pe(r,n,e,()=>0,!0);break;case`End`:e.preventDefault(),this.#pe(r,n,e,()=>r.length-1,!0);break;case`PageUp`:e.preventDefault(),this.#pe(r,n,e,e=>Math.max(e-this.#fe(n),0),!0);break;case`PageDown`:e.preventDefault(),this.#pe(r,n,e,e=>Math.min(e+this.#fe(n),r.length-1),!0);break;case`ArrowRight`:{e.preventDefault();let i=this.#le();if(!i){r.length>0&&(this.#de(r[0],n),this.requestUpdate());return}let{node:a,depth:o}=i;if(this.interactionMode===`vscode`||this.interactionMode===`standard`?(this._selectedByDepth.set(o,a),this.#re(a,o)):this.#ee(a,o),this._columns.length>o+1){let e=this._columns[o+1];e&&e.length>0&&this.#de(e[0],o+1)}this.requestUpdate();break}case`ArrowLeft`:if(e.preventDefault(),n>0){this.#Z(),this.#d=void 0,this._columns=this._columns.slice(0,n);let e=this._columns[n-1];if(e&&e.length>0){let r=this._selectedByDepth.get(n-1),i=r&&e.includes(r)?r:e[0];this.#de(i,n-1)}this.requestUpdate()}break;case`Enter`:{e.preventDefault();let n=this.#le();if(!n)return;let{node:i,depth:a,index:o}=n;if(this.interactionMode===`standard`||this.interactionMode===`vscode`){if(e.shiftKey&&this.#t?.depth===a){let e=Math.min(this.#t.index,o),n=Math.max(this.#t.index,o);this._selectedKeys=new Set(r.slice(e,n+1).map(e=>e.item.key))}else this._selectedKeys.add(i.item.key),this.#t={key:i.item.key,depth:a,index:o};this.#T()}else this._selectedByDepth.set(a,i);this.dispatchEvent(new CustomEvent(`activate`,{detail:{node:i,depth:a},bubbles:!0,composed:!0})),this.requestUpdate();break}case`Escape`:if(e.preventDefault(),this.#Z(),this._columns.length>1){this.#d=void 0,this._columns=this._columns.slice(0,-1);let e=Math.max(0,n-1),r=this._columns[e];if(r&&r.length>0){let n=this._selectedByDepth.get(e),i=n&&r.includes(n)?n:r[0];this.#de(i,e)}this.requestUpdate()}}},this.#he=(e,n)=>{e.preventDefault(),e.stopPropagation(),this.#o=n,this.#s=e.clientX;let r=this.shadowRoot?.querySelectorAll(`.column`)[n];this.#c=r?r.getBoundingClientRect().width:200,window.addEventListener(`pointermove`,this.#ve),window.addEventListener(`pointerup`,this.#be)},this.#ge=null,this.#_e=0,this.#ve=e=>{this.#o<0||(this.#_e=Math.max(32,this.#c+(e.clientX-this.#s)),this.#ge??=requestAnimationFrame(this.#ye))},this.#ye=()=>{this.#ge=null,!(this.#o<0)&&(this.shadowRoot?.querySelectorAll(`.column`)[this.#o])?.setAttribute(`style`,this.#Se(this.#_e))},this.#be=()=>{this.#ge!==null&&(cancelAnimationFrame(this.#ge),this.#ge=null),this.#o>=0&&this.#_e>0&&(this.#n.set(this.#o,this.#_e),this.#u.notify(),this.requestUpdate()),this.#_e=0,this.#o=-1,window.removeEventListener(`pointermove`,this.#ve),window.removeEventListener(`pointerup`,this.#be)}}#e;#t;#n;#r;#i;#a;#o;#s;#c;#l;#u;#d;#f;#p;#m;#h;#g;#_;#v;get registry(){return this.#_}#y(){let e=this.searchModes?.trim();if(e===void 0)return[...O];let n=new Set(e.split(/\s+/));return O.filter(e=>n.has(e))}#b(){this.#_&&(this.search.setModes(this.#y()),this.#v?.(),this.#v=zt(this.#_,this.search))}#x(e,n){return`${n}:${e.item.key}`}get#S(){return this.viewRoot??this.root}#C(){let e=this.tickled.tickledId;if(!e)return;let n=e.indexOf(`:`);if(!(n<0))return Number(e.substring(0,n))}willUpdate(e){kE(this._columns,this.#g)||(this.#g=this._columns,this.#u.notify())}updated(e){if(e.has(`searchModes`)&&this.#b(),e.has(`root`)&&this.root){let e=this.viewRoot!==void 0,n=e?[]:EE(this._columns),r=this.#O();this.#Z(),e&&(this.viewRoot=void 0,this._selectedKeys=new Set,this._selectedNodes=new Set),this._selectedByDepth.clear(),this.#e=void 0,this.#t=void 0,this.tickled.clearTickled();let i=this.#S;this._columns=i?.children?[i.children]:[],this.#g=this._columns,n.length>0&&(this.#d??=n),r!==void 0&&(this.#p??=r),this.#A()}if(e.has(`viewRoot`)&&this.#L(),e.has(`model`)){this.#l?.(),this.#l=void 0;let e=this.model;e&&(this.root=e.root,this.#l=e._subscribe(e=>{if(e.type===`root`)this.root=e.root,this.requestUpdate();else if(e.type===`invalidate`){for(let n=0;n<this._columns.length-1;n++)if(this._columns[n]?.some(n=>n.item.key===e.key)){this._columns=this._columns.slice(0,n+1),this.requestUpdate();break}}}))}if(this.#r?.children!==void 0&&this._loadingDepth!==void 0){let e=this._loadingDepth,n=this.#r.children;this.#r=void 0,this.#i=void 0,this._loadingDepth=void 0;let r=this._columns.slice(0,e);n.length>0&&r.push(n),this._columns=r,this.#E()&&this.#A()}if(this.#m.size>0){let{contents:e,parentKeys:n,keysAt:r}=this.#k();this.#m=RE(this.#m,e,n,r)}let n=e.get(`_columns`),r=e.has(`_columns`)&&(n?.length??0)<this._columns.length,i=e.has(`_loadingDepth`)&&this._loadingDepth!==void 0;if(r||i){let e=this.shadowRoot?.querySelector(`#container`);e?.scrollTo({left:e.scrollWidth,behavior:`smooth`})}}firstUpdated(){let e=this.shadowRoot?.querySelector(`#container`);e&&u_(e,()=>{this.#m=new Map}),this.renderRoot.addEventListener(`scroll`,this.#w,{capture:!0,passive:!0})}#w;connectedCallback(){super.connectedCallback(),this.#_??=Yt(),this.#b()}disconnectedCallback(){super.disconnectedCallback(),this.#l?.(),this.#l=void 0,this.#v?.(),this.#v=void 0,this.#_=void 0}getViewState(e){let n=e?.includePending??!0,{contents:r,parentKeys:i,keysAt:a}=this.#k();return this.#u.shape({selected:fr(this._selectedKeys,n?this.#f:[]),path:(n?this.#d:void 0)??EE(this._columns),focus:this.#O()??(n?this.#p:void 0),columnWidths:Object.fromEntries(this.#n),columnScroll:{...LE(r,i,a),...n?Object.fromEntries(this.#m):{}}},e)}setViewState(e){this.#u.accepts(e)&&(this.#u.restoring(()=>{if(e.path&&(this.#d=[...e.path]),e.selected){this.#f=sr(new Set(e.selected));let n=new Set(this._selectedNodes);this._selectedKeys=new Set,this._selectedNodes=new Set,this.#e=void 0,this.#t=void 0,n.size>0&&this.#q(n)}e.focus!==void 0&&(this.#p=e.focus),e.columnWidths&&(this.#n=OE(e.columnWidths),this.#u.notify()),e.columnScroll&&(this.#m=new Map(Object.entries(e.columnScroll))),this.#A()}),this.requestUpdate())}clearPendingViewState(){this.#d=void 0,this.#f=k,this.#p=void 0,this.#m=new Map}#T(){this.#u.isRestoring||(this.#f=k),this.#u.notify()}#E(){return this.#d!==void 0||this.#f.size>0||this.#p!==void 0}#D(){let e=this.tickled.tickledId,n=e?.indexOf(`:`)??-1;return e===void 0||n<0?void 0:e.substring(n+1)}#O(){return this.#h?this.#D():void 0}#k(){return IE(this.shadowRoot,this._columns,this.#S?.item.key,this.filterPredicate)}#A(){let e=this.#S?.children;if(!e)return;let n=jE(e);this.#u.restoring(()=>{this.#d&&this.#j(NE(e,this.#d,this._columns,this._selectedByDepth,this.#r));let r=PE(this._selectedKeys,this.#f,this._selectedNodes,this.#e,n,this._columns,this.interactionMode===`implicit`);r&&this.#M(r);let i=FE(this.#D(),this.#h,this.#p,n,this._columns);i.clear&&this.tickled.clearTickled(),this.#p=i.pending,i.tickle&&(this.tickled.setTickled(this.#x(i.tickle.node,i.tickle.depth)),this.#h=!0,this.#u.notify())})}#j(e){e.columns&&(this.#r&&this.#Z(),this._columns=e.columns,this._selectedByDepth=e.selectedByDepth),this.#d=e.pending,e.load&&this.restoreLoads&&(this.model||this.loadChildren)&&this.#ie(e.load.node,e.load.depth,!0,!0),kE(this._columns,this.#g)||(this.#g=this._columns,this.#u.notify())}#M(e){let n=this._selectedNodes;if(this._selectedKeys=e.keys,this._selectedNodes=e.nodes,this.#f=e.pending,this.#e=e.last,this.interactionMode===`implicit`)for(let[n,r]of e.placed)this._selectedByDepth.set(n,r);if(!e.restored){this.#u.notify();return}let r=this.#N;this.#N=`programmatic`;try{this.#q(n)}finally{this.#N=r}}get selectedKeys(){return this._selectedKeys}set selectedKeys(e){this._selectedKeys=new Set(e),this.#T(),this.requestUpdate()}get selectedNode(){return this.#e}set selectedNode(e){this.#e=e,e&&(this.interactionMode===`implicit`||this.interactionMode===`standard`)&&(this._selectedKeys=new Set([e.item.key]),this.#T()),this.requestUpdate()}get selectedNodes(){return this._selectedNodes}select(e){if(!this.#K(e))return;let n=new Set(this._selectedNodes);this._selectedNodes.add(e),this._selectedKeys.add(e.item.key),this.#e=e,this.#q(n),this.requestUpdate()}deselect(e){if(!this._selectedNodes.has(e))return;let n=new Set(this._selectedNodes);this._selectedNodes.delete(e),this._selectedKeys.delete(e.item.key),this.#e===e&&(this.#e=[...this._selectedNodes].at(-1)),this.#q(n),this.requestUpdate()}clearSelection(){this.#T();let e=new Set(this._selectedNodes);this._selectedKeys=new Set,this._selectedNodes.clear(),this.#e=void 0,e.size>0&&this.#q(e),this.requestUpdate()}selectAll(){}get partialKeys(){return this._partialKeys}set partialKeys(e){let n=new Set(e);yr(n,this._partialKeys)||(this._partialKeys=n)}_isPartial(e,n){return vr(e.item.key,this._partialKeys,this._isSelected(e,n))}deselectAll(){}setSelected(e,n){this.interactionMode===`checked`?this.#se(e,n):n?(this._selectedKeys.add(e.item.key),this._selectedNodes.add(e)):(this._selectedKeys.delete(e.item.key),this._selectedNodes.delete(e)),this.#T(),this.requestUpdate()}getSelected(){let e=[];for(let n of this._columns)for(let r of n)this._selectedKeys.has(r.item.key)&&e.push(r);return e}navigateTo(e,n={}){let r=this.#S;if(!r?.children)return!1;let i=this.#N,a=this.#P;this.#N=`programmatic`,this.#P=n.silent===!0;try{return this.#F(r.children,e,n.reveal??`edge`)}finally{this.#N=i,this.#P=a}}invalidateStructure(){let e=EE(this._columns);e.length>0&&(this.#d??=e),this.#A(),this.requestUpdate()}#N;#P;#F(e,n,r){this.#Z(),this.#d=void 0,this._selectedByDepth.clear(),this.tickled.clearTickled();let i=[e],a=e,o=!0,s,c=0;for(let e=0;e<n.length;e++){let r=a.findIndex(r=>r.item.key===n[e]);if(r<0){o=!1;break}let l=a[r];if(this._selectedByDepth.set(e,l),s=l,c=e,l.item.isLeaf||!l.children||l.children.length===0){e<n.length-1&&(o=!1);break}i.push(l.children),a=l.children}if(this._columns=i,s&&this.tickled.setTickled(this.#x(s,c)),this.interactionMode!==`implicit`&&this.interactionMode!==`manual`){let e=n.at(-1);e&&(this._selectedKeys=new Set([e]),this.#T())}return this.requestUpdate(),this.#ue(r===`center-if-hidden`?`auto`:`smooth`,r),o}navigateToNode(e){let n=this.#S;if(!n?.children)return!1;let r=this.#I(n.children,e);return r?this.navigateTo(r):!1}revealKey(e){let n=this.#S;if(!n?.children)return!1;let r=this.#I(n.children,n=>n.item.key===e);if(!r)return!1;this.#d=void 0;let i=[n.children],a=n.children,o,s=0;for(let e=0;e<r.length;e++){let n=a.find(n=>n.item.key===r[e]);if(!n)return!1;if(o=n,s=e,n.children&&n.children.length>0)i.push(n.children),a=n.children;else break}return this._columns=i,o&&this.tickled.setTickled(this.#x(o,s)),this.requestUpdate(),this.#ue(),!0}selectMany(e){let n=this.selectionFilter===`none`?[]:[...e],r=new Set(this._selectedNodes);this._selectedNodes=new Set(n),this._selectedKeys=new Set(n.map(e=>e.item.key)),this.#e=n.at(-1),this.#q(r),this.requestUpdate()}getNodes(){let e=this.#S;if(!e?.children)return[];let n=[],r=(e,i)=>{if(n.push({node:e,depth:i}),e.children)for(let n of e.children)r(n,i+1)};for(let n of e.children)r(n,0);return n}#I(e,n,r=[]){for(let i of e){let e=[...r,i.item.key];if(n(i))return e;if(i.children?.length){let r=this.#I(i.children,n,e);if(r)return r}}}#L(){this.#Z();let e=new Set(this._selectedNodes);this._selectedByDepth.clear(),this._selectedKeys=new Set,this._selectedNodes.clear(),this.#e=void 0,this.#t=void 0,this.tickled.clearTickled();let n=this.#S;n?.children===void 0?n?(this._columns=[],this.#ie(n,-1,!1)):(this._columns=[],this._loadingDepth=void 0):(this._columns=n.children?[n.children]:[],this._loadingDepth=void 0),e.size>0&&this.#q(e),this.#E()&&this.#A()}rebaseTo(e){if(e===void 0)return this.#R();let n=typeof e==`string`?this.#B(e):e;return!n||n.item.isLeaf===!0||n===this.viewRoot||n.item.key===this.viewRoot?.item.key?!1:n===this.root||!this.viewRoot&&n.item.key===this.root?.item.key?this.#R():(this.viewRoot=n,this.#z(),!0)}rebaseUp(){if(!this.viewRoot)return!1;let e=this.#H(this.viewRoot);return e?e===this.root?this.#R():(this.viewRoot=e,this.#z(),!0):!1}#R(){return this.viewRoot!==void 0&&(this.viewRoot=void 0,this.#z(),!0)}#z(){this.#d=void 0;let e=this.viewRoot,n={viewRoot:e,path:e?this.#W(e):[]};this.dispatchEvent(new CustomEvent(`rebase`,{detail:n,bubbles:!0,composed:!0}))}#B(e){if(this.root)return this.root.item.key===e?this.root:this.#V(this.root.children??[],e)}#V(e,n){for(let r of e){if(r.item.key===n)return r;if(r.children){let e=this.#V(r.children,n);if(e)return e}}}#H(e){if(!(!this.root||e===this.root))return this.#U(this.root,e)}#U(e,n){if(e.children)for(let r of e.children){if(r===n||r.item.key===n.item.key)return e;let i=this.#U(r,n);if(i)return i}}#W(e){let n=[e],r=this.#H(e);for(;r&&(n.unshift(r),r!==this.root);)r=this.#H(r);return n}renderColumnContent(e,n){return console.warn(`ixfx-miller-base: renderColumnContent not overridden. depth=${n}, nodes=${e.length}`),a}_handleItemClick(e,n,r){this.#ee(e,n,r)}_handleCheckboxClick(e,n,r){e.stopPropagation(),this.#ae(n)}_handleItemDblClick(e,n,r){this.dispatchEvent(new CustomEvent(`item-dblclick`,{detail:{node:e,depth:n},bubbles:!0,composed:!0}))}_handleItemRightClick(e,n,r){this.dispatchEvent(new CustomEvent(`item-rightclick`,{detail:{node:e,depth:n,mouseEvent:r},bubbles:!0,composed:!0}))}_handleHeaderRightClick(e,n){let r=this.#xe(n),i=this.#Q(n);this.dispatchEvent(new CustomEvent(`header-rightclick`,{detail:{depth:n,label:r,path:i,mouseEvent:e},bubbles:!0,composed:!0}))}_isSelected(e,n){return this.interactionMode===`implicit`?this._selectedByDepth.get(n)===e:this._selectedKeys.has(e.item.key)}#G(e,n){let r=this._columns[n+1];return r!==void 0&&e.children===r}_isOpen(e,n){return this.#G(e,n)}getItemState(e,n){let r=this._columns[n]?.find(n=>n.item.key===e);if(r)return{selected:this._isSelected(r,n),open:this.#G(r,n),focused:this._isFocused(r,n),isLeaf:r.item.isLeaf??!1}}#K(e){return this.selectionFilter===`none`?!1:this.selectionFilter===`leaf`?e.item.isLeaf!==!1:this.selectionFilter!==`branch`||e.item.isLeaf===!1||e.children!==void 0&&e.children.length>0}#q(e){if(this.#T(),this.#P)return;let n={selected:new Set(this._selectedNodes),previous:e,origin:this.#N};this.dispatchEvent(new CustomEvent(`select`,{detail:n,bubbles:!0,composed:!0})),this.dispatchEvent(new CustomEvent(`list-select`,{detail:{selectedKeys:new Set(this._selectedKeys),previousKeys:new Set([...e].map(e=>e.item.key)),previous:e},bubbles:!0,composed:!0}))}#J(e){return!this.dispatchEvent(new CustomEvent(`list-select-intent`,{detail:e,bubbles:!0,composed:!0,cancelable:!0}))}#Y(e,n,r){if(!(!this.#t||this.#t.depth!==n||!e||r<0))return e.slice(Math.min(this.#t.index,r),Math.max(this.#t.index,r)+1)}#X(e,n,r,i){let a=e.item.key;if(r&&(r.metaKey||r.ctrlKey)){this.#J({kind:`toggle`,keys:[a],source:i});return}let o=this._columns[n],s=r?.shiftKey?this.#Y(o,n,o?o.indexOf(e):-1):void 0;if(s&&this.#t){this.#J({kind:`extend`,keys:s.map(e=>e.item.key),anchorKey:this.#t.key,targetKey:a,source:i});return}this.#J({kind:`replace`,keys:[a],source:i})}#Z(){if(this.#a!==void 0&&(clearTimeout(this.#a),this.#a=void 0),this.#i){let e=this.#r,n=this._loadingDepth;this.#i.abort(),this.#i=void 0,this.#r=void 0,this._loadingDepth=void 0,e&&n!==void 0&&this.dispatchEvent(new CustomEvent(`collapse`,{detail:{node:e,depth:n},bubbles:!0,composed:!0}))}}#Q(e){let n=[];this.#S&&n.push(this.#S);for(let r=0;r<e;r++){let e=this._selectedByDepth.get(r);e&&n.push(e)}return n}#$(e){let n={depth:e,label:this.#xe(e),path:this.#Q(e)};this.dispatchEvent(new CustomEvent(`header-click`,{detail:n,bubbles:!0,composed:!0}))}#ee(e,n,r){switch(this._loadingDepth!==void 0&&this._loadingDepth>n&&this.#Z(),this.tickled.setTickled(this.#x(e,n)),this.#h=!1,this.#p=void 0,this.dispatchEvent(new CustomEvent(`item-click`,{detail:{node:e,depth:n},bubbles:!0,composed:!0})),this.interactionMode){case`implicit`:this.#te(e,n);break;case`standard`:this.#ne(e,n,r);break;case`vscode`:this.#ne(e,n,r);break;case`manual`:this.#X(e,n,r,`pointer`);break;case`checked`:this.#re(e,n,!0)}}#te(e,n){if(this.#J({kind:`replace`,keys:[e.item.key],source:`pointer`})){this.#e=e,this.#re(e,n,!0);return}let r=new Set(this._selectedNodes);this._selectedByDepth.set(n,e),this.#e=e,this._selectedKeys=new Set([e.item.key]),this._selectedNodes.clear(),this._selectedNodes.add(e),this.#re(e,n,!0),r.has(e)||this.#q(r)}#ne(e,n,r){let i=this._columns[n],a=i?i.indexOf(e):-1,o=r?r.metaKey||r.ctrlKey:!1,s=r?r.shiftKey:!1;if(o){if(this.#J({kind:`toggle`,keys:[e.item.key],source:`pointer`})){this.#t=a>=0?{key:e.item.key,depth:n,index:a}:this.#t;return}this._selectedKeys.has(e.item.key)?(this._selectedKeys.delete(e.item.key),this._selectedNodes.delete(e)):(this._selectedKeys.add(e.item.key),this._selectedNodes.add(e)),this.#t=a>=0?{key:e.item.key,depth:n,index:a}:this.#t,this.#T(),this.requestUpdate();return}if(s&&this.#t&&this.#t.depth===n&&i){let r=this.#Y(i,n,a)??[];if(this.#J({kind:`extend`,keys:r.map(e=>e.item.key),anchorKey:this.#t.key,targetKey:e.item.key,source:`pointer`}))return;this._selectedKeys=new Set(r.map(e=>e.item.key)),this._selectedNodes=new Set(r),this.#T(),this.requestUpdate();return}let c=this.#J({kind:`replace`,keys:[e.item.key],source:`pointer`}),l=new Set(this._selectedNodes);if(this.#t=a>=0?{key:e.item.key,depth:n,index:a}:void 0,c){this.#e=e,this.#re(e,n,!0);return}this._selectedKeys=new Set([e.item.key]),this._selectedNodes=new Set([e]),this._selectedByDepth.set(n,e),this.#e=e,this.#re(e,n,!0),(!l.has(e)||l.size!==1)&&this.#q(l)}#re(e,n,r=!1){if(this.#d=void 0,e.item.isLeaf){this._columns=this._columns.slice(0,n+1),this.requestUpdate();return}if(e.children===void 0)this.#ie(e,n,!0,r);else{let r=this._columns.slice(0,n+1);r.push(e.children),this._columns=r,this.dispatchEvent(new CustomEvent(`expand`,{detail:{node:e,depth:n},bubbles:!0,composed:!0}))}}#ie(e,n,r,i=!1){let a=n+1;this._columns=this._columns.slice(0,a),this._loadingDepth=a,this.#i?.abort(),this.#r=e;let o=new AbortController;this.#i=o,r&&this.dispatchEvent(new CustomEvent(`expand`,{detail:{node:e,depth:n},bubbles:!0,composed:!0}));let s=n=>{if(o.signal.aborted)return;e.children=n,this.#r=void 0,this.#i=void 0,this._loadingDepth=void 0;let r=this._columns.slice(0,a);n.length>0&&r.push(n),this._columns=r,this.#E()&&this.#A()},c=n=>{n.name!==`AbortError`&&console.error(n),e.children=[],this.#r=void 0,this.#i=void 0,this._loadingDepth=void 0,this.#E()&&this.#A(),this.requestUpdate()};if(this.model||this.loadChildren){this.#a!==void 0&&(clearTimeout(this.#a),this.#a=void 0);let n=()=>{this.#a=void 0,this.#r===e&&(this.model?this.model.getChildren(e,a-1,o.signal):Rg(this.loadChildren({node:e,depth:a-1},o.signal),o.signal)).then(e=>s([...e])).catch(c)};i?n():this.#a=setTimeout(n,150)}else{this._loadingDepth=void 0,this.#r=void 0,this.#i=void 0;let e=this._columns.slice(0,a);e.push([]),this._columns=e}}#ae(e){if(this.#J({kind:`toggle`,keys:[e.item.key],source:`pointer`}))return;let n=new Set(this._selectedNodes),r=this._selectedKeys.has(e.item.key);(e.children?.length?this.#oe(e):r)?this.#se(e,!1):this.#se(e,!0),this.requestUpdate(),this.#q(n)}#oe(e){return this._selectedKeys.has(e.item.key)?!e.children?.length||e.children.every(e=>this.#oe(e)):!1}#se(e,n){if(n?(this._selectedKeys.add(e.item.key),this._selectedNodes.add(e)):(this._selectedKeys.delete(e.item.key),this._selectedNodes.delete(e)),e.children)for(let r of e.children)this.#se(r,n)}#ce(){return this.#C()??0}#le(){let e=this.tickled.tickledId;if(!e)return;let n=e.indexOf(`:`);if(n<0)return;let r=Number(e.substring(0,n)),i=e.substring(n+1),a=this._columns[r];if(!a)return;let o=a.findIndex(e=>e.item.key===i);if(!(o<0))return{node:a[o],depth:r,index:o}}#ue(e=`smooth`,n=`edge`){requestAnimationFrame(()=>{let r=this.#le();if(!r)return;let i=this.shadowRoot?.querySelectorAll(`.column`)[r.depth]?.querySelector(`.column-content`);if(!i)return;let a=i.querySelectorAll(`.item`)[r.index];if(a){if(n===`center-if-hidden`){let n=a.getBoundingClientRect(),r=i.getBoundingClientRect(),o=n.top<r.top||n.bottom>r.bottom;a.scrollIntoView({block:o?`center`:`nearest`,inline:`nearest`,behavior:e});return}a.scrollIntoView({block:`nearest`,behavior:e})}})}#de(e,n){this.tickled.setTickled(this.#x(e,n)),this.#h=!0,this.#p=void 0,this.#u.notify(),this.dispatchEvent(new CustomEvent(`tickle`,{detail:{node:e,depth:n},bubbles:!0,composed:!0}))}#fe(e){let n=this.shadowRoot?.querySelectorAll(`.column`)[e]?.querySelector(`.column-content`),r=n?.querySelector(`.item`);return!n||!r||r.offsetHeight===0?10:Math.max(1,Math.floor(n.clientHeight/r.offsetHeight)-1)}#pe(e,n,r,i,a=!1){let o=this.#le(),s=i(o!==void 0&&o.depth===n?o.index:-1),c=e[s];if(c){if(this.#de(c,n),this.interactionMode===`standard`||this.interactionMode===`vscode`){let i=o?.index??0;if(r.shiftKey){if(!this.#t||this.#t.depth!==n){let r=e[i];r&&(this.#t={key:r.item.key,depth:n,index:i,selectionSnapshot:this.interactionMode===`vscode`?new Set(this._selectedKeys):void 0})}if(this.#t){let n=Math.min(this.#t.index,s),r=Math.max(this.#t.index,s),i=e.slice(n,r+1).map(e=>e.item.key);if(!this.#J({kind:`extend`,keys:i,anchorKey:this.#t.key,targetKey:c.item.key,source:`keyboard`})){if(this.interactionMode===`vscode`){let e=this.#t.selectionSnapshot;for(let n of i)e.has(n)?this._selectedKeys.delete(n):this._selectedKeys.add(n)}else this._selectedKeys=new Set(i)}this.#T()}}else this.#t=this.interactionMode===`standard`?{key:c.item.key,depth:n,index:s}:void 0}this.requestUpdate(),a&&this.#ue(`auto`)}}#me;#he;#ge;#_e;#ve;#ye;#be;#xe(e){if(e===0)return this.#S?.item.label??``;let n=this._selectedByDepth.get(e-1);if(n)return n.item.label;let r=this._columns[e-1],i=this._columns[e];if(r&&i){let e=r.find(e=>e.children===i);if(e)return e.item.label}return``}#Se(e){return`width:${e}px;flex-grow:0;flex-shrink:0;flex-basis:auto;max-width:none`}#Ce(e,n){let r=this.#n.get(e);return r===void 0?this.stretchLastColumn&&n?`width:max-content;flex-grow:1;flex-shrink:0;flex-basis:auto;min-width:0`:`width:max-content;flex-grow:0;flex-shrink:0;flex-basis:auto`:this.#Se(r)}#we(e,n){return this.tickled.isTickled(this.#x(e,n))}renderLoadingIndicator(){return i`<div class="loading-spinner"></div>`}#Te(){let e=this._loadingDepth,n=this.stretchLastColumn&&this.#n.get(e)===void 0;return i`
10168
+ `}};E([d({type:Number})],TE.prototype,`value`,void 0),E([d({type:Boolean,attribute:`lit`,reflect:!0})],TE.prototype,`lit`,void 0),E([d({type:String})],TE.prototype,`color`,void 0),E([d({type:Boolean,attribute:`glow`,reflect:!0})],TE.prototype,`glow`,void 0),E([d({type:String,reflect:!0})],TE.prototype,`mode`,void 0),E([d({type:Boolean,attribute:`blinking`,reflect:!0})],TE.prototype,`blinking`,void 0),E([d({type:Number,attribute:`rate`})],TE.prototype,`rate`,void 0),E([d({type:Number,attribute:`attack-time`})],TE.prototype,`attackTime`,void 0),E([d({type:Number,attribute:`release-time`})],TE.prototype,`releaseTime`,void 0),E([d({type:Boolean,attribute:`pulse-retrigger`})],TE.prototype,`pulseRetrigger`,void 0),TE=E([T(`ixfx-led`)],TE);function EE(e){let n=[];for(let r=0;r<e.length-1;r++){let i=e[r+1],a=e[r].find(e=>e.children===i);if(!a)break;n.push(a.item.key)}return n}function DE(e,n){let r=[e],i=[],a=e;for(let e of n){let n=a.find(n=>n.item.key===e);if(!n)return{columns:r,nodes:i,blocked:void 0,done:!1};if(i.push(n),n.item.isLeaf===!0)return{columns:r,nodes:i,blocked:void 0,done:!0};if(n.children===void 0)return{columns:r,nodes:i,blocked:n,done:!1};r.push(n.children),a=n.children}return{columns:r,nodes:i,blocked:void 0,done:!0}}function OE(e){let n=new Map;for(let[r,i]of Object.entries(e)){let e=Number(r);Number.isInteger(e)&&e>=0&&typeof i==`number`&&Number.isFinite(i)&&i>0&&n.set(e,i)}return n}function kE(e,n){return e.length===n.length&&e.every((e,r)=>e===n[r])}function AE(e,n){return e.findIndex(e=>e.some(e=>e.item.key===n))}function jE(e){let n=new Map,r=[...e];for(;r.length>0;){let e=r.pop();n.set(e.item.key,e),e.children&&r.push(...e.children)}return n}function ME(e,n,r,i){let a=[...e].filter(e=>!r(e)),{present:o,missing:s}=ar(n,r);if(a.length===0&&o.length===0)return{live:e,pending:n,restored:[],changed:!1};if(i&&o.length>0){let e=o.at(-1);return{live:new Set([e]),pending:k,restored:[e],changed:!0}}return{live:new Set([...[...e].filter(r),...o]),pending:sr(a.length===0?s:new Set([...s,...a])),restored:o,changed:!0}}function NE(e,n,r,i,a){let o=DE(e,n),s=o.blocked!==void 0&&o.blocked===a,c=!s&&!kE(o.columns,r),l;if(c){l=new Map(o.nodes.map((e,n)=>[n,e]));let e=i.get(o.nodes.length);e&&o.columns[o.nodes.length]?.includes(e)&&l.set(o.nodes.length,e)}return{columns:c?o.columns:void 0,selectedByDepth:l,pending:o.done?void 0:n,load:o.blocked&&!s&&o.blocked.item.isLeaf!==!0?{node:o.blocked,depth:o.nodes.length-1}:void 0}}function PE(e,n,r,i,a,o,s){let c=ME(e,n,e=>a.has(e),s),l=[...c.live].map(e=>a.get(e));if(!c.changed&&l.length===r.size&&l.every(e=>r.has(e)))return;let u=c.restored.at(-1)??i?.item.key,d=[];for(let e of c.restored){let n=AE(o,e);n>=0&&d.push([n,a.get(e)])}return{keys:new Set(c.live),nodes:new Set(l),pending:c.pending,last:(u===void 0?void 0:a.get(u))??l.at(-1),placed:d,restored:c.restored.length>0}}function FE(e,n,r,i,a){let o=e!==void 0&&!i.has(e),s=r??(o&&n?e:void 0),c=s===void 0?-1:AE(a,s);return c<0?{clear:o,pending:s,tickle:void 0}:{clear:o,pending:void 0,tickle:{node:a[c].find(e=>e.item.key===s),depth:c}}}function IE(e,n,r,i){return{contents:[...e?.querySelectorAll(`.column:not(.loading-column) > .column-content`)??[]],parentKeys:r===void 0?[]:[r,...EE(n)],keysAt:e=>(n[e]??[]).filter(n=>!i||i(n,e)).map(e=>e.item.key)}}function LE(e,n,r){let i={};return e.forEach((e,a)=>{let o=n[a];if(o===void 0||e.scrollTop===0&&e.scrollLeft===0)return;let s=[...e.querySelectorAll(`.item`)],c=r(a);i[o]=a_(e,s,e=>c[s.indexOf(e)])}),i}function RE(e,n,r,i){let a;for(let[o,s]of e){let c=r.indexOf(o),l=n[c];if(c<0||!l)continue;let u;if(s.anchor){let e=i(c).indexOf(s.anchor.key),n=e<0?void 0:l.querySelectorAll(`.item`)[e];u=n?o_(l,n,s.anchor.offset):!1}else u=s_(l,s.top);u&&(a??=new Map(e),a.delete(o))}return a??e}let zE=class extends n{constructor(...e){super(...e),this.headers=!1,this.stretchLastColumn=!1,this.interactionMode=`standard`,this.selectionFilter=`leaf`,this.exclusivity=`none`,this._columns=[],this._selectedByDepth=new Map,this._selectedKeys=new Set,this._selectedNodes=new Set,this.#n=new Map,this.#o=-1,this.#s=0,this.#c=0,this.restoreLoads=!0,this.#u=new f_(this,{kind:`miller-list`,capture:()=>this.getViewState()}),this.#f=k,this.#m=new Map,this.#h=!1,this.#g=[],this.search=new Vt(this,{adapter:Wt(this,{labelSelector:`.label`,highlightKey:`incr-search-highlight`})}),this.tickled=new oe(this,{getItems:()=>{let e=[];for(let n=0;n<this._columns.length;n++){let r=this._columns[n];if(r)for(let i of r)e.push({id:this.#x(i,n)})}return e}}),this.#w=e=>{this.#m.size===0&&e.target.classList?.contains(`column-content`)&&this.#u.notify()},this._partialKeys=new Set,this._partialDescription=_r,this.#N=`user`,this.#P=!1,this.#me=e=>{if(this.search.isOpen)return;let n=this.#ce(),r=this._columns[n];if(!r||r.length===0){let e=this._columns[0];e&&e.length>0&&(this.tickled.setTickled(this.#x(e[0],0)),this.requestUpdate());return}switch(e.key){case`ArrowDown`:e.preventDefault(),this.#pe(r,n,e,e=>Math.min(e+1,r.length-1));break;case`ArrowUp`:e.preventDefault(),this.#pe(r,n,e,e=>Math.max(e-1,0));break;case`Home`:e.preventDefault(),this.#pe(r,n,e,()=>0,!0);break;case`End`:e.preventDefault(),this.#pe(r,n,e,()=>r.length-1,!0);break;case`PageUp`:e.preventDefault(),this.#pe(r,n,e,e=>Math.max(e-this.#fe(n),0),!0);break;case`PageDown`:e.preventDefault(),this.#pe(r,n,e,e=>Math.min(e+this.#fe(n),r.length-1),!0);break;case`ArrowRight`:{e.preventDefault();let i=this.#le();if(!i){r.length>0&&(this.#de(r[0],n),this.requestUpdate());return}let{node:a,depth:o}=i;if(this.interactionMode===`vscode`||this.interactionMode===`standard`?(this._selectedByDepth.set(o,a),this.#re(a,o)):this.#ee(a,o),this._columns.length>o+1){let e=this._columns[o+1];e&&e.length>0&&this.#de(e[0],o+1)}this.requestUpdate();break}case`ArrowLeft`:if(e.preventDefault(),n>0){this.#Z(),this.#d=void 0,this._columns=this._columns.slice(0,n);let e=this._columns[n-1];if(e&&e.length>0){let r=this._selectedByDepth.get(n-1),i=r&&e.includes(r)?r:e[0];this.#de(i,n-1)}this.requestUpdate()}break;case`Enter`:{e.preventDefault();let n=this.#le();if(!n)return;let{node:i,depth:a,index:o}=n;if(this.interactionMode===`standard`||this.interactionMode===`vscode`){if(e.shiftKey&&this.#t?.depth===a){let e=Math.min(this.#t.index,o),n=Math.max(this.#t.index,o);this._selectedKeys=new Set(r.slice(e,n+1).map(e=>e.item.key))}else this._selectedKeys.add(i.item.key),this.#t={key:i.item.key,depth:a,index:o};this.#T()}else this._selectedByDepth.set(a,i);this.dispatchEvent(new CustomEvent(`activate`,{detail:{node:i,depth:a},bubbles:!0,composed:!0})),this.requestUpdate();break}case`Escape`:if(e.preventDefault(),this.#Z(),this._columns.length>1){this.#d=void 0,this._columns=this._columns.slice(0,-1);let e=Math.max(0,n-1),r=this._columns[e];if(r&&r.length>0){let n=this._selectedByDepth.get(e),i=n&&r.includes(n)?n:r[0];this.#de(i,e)}this.requestUpdate()}}},this.#he=(e,n)=>{e.preventDefault(),e.stopPropagation(),this.#o=n,this.#s=e.clientX;let r=this.shadowRoot?.querySelectorAll(`.column`)[n];this.#c=r?r.getBoundingClientRect().width:200,window.addEventListener(`pointermove`,this.#ve),window.addEventListener(`pointerup`,this.#be)},this.#ge=null,this.#_e=0,this.#ve=e=>{this.#o<0||(this.#_e=Math.max(32,this.#c+(e.clientX-this.#s)),this.#ge??=requestAnimationFrame(this.#ye))},this.#ye=()=>{this.#ge=null,!(this.#o<0)&&(this.shadowRoot?.querySelectorAll(`.column`)[this.#o])?.setAttribute(`style`,this.#Se(this.#_e))},this.#be=()=>{this.#ge!==null&&(cancelAnimationFrame(this.#ge),this.#ge=null),this.#o>=0&&this.#_e>0&&(this.#n.set(this.#o,this.#_e),this.#u.notify(),this.requestUpdate()),this.#_e=0,this.#o=-1,window.removeEventListener(`pointermove`,this.#ve),window.removeEventListener(`pointerup`,this.#be)}}#e;#t;#n;#r;#i;#a;#o;#s;#c;#l;#u;#d;#f;#p;#m;#h;#g;#_;#v;get registry(){return this.#_}#y(){let e=this.searchModes?.trim();if(e===void 0)return[...O];let n=new Set(e.split(/\s+/));return O.filter(e=>n.has(e))}#b(){this.#_&&(this.search.setModes(this.#y()),this.#v?.(),this.#v=zt(this.#_,this.search))}#x(e,n){return`${n}:${e.item.key}`}get#S(){return this.viewRoot??this.root}#C(){let e=this.tickled.tickledId;if(!e)return;let n=e.indexOf(`:`);if(!(n<0))return Number(e.substring(0,n))}willUpdate(e){kE(this._columns,this.#g)||(this.#g=this._columns,this.#u.notify())}updated(e){if(e.has(`searchModes`)&&this.#b(),e.has(`root`)&&this.root){let e=this.viewRoot!==void 0,n=e?[]:EE(this._columns),r=this.#O();this.#Z(),e&&(this.viewRoot=void 0,this._selectedKeys=new Set,this._selectedNodes=new Set),this._selectedByDepth.clear(),this.#e=void 0,this.#t=void 0,this.tickled.clearTickled();let i=this.#S;this._columns=i?.children?[i.children]:[],this.#g=this._columns,n.length>0&&(this.#d??=n),r!==void 0&&(this.#p??=r),this.#A()}if(e.has(`viewRoot`)&&this.#L(),e.has(`model`)){this.#l?.(),this.#l=void 0;let e=this.model;e&&(this.root=e.root,this.#l=e._subscribe(e=>{if(e.type===`root`)this.root=e.root,this.requestUpdate();else if(e.type===`invalidate`){for(let n=0;n<this._columns.length-1;n++)if(this._columns[n]?.some(n=>n.item.key===e.key)){this._columns=this._columns.slice(0,n+1),this.requestUpdate();break}}}))}if(this.#r?.children!==void 0&&this._loadingDepth!==void 0){let e=this._loadingDepth,n=this.#r.children;this.#r=void 0,this.#i=void 0,this._loadingDepth=void 0;let r=this._columns.slice(0,e);n.length>0&&r.push(n),this._columns=r,this.#E()&&this.#A()}if(this.#m.size>0){let{contents:e,parentKeys:n,keysAt:r}=this.#k();this.#m=RE(this.#m,e,n,r)}let n=e.get(`_columns`),r=e.has(`_columns`)&&(n?.length??0)<this._columns.length,i=e.has(`_loadingDepth`)&&this._loadingDepth!==void 0;if(r||i){let e=this.shadowRoot?.querySelector(`#container`);e?.scrollTo({left:e.scrollWidth,behavior:`smooth`})}}firstUpdated(){let e=this.shadowRoot?.querySelector(`#container`);e&&u_(e,()=>{this.#m=new Map}),this.renderRoot.addEventListener(`scroll`,this.#w,{capture:!0,passive:!0})}#w;connectedCallback(){super.connectedCallback(),this.#_??=Yt(),this.#b()}disconnectedCallback(){super.disconnectedCallback(),this.#l?.(),this.#l=void 0,this.#v?.(),this.#v=void 0,this.#_=void 0}getViewState(e){let n=e?.includePending??!0,{contents:r,parentKeys:i,keysAt:a}=this.#k();return this.#u.shape({selected:fr(this._selectedKeys,n?this.#f:[]),path:(n?this.#d:void 0)??EE(this._columns),focus:this.#O()??(n?this.#p:void 0),columnWidths:Object.fromEntries(this.#n),columnScroll:{...LE(r,i,a),...n?Object.fromEntries(this.#m):{}}},e)}setViewState(e){this.#u.accepts(e)&&(this.#u.restoring(()=>{if(e.path&&(this.#d=[...e.path]),e.selected){this.#f=sr(new Set(e.selected));let n=new Set(this._selectedNodes);this._selectedKeys=new Set,this._selectedNodes=new Set,this.#e=void 0,this.#t=void 0,n.size>0&&this.#q(n)}e.focus!==void 0&&(this.#p=e.focus),e.columnWidths&&(this.#n=OE(e.columnWidths),this.#u.notify()),e.columnScroll&&(this.#m=new Map(Object.entries(e.columnScroll))),this.#A()}),this.requestUpdate())}clearPendingViewState(){this.#d=void 0,this.#f=k,this.#p=void 0,this.#m=new Map}#T(){this.#u.isRestoring||(this.#f=k),this.#u.notify()}#E(){return this.#d!==void 0||this.#f.size>0||this.#p!==void 0}#D(){let e=this.tickled.tickledId,n=e?.indexOf(`:`)??-1;return e===void 0||n<0?void 0:e.substring(n+1)}#O(){return this.#h?this.#D():void 0}#k(){return IE(this.shadowRoot,this._columns,this.#S?.item.key,this.filterPredicate)}#A(){let e=this.#S?.children;if(!e)return;let n=jE(e);this.#u.restoring(()=>{this.#d&&this.#j(NE(e,this.#d,this._columns,this._selectedByDepth,this.#r));let r=PE(this._selectedKeys,this.#f,this._selectedNodes,this.#e,n,this._columns,this.interactionMode===`implicit`);r&&this.#M(r);let i=FE(this.#D(),this.#h,this.#p,n,this._columns);i.clear&&this.tickled.clearTickled(),this.#p=i.pending,i.tickle&&(this.tickled.setTickled(this.#x(i.tickle.node,i.tickle.depth)),this.#h=!0,this.#u.notify())})}#j(e){e.columns&&(this.#r&&this.#Z(),this._columns=e.columns,this._selectedByDepth=e.selectedByDepth),this.#d=e.pending,e.load&&this.restoreLoads&&(this.model||this.loadChildren)&&this.#ie(e.load.node,e.load.depth,!0,!0),kE(this._columns,this.#g)||(this.#g=this._columns,this.#u.notify())}#M(e){let n=this._selectedNodes;if(this._selectedKeys=e.keys,this._selectedNodes=e.nodes,this.#f=e.pending,this.#e=e.last,this.interactionMode===`implicit`)for(let[n,r]of e.placed)this._selectedByDepth.set(n,r);if(!e.restored){this.#u.notify();return}let r=this.#N;this.#N=`programmatic`;try{this.#q(n)}finally{this.#N=r}}get selectedKeys(){return this._selectedKeys}set selectedKeys(e){this._selectedKeys=new Set(e),this.#T(),this.requestUpdate()}get selectedNode(){return this.#e}set selectedNode(e){this.#e=e,e&&(this.interactionMode===`implicit`||this.interactionMode===`standard`)&&(this._selectedKeys=new Set([e.item.key]),this.#T()),this.requestUpdate()}get selectedNodes(){return this._selectedNodes}select(e){if(!this.#K(e))return;let n=new Set(this._selectedNodes);this._selectedNodes.add(e),this._selectedKeys.add(e.item.key),this.#e=e,this.#q(n),this.requestUpdate()}deselect(e){if(!this._selectedNodes.has(e))return;let n=new Set(this._selectedNodes);this._selectedNodes.delete(e),this._selectedKeys.delete(e.item.key),this.#e===e&&(this.#e=[...this._selectedNodes].at(-1)),this.#q(n),this.requestUpdate()}clearSelection(){this.#T();let e=new Set(this._selectedNodes);this._selectedKeys=new Set,this._selectedNodes.clear(),this.#e=void 0,e.size>0&&this.#q(e),this.requestUpdate()}selectAll(){}get partialKeys(){return this._partialKeys}set partialKeys(e){let n=new Set(e);yr(n,this._partialKeys)||(this._partialKeys=n)}_isPartial(e,n){return vr(e.item.key,this._partialKeys,this._isSelected(e,n))}deselectAll(){}setSelected(e,n){this.interactionMode===`checked`?this.#se(e,n):n?(this._selectedKeys.add(e.item.key),this._selectedNodes.add(e)):(this._selectedKeys.delete(e.item.key),this._selectedNodes.delete(e)),this.#T(),this.requestUpdate()}getSelected(){let e=[];for(let n of this._columns)for(let r of n)this._selectedKeys.has(r.item.key)&&e.push(r);return e}navigateTo(e,n={}){let r=this.#S;if(!r?.children)return!1;let i=this.#N,a=this.#P;this.#N=`programmatic`,this.#P=n.silent===!0;try{return this.#F(r.children,e,n.reveal??`edge`)}finally{this.#N=i,this.#P=a}}invalidateStructure(){let e=EE(this._columns);e.length>0&&(this.#d??=e),this.#A(),this.requestUpdate()}#N;#P;#F(e,n,r){this.#Z(),this.#d=void 0,this._selectedByDepth.clear(),this.tickled.clearTickled();let i=[e],a=e,o=!0,s,c=0;for(let e=0;e<n.length;e++){let r=a.findIndex(r=>r.item.key===n[e]);if(r<0){o=!1;break}let l=a[r];if(this._selectedByDepth.set(e,l),s=l,c=e,l.item.isLeaf||!l.children||l.children.length===0){e<n.length-1&&(o=!1);break}i.push(l.children),a=l.children}if(this._columns=i,s&&this.tickled.setTickled(this.#x(s,c)),this.interactionMode!==`implicit`&&this.interactionMode!==`manual`){let e=n.at(-1);e&&(this._selectedKeys=new Set([e]),this.#T())}return this.requestUpdate(),this.#ue(r===`center-if-hidden`?`auto`:`smooth`,r),o}navigateToNode(e){let n=this.#S;if(!n?.children)return!1;let r=this.#I(n.children,e);return r?this.navigateTo(r):!1}revealKey(e){let n=this.#S;if(!n?.children)return!1;let r=this.#I(n.children,n=>n.item.key===e);if(!r)return!1;this.#d=void 0;let i=[n.children],a=n.children,o,s=0;for(let e=0;e<r.length;e++){let n=a.find(n=>n.item.key===r[e]);if(!n)return!1;if(o=n,s=e,n.children&&n.children.length>0)i.push(n.children),a=n.children;else break}return this._columns=i,o&&this.tickled.setTickled(this.#x(o,s)),this.requestUpdate(),this.#ue(),!0}selectMany(e){let n=this.selectionFilter===`none`?[]:[...e],r=new Set(this._selectedNodes);this._selectedNodes=new Set(n),this._selectedKeys=new Set(n.map(e=>e.item.key)),this.#e=n.at(-1),this.#q(r),this.requestUpdate()}getNodes(){let e=this.#S;if(!e?.children)return[];let n=[],r=(e,i)=>{if(n.push({node:e,depth:i}),e.children)for(let n of e.children)r(n,i+1)};for(let n of e.children)r(n,0);return n}#I(e,n,r=[]){for(let i of e){let e=[...r,i.item.key];if(n(i))return e;if(i.children?.length){let r=this.#I(i.children,n,e);if(r)return r}}}#L(){this.#Z();let e=new Set(this._selectedNodes);this._selectedByDepth.clear(),this._selectedKeys=new Set,this._selectedNodes.clear(),this.#e=void 0,this.#t=void 0,this.tickled.clearTickled();let n=this.#S;n?.children===void 0?n?(this._columns=[],this.#ie(n,-1,!1)):(this._columns=[],this._loadingDepth=void 0):(this._columns=n.children?[n.children]:[],this._loadingDepth=void 0),e.size>0&&this.#q(e),this.#E()&&this.#A()}rebaseTo(e){if(e===void 0)return this.#R();let n=typeof e==`string`?this.#B(e):e;return!n||n.item.isLeaf===!0||n===this.viewRoot||n.item.key===this.viewRoot?.item.key?!1:n===this.root||!this.viewRoot&&n.item.key===this.root?.item.key?this.#R():(this.viewRoot=n,this.#z(),!0)}rebaseUp(){if(!this.viewRoot)return!1;let e=this.#H(this.viewRoot);return e?e===this.root?this.#R():(this.viewRoot=e,this.#z(),!0):!1}#R(){return this.viewRoot!==void 0&&(this.viewRoot=void 0,this.#z(),!0)}#z(){this.#d=void 0;let e=this.viewRoot,n={viewRoot:e,path:e?this.#W(e):[]};this.dispatchEvent(new CustomEvent(`rebase`,{detail:n,bubbles:!0,composed:!0}))}#B(e){if(this.root)return this.root.item.key===e?this.root:this.#V(this.root.children??[],e)}#V(e,n){for(let r of e){if(r.item.key===n)return r;if(r.children){let e=this.#V(r.children,n);if(e)return e}}}#H(e){if(!(!this.root||e===this.root))return this.#U(this.root,e)}#U(e,n){if(e.children)for(let r of e.children){if(r===n||r.item.key===n.item.key)return e;let i=this.#U(r,n);if(i)return i}}#W(e){let n=[e],r=this.#H(e);for(;r&&(n.unshift(r),r!==this.root);)r=this.#H(r);return n}renderColumnContent(e,n){return console.warn(`ixfx-miller-base: renderColumnContent not overridden. depth=${n}, nodes=${e.length}`),a}_handleItemClick(e,n,r){this.#ee(e,n,r)}_handleCheckboxClick(e,n,r){e.stopPropagation(),this.#ae(n)}_handleItemDblClick(e,n,r){this.dispatchEvent(new CustomEvent(`item-dblclick`,{detail:{node:e,depth:n},bubbles:!0,composed:!0}))}_handleItemRightClick(e,n,r){this.dispatchEvent(new CustomEvent(`item-rightclick`,{detail:{node:e,depth:n,mouseEvent:r},bubbles:!0,composed:!0}))}_handleHeaderRightClick(e,n){let r=this.#xe(n),i=this.#Q(n);this.dispatchEvent(new CustomEvent(`header-rightclick`,{detail:{depth:n,label:r,path:i,mouseEvent:e},bubbles:!0,composed:!0}))}_isSelected(e,n){return this.interactionMode===`implicit`?this._selectedByDepth.get(n)===e:this._selectedKeys.has(e.item.key)}#G(e,n){let r=this._columns[n+1];return r!==void 0&&e.children===r}_isOpen(e,n){return this.#G(e,n)}getItemState(e,n){let r=this._columns[n]?.find(n=>n.item.key===e);if(r)return{selected:this._isSelected(r,n),open:this.#G(r,n),focused:this._isFocused(r,n),isLeaf:r.item.isLeaf??!1}}#K(e){return this.selectionFilter===`none`?!1:this.selectionFilter===`leaf`?e.item.isLeaf!==!1:this.selectionFilter!==`branch`||e.item.isLeaf===!1||e.children!==void 0&&e.children.length>0}#q(e){if(this.#T(),this.#P)return;let n={selected:new Set(this._selectedNodes),previous:e,origin:this.#N};this.dispatchEvent(new CustomEvent(`select`,{detail:n,bubbles:!0,composed:!0})),this.dispatchEvent(new CustomEvent(`list-select`,{detail:{selectedKeys:new Set(this._selectedKeys),previousKeys:new Set([...e].map(e=>e.item.key)),previous:e},bubbles:!0,composed:!0}))}#J(e){return!this.dispatchEvent(new CustomEvent(`list-select-intent`,{detail:e,bubbles:!0,composed:!0,cancelable:!0}))}#Y(e,n,r){if(!(!this.#t||this.#t.depth!==n||!e||r<0))return e.slice(Math.min(this.#t.index,r),Math.max(this.#t.index,r)+1)}#X(e,n,r,i){let a=e.item.key;if(r&&(r.metaKey||r.ctrlKey)){this.#J({kind:`toggle`,keys:[a],source:i});return}let o=this._columns[n],s=r?.shiftKey?this.#Y(o,n,o?o.indexOf(e):-1):void 0;if(s&&this.#t){this.#J({kind:`extend`,keys:s.map(e=>e.item.key),anchorKey:this.#t.key,targetKey:a,source:i});return}this.#J({kind:`replace`,keys:[a],source:i})}#Z(){if(this.#a!==void 0&&(clearTimeout(this.#a),this.#a=void 0),this.#i){let e=this.#r,n=this._loadingDepth;this.#i.abort(),this.#i=void 0,this.#r=void 0,this._loadingDepth=void 0,e&&n!==void 0&&this.dispatchEvent(new CustomEvent(`collapse`,{detail:{node:e,depth:n},bubbles:!0,composed:!0}))}}#Q(e){let n=[];this.#S&&n.push(this.#S);for(let r=0;r<e;r++){let e=this._selectedByDepth.get(r);e&&n.push(e)}return n}#$(e){let n={depth:e,label:this.#xe(e),path:this.#Q(e)};this.dispatchEvent(new CustomEvent(`header-click`,{detail:n,bubbles:!0,composed:!0}))}#ee(e,n,r){switch(this._loadingDepth!==void 0&&this._loadingDepth>n&&this.#Z(),this.tickled.setTickled(this.#x(e,n)),this.#h=!1,this.#p=void 0,this.dispatchEvent(new CustomEvent(`item-click`,{detail:{node:e,depth:n},bubbles:!0,composed:!0})),this.interactionMode){case`implicit`:this.#te(e,n);break;case`standard`:this.#ne(e,n,r);break;case`vscode`:this.#ne(e,n,r);break;case`manual`:this.#X(e,n,r,`pointer`);break;case`checked`:this.#re(e,n,!0)}}#te(e,n){if(this.#J({kind:`replace`,keys:[e.item.key],source:`pointer`})){this.#e=e,this.#re(e,n,!0);return}let r=new Set(this._selectedNodes);this._selectedByDepth.set(n,e),this.#e=e,this._selectedKeys=new Set([e.item.key]),this._selectedNodes.clear(),this._selectedNodes.add(e),this.#re(e,n,!0),r.has(e)||this.#q(r)}#ne(e,n,r){let i=this._columns[n],a=i?i.indexOf(e):-1,o=r?r.metaKey||r.ctrlKey:!1,s=r?r.shiftKey:!1;if(o){if(this.#J({kind:`toggle`,keys:[e.item.key],source:`pointer`})){this.#t=a>=0?{key:e.item.key,depth:n,index:a}:this.#t;return}this._selectedKeys.has(e.item.key)?(this._selectedKeys.delete(e.item.key),this._selectedNodes.delete(e)):(this._selectedKeys.add(e.item.key),this._selectedNodes.add(e)),this.#t=a>=0?{key:e.item.key,depth:n,index:a}:this.#t,this.#T(),this.requestUpdate();return}if(s&&this.#t&&this.#t.depth===n&&i){let r=this.#Y(i,n,a)??[];if(this.#J({kind:`extend`,keys:r.map(e=>e.item.key),anchorKey:this.#t.key,targetKey:e.item.key,source:`pointer`}))return;this._selectedKeys=new Set(r.map(e=>e.item.key)),this._selectedNodes=new Set(r),this.#T(),this.requestUpdate();return}let c=this.#J({kind:`replace`,keys:[e.item.key],source:`pointer`}),l=new Set(this._selectedNodes);if(this.#t=a>=0?{key:e.item.key,depth:n,index:a}:void 0,c){this.#e=e,this.#re(e,n,!0);return}this._selectedKeys=new Set([e.item.key]),this._selectedNodes=new Set([e]),this._selectedByDepth.set(n,e),this.#e=e,this.#re(e,n,!0),(!l.has(e)||l.size!==1)&&this.#q(l)}#re(e,n,r=!1){if(this.#d=void 0,e.item.isLeaf){this._columns=this._columns.slice(0,n+1),this.requestUpdate();return}if(e.children===void 0)this.#ie(e,n,!0,r);else{let r=this._columns.slice(0,n+1);r.push(e.children),this._columns=r,this.dispatchEvent(new CustomEvent(`expand`,{detail:{node:e,depth:n},bubbles:!0,composed:!0}))}}#ie(e,n,r,i=!1){let a=n+1;this._columns=this._columns.slice(0,a),this._loadingDepth=a,this.#i?.abort(),this.#r=e;let o=new AbortController;this.#i=o,r&&this.dispatchEvent(new CustomEvent(`expand`,{detail:{node:e,depth:n},bubbles:!0,composed:!0}));let s=n=>{if(o.signal.aborted)return;e.children=n,this.#r=void 0,this.#i=void 0,this._loadingDepth=void 0;let r=this._columns.slice(0,a);n.length>0&&r.push(n),this._columns=r,this.#E()&&this.#A()},c=n=>{n.name!==`AbortError`&&console.error(n),e.children=[],this.#r=void 0,this.#i=void 0,this._loadingDepth=void 0,this.#E()&&this.#A(),this.requestUpdate()};if(this.model||this.loadChildren){this.#a!==void 0&&(clearTimeout(this.#a),this.#a=void 0);let n=()=>{this.#a=void 0,this.#r===e&&(this.model?this.model.getChildren(e,a-1,o.signal):Rg(this.loadChildren({node:e,depth:a-1},o.signal),o.signal)).then(e=>s([...e])).catch(c)};i?n():this.#a=setTimeout(n,150)}else{this._loadingDepth=void 0,this.#r=void 0,this.#i=void 0;let e=this._columns.slice(0,a);e.push([]),this._columns=e}}#ae(e){let n=new Set(this._selectedNodes),r=this._selectedKeys.has(e.item.key),i=e.children?.length?this.#oe(e):r,a=[],o=e=>{a.push(e.item.key),e.children?.forEach(o)};o(e),!this.#J({kind:`toggle`,keys:a,descendants:!0,checked:!i,source:`pointer`})&&(i?this.#se(e,!1):this.#se(e,!0),this.requestUpdate(),this.#q(n))}#oe(e){return this._selectedKeys.has(e.item.key)?!e.children?.length||e.children.every(e=>this.#oe(e)):!1}#se(e,n){if(n?(this._selectedKeys.add(e.item.key),this._selectedNodes.add(e)):(this._selectedKeys.delete(e.item.key),this._selectedNodes.delete(e)),e.children)for(let r of e.children)this.#se(r,n)}#ce(){return this.#C()??0}#le(){let e=this.tickled.tickledId;if(!e)return;let n=e.indexOf(`:`);if(n<0)return;let r=Number(e.substring(0,n)),i=e.substring(n+1),a=this._columns[r];if(!a)return;let o=a.findIndex(e=>e.item.key===i);if(!(o<0))return{node:a[o],depth:r,index:o}}#ue(e=`smooth`,n=`edge`){requestAnimationFrame(()=>{let r=this.#le();if(!r)return;let i=this.shadowRoot?.querySelectorAll(`.column`)[r.depth]?.querySelector(`.column-content`);if(!i)return;let a=i.querySelectorAll(`.item`)[r.index];if(a){if(n===`center-if-hidden`){let n=a.getBoundingClientRect(),r=i.getBoundingClientRect(),o=n.top<r.top||n.bottom>r.bottom;a.scrollIntoView({block:o?`center`:`nearest`,inline:`nearest`,behavior:e});return}a.scrollIntoView({block:`nearest`,behavior:e})}})}#de(e,n){this.tickled.setTickled(this.#x(e,n)),this.#h=!0,this.#p=void 0,this.#u.notify(),this.dispatchEvent(new CustomEvent(`tickle`,{detail:{node:e,depth:n},bubbles:!0,composed:!0}))}#fe(e){let n=this.shadowRoot?.querySelectorAll(`.column`)[e]?.querySelector(`.column-content`),r=n?.querySelector(`.item`);return!n||!r||r.offsetHeight===0?10:Math.max(1,Math.floor(n.clientHeight/r.offsetHeight)-1)}#pe(e,n,r,i,a=!1){let o=this.#le(),s=i(o!==void 0&&o.depth===n?o.index:-1),c=e[s];if(c){if(this.#de(c,n),this.interactionMode===`standard`||this.interactionMode===`vscode`){let i=o?.index??0;if(r.shiftKey){if(!this.#t||this.#t.depth!==n){let r=e[i];r&&(this.#t={key:r.item.key,depth:n,index:i,selectionSnapshot:this.interactionMode===`vscode`?new Set(this._selectedKeys):void 0})}if(this.#t){let n=Math.min(this.#t.index,s),r=Math.max(this.#t.index,s),i=e.slice(n,r+1).map(e=>e.item.key);if(!this.#J({kind:`extend`,keys:i,anchorKey:this.#t.key,targetKey:c.item.key,source:`keyboard`})){if(this.interactionMode===`vscode`){let e=this.#t.selectionSnapshot;for(let n of i)e.has(n)?this._selectedKeys.delete(n):this._selectedKeys.add(n)}else this._selectedKeys=new Set(i)}this.#T()}}else this.#t=this.interactionMode===`standard`?{key:c.item.key,depth:n,index:s}:void 0}this.requestUpdate(),a&&this.#ue(`auto`)}}#me;#he;#ge;#_e;#ve;#ye;#be;#xe(e){if(e===0)return this.#S?.item.label??``;let n=this._selectedByDepth.get(e-1);if(n)return n.item.label;let r=this._columns[e-1],i=this._columns[e];if(r&&i){let e=r.find(e=>e.children===i);if(e)return e.item.label}return``}#Se(e){return`width:${e}px;flex-grow:0;flex-shrink:0;flex-basis:auto;max-width:none`}#Ce(e,n){let r=this.#n.get(e);return r===void 0?this.stretchLastColumn&&n?`width:max-content;flex-grow:1;flex-shrink:0;flex-basis:auto;min-width:0`:`width:max-content;flex-grow:0;flex-shrink:0;flex-basis:auto`:this.#Se(r)}#we(e,n){return this.tickled.isTickled(this.#x(e,n))}renderLoadingIndicator(){return i`<div class="loading-spinner"></div>`}#Te(){let e=this._loadingDepth,n=this.stretchLastColumn&&this.#n.get(e)===void 0;return i`
10169
10169
  <div class="column loading-column ${n?`stretch-last`:``}" style=${this.#Ce(e,!0)}>
10170
10170
  ${this.headers?i`
10171
10171
  <div class="column-header">${this.#xe(e)}</div>
@@ -10322,13 +10322,13 @@ ixfx-form-options[orientation="vertical"] ixfx-form-part > label {
10322
10322
  >
10323
10323
  ${e.map(e=>this.#e(e,n))}
10324
10324
  </ul>
10325
- `}#e(e,n){let r=this._isSelected(e,n),o=this._isPartial(e,n),s=this._isFocused(e,n),c=this._isOpen(e,n),l=e.item.isLeaf!==!0,u=e.item.icon,d=C_(e.item.iconColor),f=C_(e.item.textColor),p=S_(e.item.badge)?void 0:e.item.badge,m=e.item.tooltip,h=this.interactionMode===`checked`,g=a;if(h){let r=o?`indeterminate`:VE(e,this._selectedKeys);g=i`
10325
+ `}#e(e,n){let r=this._isSelected(e,n),o=this._isPartial(e,n),s=this._isFocused(e,n),c=this._isOpen(e,n),l=e.item.isLeaf!==!0,u=e.item.icon,d=C_(e.item.iconColor),f=C_(e.item.textColor),p=S_(e.item.badge)?void 0:e.item.badge,m=e.item.tooltip,h=this.interactionMode===`checked`,g=a;if(h){let r=VE(e,this._selectedKeys),a=r===`unchecked`&&o?`indeterminate`:r;g=i`
10326
10326
  <input
10327
10327
  type="checkbox"
10328
10328
  class="item-checkbox"
10329
- .checked=${r===`checked`}
10330
- .indeterminate=${r===`indeterminate`}
10331
- aria-checked=${r===`indeterminate`?`mixed`:String(r===`checked`)}
10329
+ .checked=${a===`checked`}
10330
+ .indeterminate=${a===`indeterminate`}
10331
+ aria-checked=${a===`indeterminate`?`mixed`:String(a===`checked`)}
10332
10332
  aria-label="Select ${e.item.label}"
10333
10333
  @click=${r=>this._handleCheckboxClick(r,e,n)}
10334
10334
  />
@@ -246,8 +246,8 @@ declare class MillerBaseElement extends LitElement implements TreeComponent, Tre
246
246
  * Nodes shown as *partially* selected (a part of the resource is selected):
247
247
  * an indeterminate checkbox in `checked` mode, `.partial` and an accessible
248
248
  * description otherwise. Independent of the selection — a key in both counts
249
- * as selected. In `checked` mode this overrides the state derived from
250
- * loaded descendants. Replace-on-set.
249
+ * as selected. In `checked` mode a node is indeterminate if either the
250
+ * loaded descendants or this say so (as in the tree). Replace-on-set.
251
251
  */
252
252
  get partialKeys(): ReadonlySet<string>;
253
253
  set partialKeys(keys: Iterable<string>);
package/dist/index.d.ts CHANGED
@@ -45,7 +45,7 @@ import { a as RadialInputChangeDetail, c as RadialInputInputEvent, i as MarkerSt
45
45
  import { LabelledRadialInput } from "./labelled-radial-input.js";
46
46
  import { _ as SliderValueMode, a as SliderInputChangeDetail, c as SliderInputInputDetail, d as SliderLaneType, f as SliderMarkerStyle, g as SliderValueDrag, h as SliderValueCFollow, i as SliderHandleKey, l as SliderInputInputEvent, m as SliderSingleStyle, n as SliderChangedField, o as SliderInputChangeEvent, p as SliderOrientation, r as SliderCrossover, s as SliderInputElementEventMap, t as SliderInputElement, u as SliderLaneData } from "./slider-input-BxURAAmD.js";
47
47
  import { LedElement, LedMode } from "./led.js";
48
- 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-DyaHA9Kk.js";
48
+ 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-YCDugjdu.js";
49
49
  import { a as Notification, c as NotificationRendererHooks, i as PillTapEvent, l as NotificationType, n as NotificationPillElementEventMap, o as NotificationContent, r as PillTapDetail, s as NotificationRenderer, t as NotificationPillElement, u as NotifierOptions } from "./notification-pill-DyZydXoZ.js";
50
50
  import { A as applyAgeModification, C as SingleAxisAgeStyle, D as ColourMapConfig, E as PlotDataSeriesOptions, M as parseColourScaleAttr, N as readBaseColour, O as ColourMode, S as PlotSingleAxisPointerMoveEvent, T as PlotDataSeries, _ as PlotMultiAxisElementEventMap, a as PlotHistogramBucketClickDetail, b as PlotSingleAxisElementEventMap, c as PlotHistogramInteractionMode, d as PlotHistogramSelectionChangeEvent, f as PlotHistogramSelectionRange, g as PlotMultiAxisDataPointClickEvent, h as PlotMultiAxisDataPointClickDetail, i as PlotHistogram, j as computeColour, k as ColourResult, l as PlotHistogramOrientation, m as PlotMultiAxis, n as XyAgeStyle, o as PlotHistogramBucketClickEvent, p as PlotHistogramValueTooltips, r as XyDrawStyle, s as PlotHistogramElementEventMap, t as PlotXyAxis, u as PlotHistogramSelectionChangeDetail, v as PlotMultiAxisLayout, w as SingleAxisDrawStyle, x as PlotSingleAxisPointerMoveDetail, y as PlotSingleAxis } from "./xy-axis-DQqd2yXJ.js";
51
51
  import { PolarPad, PolarPadInputDetail, PolarPadInputEvent } from "./polar-pad.js";
package/dist/index.js CHANGED
@@ -59,7 +59,7 @@ import { t as RadialInputElement } from "./radial-input-KMVltQfe.js";
59
59
  import { LabelledRadialInput } from "./labelled-radial-input.js";
60
60
  import { t as SliderInputElement } from "./slider-input-ByHdotzp.js";
61
61
  import { LedElement } from "./led.js";
62
- import { n as MillerListElement, r as MillerBaseElement, t as MillerTreeController } from "./miller-Be7x4ufN.js";
62
+ import { n as MillerListElement, r as MillerBaseElement, t as MillerTreeController } from "./miller-BrmBywNZ.js";
63
63
  import { NotificationPillElement } from "./notifier.js";
64
64
  import { a as TooltipElement, c as computeColour, i as PlotMultiAxis, l as parseColourScaleAttr, n as PlotSingleAxis, o as PlotDataSeries, r as PlotHistogram, s as applyAgeModification, t as PlotXyAxis, u as readBaseColour } from "./xy-axis-CyMd_Bn1.js";
65
65
  import { PolarPad } from "./polar-pad.js";
@@ -788,8 +788,8 @@ let MillerBaseElement = class MillerBaseElement extends LitElement {
788
788
  * Nodes shown as *partially* selected (a part of the resource is selected):
789
789
  * an indeterminate checkbox in `checked` mode, `.partial` and an accessible
790
790
  * description otherwise. Independent of the selection — a key in both counts
791
- * as selected. In `checked` mode this overrides the state derived from
792
- * loaded descendants. Replace-on-set.
791
+ * as selected. In `checked` mode a node is indeterminate if either the
792
+ * loaded descendants or this say so (as in the tree). Replace-on-set.
793
793
  */
794
794
  get partialKeys() {
795
795
  return this._partialKeys;
@@ -1510,14 +1510,23 @@ let MillerBaseElement = class MillerBaseElement extends LitElement {
1510
1510
  }
1511
1511
  }
1512
1512
  #onCheckboxClick(node) {
1513
+ const previous = new Set(this._selectedNodes);
1514
+ const currentlySelected = this._selectedKeys.has(node.item.key);
1515
+ const allDescendantsSelected = !!node.children?.length ? this.#allDescendantsSelected(node) : currentlySelected;
1516
+ const affected = [];
1517
+ const collect = (n) => {
1518
+ affected.push(n.item.key);
1519
+ n.children?.forEach(collect);
1520
+ };
1521
+ collect(node);
1513
1522
  if (this.#intercepted({
1514
1523
  kind: `toggle`,
1515
- keys: [node.item.key],
1524
+ keys: affected,
1525
+ descendants: true,
1526
+ checked: !allDescendantsSelected,
1516
1527
  source: `pointer`
1517
1528
  })) return;
1518
- const previous = new Set(this._selectedNodes);
1519
- const currentlySelected = this._selectedKeys.has(node.item.key);
1520
- if (!!node.children?.length ? this.#allDescendantsSelected(node) : currentlySelected) this.#applyCheckedToggle(node, false);
1529
+ if (allDescendantsSelected) this.#applyCheckedToggle(node, false);
1521
1530
  else this.#applyCheckedToggle(node, true);
1522
1531
  this.requestUpdate();
1523
1532
  this.#dispatchSelectEvent(previous);
@@ -1989,7 +1998,8 @@ let MillerListElement = class MillerListElement extends MillerBaseElement {
1989
1998
  const isCheckedMode = this.interactionMode === `checked`;
1990
1999
  let checkboxTpl = nothing;
1991
2000
  if (isCheckedMode) {
1992
- const state = partial ? `indeterminate` : computeCheckboxState(node, this._selectedKeys);
2001
+ const derived = computeCheckboxState(node, this._selectedKeys);
2002
+ const state = derived === `unchecked` && partial ? `indeterminate` : derived;
1993
2003
  checkboxTpl = html`
1994
2004
  <input
1995
2005
  type="checkbox"
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-DyaHA9Kk.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-YCDugjdu.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-Be7x4ufN.js";
1
+ import { n as MillerListElement, r as MillerBaseElement, t as MillerTreeController } from "./miller-BrmBywNZ.js";
2
2
  export { MillerBaseElement, MillerListElement, MillerTreeController };
@@ -67,7 +67,12 @@ This directory contains documentation for each component and some architectural
67
67
 
68
68
  ## Architectural Overviews
69
69
 
70
+ - [infra-handle.md](infra-handle.md)
71
+ - [infra-incremental.md](infra-incremental.md)
72
+ - [infra-theming.md](infra-theming.md)
70
73
  - [infra-tickled.md](infra-tickled.md)
74
+ - [infra-view-state.md](infra-view-state.md)
75
+ - [list-state.md](list-state.md)
71
76
  - [user-catalog.md](user-catalog.md)
72
77
  - [user-selection-intents.md](user-selection-intents.md)
73
78
  - [user-theming.md](user-theming.md)
@@ -146,5 +146,5 @@ import type { BottomDrawerElement, BottomDrawerResizeDetail, BottomDrawerCloseEv
146
146
 
147
147
  ## See also
148
148
 
149
- - [`ixfx-titlebar`](../titlebar/README.md) — Header component used by the drawer
150
- - [`ixfx-icon`](../icons/README.md) — Icon component for header icons
149
+ - [`ixfx-titlebar`](./titlebar.md) — Header component used by the drawer
150
+ - [`ixfx-icon`](./icons.md) — Icon component for header icons
@@ -63,7 +63,7 @@ nav.model = {
63
63
  ### View state
64
64
 
65
65
  The current location as plain JSON, for the host to persist (see
66
- [docs/infra-view-state.md](../../docs/infra-view-state.md)):
66
+ [docs/infra-view-state.md](./infra-view-state.md)):
67
67
 
68
68
  ```ts
69
69
  { v: 1, kind: 'crumb-navigation', path: ['dev', 'workspace'] } // keys below the root; [] = root
@@ -52,7 +52,7 @@ type DataGridColumn = {
52
52
  };
53
53
  ```
54
54
 
55
- * `width` defaults to `150`. Drag the handle between headers to resize; double-click handle to auto-size to content. Drag the grip handle (shared `dimpled` spot handle — see [docs/infra-handle.md](../../docs/infra-handle.md)) to reorder.
55
+ * `width` defaults to `150`. Drag the handle between headers to resize; double-click handle to auto-size to content. Drag the grip handle (shared `dimpled` spot handle — see [docs/infra-handle.md](./infra-handle.md)) to reorder.
56
56
  * `align` controls cell content justification. Numeric columns should use `right` (or `center` for Age) – cells use `font-variant-numeric: tabular-nums` so decimal points align when paired with a fixed formatter.
57
57
  * `renderer` overrides default `String(value)` display. Use `html` from `lit`.
58
58
 
@@ -527,7 +527,7 @@ Matched characters in the search column are highlighted under the
527
527
  against a custom `rowSearchText` aren't highlighted, since they can't be
528
528
  mapped onto a cell, and neither are cells drawn by a column `renderer`. `filterPredicate`
529
529
  (a `(row) => boolean` property) filters rows directly. `search-modes` limits the
530
- offered modes. Full model: [`docs/infra-incremental.md`](../../docs/infra-incremental.md).
530
+ offered modes. Full model: [`docs/infra-incremental.md`](./infra-incremental.md).
531
531
 
532
532
  ---
533
533
 
@@ -464,7 +464,7 @@ With wrapping:
464
464
 
465
465
  ## Incremental search
466
466
 
467
- A built-in type-ahead popover with **navigate** / **select** / **filter** modes — see [`docs/infra-incremental.md`](../../docs/infra-incremental.md). No default shortcut; open it with `list.registry.invoke('list.search.filter')` (or `.navigate` / `.select`). A filter change re-runs the column geometry automatically.
467
+ A built-in type-ahead popover with **navigate** / **select** / **filter** modes — see [`docs/infra-incremental.md`](./infra-incremental.md). No default shortcut; open it with `list.registry.invoke('list.search.filter')` (or `.navigate` / `.select`). A filter change re-runs the column geometry automatically.
468
468
 
469
469
  Search matches against `data-search-label` (or `textContent` as fallback). Use `data-search-label` to match against a different string than what's displayed:
470
470
 
@@ -489,7 +489,7 @@ Matched characters are highlighted with the `detail-list-search` highlight key.
489
489
 
490
490
  ## Grouping
491
491
 
492
- Group rows under collapsible headers, following `ixfx-data-grid` (see its [Grouping](../data-grid/README.md#grouping) section).
492
+ Group rows under collapsible headers, following `ixfx-data-grid` (see its [Grouping](./data-grid.md#grouping) section).
493
493
 
494
494
  ```ts
495
495
  list.groupBy = 'kind'; // object items: property · declarative <li>: data-kind
@@ -607,7 +607,7 @@ replaced) falls back to a full rebuild.
607
607
 
608
608
  Snapshot and restore *how* the list is showing its data, separately from the
609
609
  data, as plain JSON keyed by item / group key. See
610
- [`docs/infra-view-state.md`](../../docs/infra-view-state.md) for the shared
610
+ [`docs/infra-view-state.md`](./infra-view-state.md) for the shared
611
611
  contract.
612
612
 
613
613
  ```ts
package/docs-user/dock.md CHANGED
@@ -98,7 +98,7 @@ wrapped in a new split. `Escape` or `pointercancel` cancels with no mutation.
98
98
 
99
99
  Where a parent gutter line meets a nested split's gutter (T and + crossings
100
100
  of three or four panels), the host renders a small hover-revealed handle — the
101
- shared `dimpled` spot handle ([docs/infra-handle.md](../../docs/infra-handle.md)),
101
+ shared `dimpled` spot handle ([docs/infra-handle.md](./infra-handle.md)),
102
102
  `var(--accent)` tinted. Dragging it
103
103
  starts the vertical and horizontal gutter drags at once via
104
104
  `ixfx-split-layout`'s `beginGutterDrag()`, resizing all adjacent panels with
@@ -434,7 +434,7 @@ the target host (adopt / focus it yourself instead).
434
434
  ## View state
435
435
 
436
436
  The dock implements the shared view-state API
437
- ([docs/infra-view-state.md](../../docs/infra-view-state.md)). The component
437
+ ([docs/infra-view-state.md](./infra-view-state.md)). The component
438
438
  never persists anything; the host does, e.g. with `bindViewState()`:
439
439
 
440
440
  ```ts
@@ -498,7 +498,7 @@ The dock layout is close to structure, so the saved state *is* the tree
498
498
  | `--dock-leaf-body-padding` | padding inside leaf body | `var(--space-s)` |
499
499
 
500
500
  The junction resize handle is the shared handle primitive — theme it with
501
- `--ixfx-handle-*` (see [docs/infra-handle.md](../../docs/infra-handle.md)).
501
+ `--ixfx-handle-*` (see [docs/infra-handle.md](./infra-handle.md)).
502
502
 
503
503
  Splitter styling delegates to `ixfx-split-layout` (`--split-*`); solo panel
504
504
  chrome delegates to `ixfx-titlebar`, and the leaf body is the docked panel
@@ -1,8 +1,8 @@
1
1
  # `ixfx-flat-list`
2
2
 
3
- Navigate a tree inside one flat list. Each level shows its branches and leaves together; entering a branch replaces the list with that branch's children. An [`ixfx-crumb-navigation`](../crumbs/README.md) above the scroll area shows the path and jumps to any ancestor.
3
+ Navigate a tree inside one flat list. Each level shows its branches and leaves together; entering a branch replaces the list with that branch's children. An [`ixfx-crumb-navigation`](./crumbs.md) above the scroll area shows the path and jumps to any ancestor.
4
4
 
5
- It wraps [`ixfx-vertical-list`](../vertical-list/README.md), so selection modes, interaction modes, keyboard shortcuts, incremental search, drag-out and drag-select behave as they do there. The data model is the same `TreeNode` / `TreeDataModel` that `ixfx-crumb-navigation` and `ixfx-tree-list` use.
5
+ It wraps [`ixfx-vertical-list`](./vertical-list.md), so selection modes, interaction modes, keyboard shortcuts, incremental search, drag-out and drag-select behave as they do there. The data model is the same `TreeNode` / `TreeDataModel` that `ixfx-crumb-navigation` and `ixfx-tree-list` use.
6
6
 
7
7
  ```html
8
8
  <ixfx-flat-list style="height: 280px"></ixfx-flat-list>
@@ -32,7 +32,7 @@ list.addEventListener('flat-list-activate', ({ detail }) => open(detail.node));
32
32
  | `canDrop` | `(node, dataTransfer) => boolean` | | Refuse a drag up front. `node` is the row, or the current level's node over empty space |
33
33
  | `validateEdit` | `(value, node) => boolean` | | Opts in to [rename](#rename) and validates the typed text |
34
34
  | `markedKey` / `marked-key` | `string` | | Keep this node's row visibly marked across level changes. Not a selection |
35
- | `virtualize`, `itemHeight` / `item-height` | `boolean`, `number` | `false`, `0` | Render only visible rows; needs a fixed row height. See [virtualisation](../vertical-list/README.md#virtualisation) |
35
+ | `virtualize`, `itemHeight` / `item-height` | `boolean`, `number` | `false`, `0` | Render only visible rows; needs a fixed row height. See [virtualisation](./vertical-list.md#virtualisation) |
36
36
  | `withUp` / `with-up` | `boolean` | `true` | Up button in the crumb bar |
37
37
  | `hideRoot` / `hide-root` | `boolean` | `false` | Hide the root crumb |
38
38
  | `emptyText` / `empty-text` | `string` | `'Empty'` | Shown for a level with no children |
@@ -74,14 +74,14 @@ The inner list's `list-*` events also cross the shadow boundary, with row elemen
74
74
  | Click the chevron, double-click, `Enter`, `Arrow Right` on a branch | Enter it |
75
75
  | `Arrow Left`, `Backspace` | Go up. The cursor lands on the branch you came from |
76
76
  | Crumb, caret menu, Up button | Jump to that node. Choosing a leaf from a caret menu shows its level and selects it |
77
- | Everything else | See [vertical-list keyboard navigation](../vertical-list/README.md#keyboard-navigation) |
77
+ | Everything else | See [vertical-list keyboard navigation](./vertical-list.md#keyboard-navigation) |
78
78
 
79
79
  Selection is cleared on every level change. Arrow Left and Backspace are ignored while the search field is focused.
80
80
 
81
81
  ## View state
82
82
 
83
83
  The level shown and its selection, cursor and scroll, as plain JSON for the
84
- host to persist (see [docs/infra-view-state.md](../../docs/infra-view-state.md)):
84
+ host to persist (see [docs/infra-view-state.md](./infra-view-state.md)):
85
85
 
86
86
  ```ts
87
87
  { v: 1, kind: 'flat-list', path: ['docs', 'work'], selected: ['a.txt'], focus: 'a.txt', scroll: { top: 0 } }
@@ -106,7 +106,7 @@ as its rows arrive (see the vertical-list README).
106
106
 
107
107
  ## Drops
108
108
 
109
- With `items-droppable`, a drag over a row, or over empty space, is accepted unless `canDrop` refuses it. A drop fires `flat-list-drop` with that row's node, or the **current level's node** for empty space. Dropping on a branch row reports it and does **not** enter it. Native OS drags work: `dataTransfer` carries `files`, `text/uri-list` and any custom MIME type the source wrote. The row under the drag gets the vertical-list [drop highlight](../vertical-list/README.md#drop-targets).
109
+ With `items-droppable`, a drag over a row, or over empty space, is accepted unless `canDrop` refuses it. A drop fires `flat-list-drop` with that row's node, or the **current level's node** for empty space. Dropping on a branch row reports it and does **not** enter it. Native OS drags work: `dataTransfer` carries `files`, `text/uri-list` and any custom MIME type the source wrote. The row under the drag gets the vertical-list [drop highlight](./vertical-list.md#drop-targets).
110
110
 
111
111
  ## Context menu
112
112
 
@@ -126,7 +126,7 @@ list.beginEdit('set:2'); // e.g. from your own context menu
126
126
 
127
127
  ## Incremental search
128
128
 
129
- Navigate / select / filter search works over the current level, as in [`ixfx-vertical-list`](../vertical-list/README.md#incremental-search) — see [`docs/infra-incremental.md`](../../docs/infra-incremental.md). `search-modes` limits the modes. There is no default shortcut: bind a key or button to `dispatch('list.search.filter')` (or `.navigate` / `.select`). The highlight rule is built in, so no page-level `::highlight()` rule is needed. The search is closed when the level changes.
129
+ Navigate / select / filter search works over the current level, as in [`ixfx-vertical-list`](./vertical-list.md#incremental-search) — see [`docs/infra-incremental.md`](./infra-incremental.md). `search-modes` limits the modes. There is no default shortcut: bind a key or button to `dispatch('list.search.filter')` (or `.navigate` / `.select`). The highlight rule is built in, so no page-level `::highlight()` rule is needed. The search is closed when the level changes.
130
130
 
131
131
  ## CSS variables
132
132
 
@@ -329,7 +329,7 @@ items directly, independent of search; the data-mode equivalent is
329
329
  `itemFilterPredicate` (`(item, index) => boolean`). Filtering removes items from
330
330
  layout and navigation without materialising anything in data mode. Limit modes
331
331
  with `search-modes="navigate filter"`. Full model:
332
- [`docs/infra-incremental.md`](../../docs/infra-incremental.md).
332
+ [`docs/infra-incremental.md`](./infra-incremental.md).
333
333
 
334
334
  ---
335
335
 
@@ -428,7 +428,7 @@ operations.
428
428
 
429
429
  ## Grouping
430
430
 
431
- Group items under collapsible headers, following `ixfx-data-grid` (see its [Grouping](../data-grid/README.md#grouping) section).
431
+ Group items under collapsible headers, following `ixfx-data-grid` (see its [Grouping](./data-grid.md#grouping) section).
432
432
 
433
433
  ```ts
434
434
  grid.groupBy = 'kind'; // data mode: item property · element mode: data-kind attribute
@@ -463,7 +463,7 @@ Differences from data-grid: group state is reset on every `groupBy` change, the
463
463
 
464
464
  Snapshot and restore how the grid is showing its data, separately from the
465
465
  data. The contract is shared with the other list components; see
466
- [`docs/infra-view-state.md`](../../docs/infra-view-state.md).
466
+ [`docs/infra-view-state.md`](./infra-view-state.md).
467
467
 
468
468
  ```ts
469
469
  import { bindViewState } from '@ixfx/components';
@@ -2,7 +2,7 @@
2
2
 
3
3
  `<ixfx-hyperbolictree-list>` — a hyperbolic (Poincaré disk) browser over tree data. The focused node sits at the disk's center; its neighbourhood fans outward, shrinking toward the edge with tree-graph distance. Clicking a node re-centers the disk on it with an animated Möbius transform — the underlying layout never changes, only the projection.
4
4
 
5
- It implements the shared `TreeComponent` interface (see [`src/tree/README.md`](../tree/README.md)), so `TreeDataModel`, `IncrSearchTreeController`, and any `TreeComponent`-typed code work unmodified.
5
+ It implements the shared `TreeComponent` interface (see [`src/tree/README.md`](./tree.md)), so `TreeDataModel`, `IncrSearchTreeController`, and any `TreeComponent`-typed code work unmodified.
6
6
 
7
7
  ---
8
8
 
@@ -36,7 +36,7 @@ It implements the shared `TreeComponent` interface (see [`src/tree/README.md`](.
36
36
 
37
37
  ## Data model
38
38
 
39
- Same `TreeNode` / `TreeItem` shapes as the rest of the tree family (see [`src/tree/README.md`](../tree/README.md#data-model)), including `root`, `model` (`TreeDataModel`), and `loadChildren` for lazy loading.
39
+ Same `TreeNode` / `TreeItem` shapes as the rest of the tree family (see [`src/tree/README.md`](./tree.md#data-model)), including `root`, `model` (`TreeDataModel`), and `loadChildren` for lazy loading.
40
40
 
41
41
  Keys only need to be unique **among siblings**: internally each node is identified by its key *path* from the root (`HyperbolicLayoutNode.id`), so data like a file system — where `readme.md` recurs in many folders — lays out and focuses correctly. Key-based lookups that can't know the path (`focusedKey` when given a bare key, `revealKey`, `::part(node-<key>)`) match the first node, depth-first, carrying that key.
42
42
 
@@ -58,7 +58,7 @@ el.root = {
58
58
  | `model` | `TreeDataModel \| undefined` | `undefined` | Shared data model; takes precedence over `loadChildren` |
59
59
  | `loadChildren` | `LoadChildrenCallback \| undefined` | `undefined` | Callback for lazy child loading |
60
60
  | `restoreLoads` | `boolean` | `true` | Whether restoring a saved `center` may load its unloaded ancestors. See [View state](#view-state) |
61
- | `interactionMode` (`interaction-mode`) | `'implicit' \| 'standard' \| 'manual'` | `'standard'` | Gesture mapping — see [`src/tree/README.md`](../tree/README.md#interactionmode-ixfx-tree-list--ixfx-miller-list) (`'checked'` is unsupported here) |
61
+ | `interactionMode` (`interaction-mode`) | `'implicit' \| 'standard' \| 'manual'` | `'standard'` | Gesture mapping — see [`src/tree/README.md`](./tree.md#interactionmode-ixfx-tree-list--ixfx-miller-list) (`'checked'` is unsupported here) |
62
62
  | `selectionFilter` (`selection-filter`) | `'none' \| 'leaf' \| 'branch' \| 'all'` | `'all'` | Which node kinds can be selected |
63
63
  | `exclusivity` | `TreeExclusivity` | `'none'` | Accepted for interface compatibility, ignored |
64
64
  | `filterPredicate` | `TreeFilterPredicate \| undefined` | `undefined` | Non-matching nodes (and branches with no matching descendant) are dimmed, not hidden |
@@ -80,7 +80,7 @@ el.root = {
80
80
  | `focusAnimationDuration` (`focus-animation-duration`) | `number` | `400` | Duration (ms) of the animated re-center on focus change; `0` snaps instantly. Respects `prefers-reduced-motion` |
81
81
  | `edgeRenderer` | `HyperbolicEdgeRenderer \| undefined` | `undefined` | Custom renderer for edges, in place of the default geodesic-arc path |
82
82
  | `disableKeyboardNavigation` (`disable-keyboard-navigation`) | `boolean` | `false` | Disables the keyboard handlers below |
83
- | `searchModes` (`search-modes`) | `string \| undefined` | `undefined` | Space-separated subset of `navigate select filter` — see [`src/tree/README.md`](../tree/README.md#incremental-search) |
83
+ | `searchModes` (`search-modes`) | `string \| undefined` | `undefined` | Space-separated subset of `navigate select filter` — see [`src/tree/README.md`](./tree.md#incremental-search) |
84
84
  | `selectedNode` | `TreeNode \| undefined` | `undefined` | Primary (most recent) selected node |
85
85
  | `selectedNodes` | `ReadonlySet<TreeNode>` | `{}` | Full selection set (read-only) |
86
86
  | `focusedNode` | `TreeNode \| undefined` (read-only) | true root | The node currently centered on the disk. Pure view-state — `root` is never mutated by focus changes |
@@ -256,7 +256,7 @@ const nodes = el.getNodes(); // ReadonlyArray<{ node: TreeNode; depth: number }>
256
256
 
257
257
  ## View state
258
258
 
259
- Implements the shared view-state API (`getViewState()` / `setViewState()` / `clearPendingViewState()` / `view-state-change`) — see [`docs/infra-view-state.md`](../../docs/infra-view-state.md). `kind` is `hyperbolictree-list`.
259
+ Implements the shared view-state API (`getViewState()` / `setViewState()` / `clearPendingViewState()` / `view-state-change`) — see [`docs/infra-view-state.md`](./infra-view-state.md). `kind` is `hyperbolictree-list`.
260
260
 
261
261
  ```typescript
262
262
  type HyperbolicTreeListViewState = ViewStateBase & {
@@ -386,4 +386,4 @@ type HyperbolicLayoutEdge = {
386
386
  };
387
387
  ```
388
388
 
389
- See [`src/tree/README.md`](../tree/README.md) for `TreeNode`, `TreeItem` (including `weight`), `TreeDataModel`, `TreeComponent`, and incremental search — all shared with the rest of the tree family.
389
+ See [`src/tree/README.md`](./tree.md) for `TreeNode`, `TreeItem` (including `weight`), `TreeDataModel`, `TreeComponent`, and incremental search — all shared with the rest of the tree family.
@@ -2,13 +2,13 @@
2
2
 
3
3
  `<ixfx-icicletree-list>` — an icicle (partition) view over tree data. Each depth is a band; each node a rectangle sized by its `valueAccessor` share of its parent. Clicking a branch zooms so it becomes the visual root, with its ancestors in a breadcrumb strip.
4
4
 
5
- It implements the shared `TreeComponent` interface (see [`src/tree/README.md`](../tree/README.md)). The [sunburst](../sunburst-tree/) is its polar counterpart.
5
+ It implements the shared `TreeComponent` interface (see [`src/tree/README.md`](./tree.md)). The [sunburst](./sunburst-tree.md) is its polar counterpart.
6
6
 
7
7
  ---
8
8
 
9
9
  ## View state
10
10
 
11
- Implements the shared view-state API (`getViewState()` / `setViewState()` / `clearPendingViewState()` / `view-state-change`) — see [`docs/infra-view-state.md`](../../docs/infra-view-state.md). `kind` is `icicletree-list`.
11
+ Implements the shared view-state API (`getViewState()` / `setViewState()` / `clearPendingViewState()` / `view-state-change`) — see [`docs/infra-view-state.md`](./infra-view-state.md). `kind` is `icicletree-list`.
12
12
 
13
13
  | Field | Type | Meaning |
14
14
  |---|---|---|
@@ -6,7 +6,7 @@ Utilities for incremental (type-ahead) search over data collections or DOM-backe
6
6
  popover in `ixfx-grid-list` / `ixfx-vertical-list` / `ixfx-detail-list` /
7
7
  `ixfx-data-grid` / `ixfx-tree-list` / `ixfx-miller-list`. Three modes
8
8
  (navigate / select / filter), driven by `list.search.*` commands. See
9
- [`docs/infra-incremental.md`](../../docs/infra-incremental.md) — start there
9
+ [`docs/infra-incremental.md`](./infra-incremental.md) — start there
10
10
  for anything component-facing.
11
11
  - **`createIncrSearch`** — the low-level fuzzy engine (fzf) both the controller
12
12
  and the helpers below are built on.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@ixfx/components",
3
- "version": "0.16.3",
4
- "generated": "2026-11-02T20:40:41.501Z",
3
+ "version": "0.16.4",
4
+ "generated": "2026-11-02T21:02:52.405Z",
5
5
  "components": [
6
6
  {
7
7
  "name": "ac-text",
@@ -305,10 +305,30 @@
305
305
  }
306
306
  ],
307
307
  "overviews": [
308
+ {
309
+ "name": "infra-handle.md",
310
+ "path": "docs-user/infra-handle.md"
311
+ },
312
+ {
313
+ "name": "infra-incremental.md",
314
+ "path": "docs-user/infra-incremental.md"
315
+ },
316
+ {
317
+ "name": "infra-theming.md",
318
+ "path": "docs-user/infra-theming.md"
319
+ },
308
320
  {
309
321
  "name": "infra-tickled.md",
310
322
  "path": "docs-user/infra-tickled.md"
311
323
  },
324
+ {
325
+ "name": "infra-view-state.md",
326
+ "path": "docs-user/infra-view-state.md"
327
+ },
328
+ {
329
+ "name": "list-state.md",
330
+ "path": "docs-user/list-state.md"
331
+ },
312
332
  {
313
333
  "name": "user-catalog.md",
314
334
  "path": "docs-user/user-catalog.md"