@ixfx/components 0.2.5 → 0.3.0

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 (216) hide show
  1. package/bundle/index.d.ts +365 -143
  2. package/bundle/index.d.ts.map +1 -1
  3. package/bundle/index.js +2330 -826
  4. package/bundle/index.js.map +1 -1
  5. package/dist/ac-text.d.ts +2 -3
  6. package/dist/ac-text.d.ts.map +1 -1
  7. package/dist/ac-text.js +5 -5
  8. package/dist/ac-text.js.map +1 -1
  9. package/dist/{button-DgKUzE5o.js → button-DMt5XWUK.js} +6 -6
  10. package/dist/button-DMt5XWUK.js.map +1 -0
  11. package/dist/button.d.ts +3 -4
  12. package/dist/button.d.ts.map +1 -1
  13. package/dist/button.js +1 -1
  14. package/dist/checkbox.d.ts +3 -5
  15. package/dist/checkbox.d.ts.map +1 -1
  16. package/dist/checkbox.js +3 -3
  17. package/dist/checkbox.js.map +1 -1
  18. package/dist/{colour-C3MQIjFJ-BJV-QC-3.js → colour-C3MQIjFJ-BLXg8W3U.js} +2 -2
  19. package/dist/{colour-C3MQIjFJ-BJV-QC-3.js.map → colour-C3MQIjFJ-BLXg8W3U.js.map} +1 -1
  20. package/dist/{colour-picker-Bw-AZoWx.js → colour-picker-K6zu82lm.js} +8 -8
  21. package/dist/colour-picker-K6zu82lm.js.map +1 -0
  22. package/dist/colour-picker.d.ts +2 -2
  23. package/dist/colour-picker.js +1 -1
  24. package/dist/crumbs.d.ts +4 -6
  25. package/dist/crumbs.d.ts.map +1 -1
  26. package/dist/crumbs.js +12 -12
  27. package/dist/crumbs.js.map +1 -1
  28. package/dist/data-display.d.ts +1 -2
  29. package/dist/data-display.d.ts.map +1 -1
  30. package/dist/data-display.js +4 -5
  31. package/dist/data-display.js.map +1 -1
  32. package/dist/decorate-D7rC1gLP.js +27 -0
  33. package/dist/decorate-D7rC1gLP.js.map +1 -0
  34. package/dist/{defaults-FEZaGiYZ.js → defaults-C7elhuyJ.js} +2 -2
  35. package/dist/{defaults-FEZaGiYZ.js.map → defaults-C7elhuyJ.js.map} +1 -1
  36. package/dist/{dist-By5URG0Y.js → dist-BX0OVIm7.js} +2 -2
  37. package/dist/{dist-By5URG0Y.js.map → dist-BX0OVIm7.js.map} +1 -1
  38. package/dist/{dist-D7kJgnSE.js → dist-TAGYwaju.js} +1 -1
  39. package/dist/{dist-D7kJgnSE.js.map → dist-TAGYwaju.js.map} +1 -1
  40. package/dist/editable-label.d.ts +6 -1
  41. package/dist/editable-label.d.ts.map +1 -1
  42. package/dist/editable-label.js +51 -4
  43. package/dist/editable-label.js.map +1 -1
  44. package/dist/{hex-editor-Wd6ZtZA2.js → hex-editor-CsN_ySkH.js} +87 -87
  45. package/dist/hex-editor-CsN_ySkH.js.map +1 -0
  46. package/dist/{hex-editor-Gib1Grg2.d.ts → hex-editor-DlfoA65y.d.ts} +7 -8
  47. package/dist/hex-editor-DlfoA65y.d.ts.map +1 -0
  48. package/dist/hex.d.ts +1 -1
  49. package/dist/hex.js +1 -1
  50. package/dist/{highlight-CAjwQ4GE.js → highlight-TPbSHruI.js} +3 -3
  51. package/dist/highlight-TPbSHruI.js.map +1 -0
  52. package/dist/{icon-BR5aTIiP.js → icon-9NWTXtE1.js} +6 -7
  53. package/dist/icon-9NWTXtE1.js.map +1 -0
  54. package/dist/{icon-DQKdfR7U.d.ts → icon-CeTDJhC7.d.ts} +3 -4
  55. package/dist/icon-CeTDJhC7.d.ts.map +1 -0
  56. package/dist/icons.d.ts +2 -2
  57. package/dist/icons.js +3 -3
  58. package/dist/icons.js.map +1 -1
  59. package/dist/{incr-search-BjCNClnC.js → incr-search-DSKKsk6w.js} +119 -117
  60. package/dist/incr-search-DSKKsk6w.js.map +1 -0
  61. package/dist/incr-search.d.ts +2 -2
  62. package/dist/incr-search.js +2 -2
  63. package/dist/{index-CPVcTTXo.d.ts → index--hrxPBkQ.d.ts} +73 -74
  64. package/dist/index--hrxPBkQ.d.ts.map +1 -0
  65. package/dist/index-B1hNR7Z9.d.ts.map +1 -1
  66. package/dist/{index-CpbBI3n7.d.ts → index-CnL9krsH.d.ts} +3 -4
  67. package/dist/index-CnL9krsH.d.ts.map +1 -0
  68. package/dist/{index-CQxanqXF.d.ts → index-DSlPeWLK.d.ts} +28 -29
  69. package/dist/index-DSlPeWLK.d.ts.map +1 -0
  70. package/dist/{index-C5dK8RZa.d.ts → index-DrQjA8Gs.d.ts} +3 -4
  71. package/dist/index-DrQjA8Gs.d.ts.map +1 -0
  72. package/dist/{index-C9iBN908.d.ts → index-hXFn14tM.d.ts} +32 -32
  73. package/dist/index-hXFn14tM.d.ts.map +1 -0
  74. package/dist/index.d.ts +246 -32
  75. package/dist/index.d.ts.map +1 -1
  76. package/dist/index.js +1464 -32
  77. package/dist/index.js.map +1 -1
  78. package/dist/keyboard-De_vOHLg.js.map +1 -1
  79. package/dist/{labelled-input-base-DS6-6C0r.js → labelled-input-base-CqPL5rKm.js} +2 -2
  80. package/dist/labelled-input-base-CqPL5rKm.js.map +1 -0
  81. package/dist/{labelled-input-base-DnRh4reU.d.ts → labelled-input-base-D-Y7agky.d.ts} +2 -3
  82. package/dist/labelled-input-base-D-Y7agky.d.ts.map +1 -0
  83. package/dist/labelled-radial-input.d.ts +4 -5
  84. package/dist/labelled-radial-input.d.ts.map +1 -1
  85. package/dist/labelled-radial-input.js +5 -5
  86. package/dist/labelled-radial-input.js.map +1 -1
  87. package/dist/labelled-range-input.d.ts +1 -1
  88. package/dist/labelled-range-input.js +4 -4
  89. package/dist/labelled-range-input.js.map +1 -1
  90. package/dist/led.d.ts +2 -3
  91. package/dist/led.d.ts.map +1 -1
  92. package/dist/led.js +3 -3
  93. package/dist/led.js.map +1 -1
  94. package/dist/{menu-BV6UFx_z.js → menu-DJJuCm-5.js} +55 -55
  95. package/dist/menu-DJJuCm-5.js.map +1 -0
  96. package/dist/{menu-item-DEzL_Yjk.js → menu-item-CKRfP0pN.js} +14 -14
  97. package/dist/menu-item-CKRfP0pN.js.map +1 -0
  98. package/dist/{menu-item-Cikacp4F.d.ts → menu-item-ClQF2DKN.d.ts} +7 -8
  99. package/dist/menu-item-ClQF2DKN.d.ts.map +1 -0
  100. package/dist/menu.d.ts +3 -3
  101. package/dist/menu.js +2 -2
  102. package/dist/miller.d.ts +7 -10
  103. package/dist/miller.d.ts.map +1 -1
  104. package/dist/miller.js +17 -17
  105. package/dist/miller.js.map +1 -1
  106. package/dist/narrowed-text.d.ts +2 -3
  107. package/dist/narrowed-text.d.ts.map +1 -1
  108. package/dist/narrowed-text.js +6 -6
  109. package/dist/narrowed-text.js.map +1 -1
  110. package/dist/panel.d.ts +2 -3
  111. package/dist/panel.d.ts.map +1 -1
  112. package/dist/panel.js +4 -4
  113. package/dist/panel.js.map +1 -1
  114. package/dist/plots.d.ts +1 -1
  115. package/dist/plots.js +1 -1
  116. package/dist/polar-pad.d.ts +1 -2
  117. package/dist/polar-pad.d.ts.map +1 -1
  118. package/dist/polar-pad.js +3 -3
  119. package/dist/polar-pad.js.map +1 -1
  120. package/dist/{popup-Ddx9LCzY.js → popup-ImtS9KnS.js} +1 -1
  121. package/dist/{popup-Ddx9LCzY.js.map → popup-ImtS9KnS.js.map} +1 -1
  122. package/dist/{prominence-CreDBdCs.js → prominence--ic9uWBl.js} +1 -1
  123. package/dist/{prominence-CreDBdCs.js.map → prominence--ic9uWBl.js.map} +1 -1
  124. package/dist/{radial-input-CNJ8asY2.js → radial-input-DZA6WaFu.js} +16 -16
  125. package/dist/radial-input-DZA6WaFu.js.map +1 -0
  126. package/dist/{radial-input-xSTd4kEz.d.ts → radial-input-LUSBEycd.d.ts} +2 -3
  127. package/dist/radial-input-LUSBEycd.d.ts.map +1 -0
  128. package/dist/radial-input.d.ts +1 -1
  129. package/dist/radial-input.js +1 -1
  130. package/dist/range-input.d.ts +2 -3
  131. package/dist/range-input.d.ts.map +1 -1
  132. package/dist/range-input.js +3 -3
  133. package/dist/range-input.js.map +1 -1
  134. package/dist/range.d.ts +2 -3
  135. package/dist/range.d.ts.map +1 -1
  136. package/dist/range.js +4 -4
  137. package/dist/range.js.map +1 -1
  138. package/dist/{registry-CZEB1YI9.js → registry-Q2gYQCHM.js} +1 -1
  139. package/dist/{registry-CZEB1YI9.js.map → registry-Q2gYQCHM.js.map} +1 -1
  140. package/dist/selecthorizontal.d.ts +2 -3
  141. package/dist/selecthorizontal.d.ts.map +1 -1
  142. package/dist/selecthorizontal.js +3 -3
  143. package/dist/selecthorizontal.js.map +1 -1
  144. package/dist/snap-container.d.ts +1 -2
  145. package/dist/snap-container.d.ts.map +1 -1
  146. package/dist/snap-container.js +3 -3
  147. package/dist/snap-container.js.map +1 -1
  148. package/dist/split-layout.d.ts +2 -3
  149. package/dist/split-layout.d.ts.map +1 -1
  150. package/dist/split-layout.js +6 -6
  151. package/dist/split-layout.js.map +1 -1
  152. package/dist/swipe.d.ts +1 -2
  153. package/dist/swipe.d.ts.map +1 -1
  154. package/dist/swipe.js +4 -4
  155. package/dist/swipe.js.map +1 -1
  156. package/dist/{tab-list-CFF7uSYH.d.ts → tab-list-BnqISNvO.d.ts} +5 -6
  157. package/dist/tab-list-BnqISNvO.d.ts.map +1 -0
  158. package/dist/tabs.d.ts +1 -1
  159. package/dist/tabs.js +4 -4
  160. package/dist/tabs.js.map +1 -1
  161. package/dist/tickled-controller-Cq1Va0rR.d.ts.map +1 -1
  162. package/dist/tickled-styles-Bg3QbcrD.js.map +1 -1
  163. package/dist/{timeline-DBWJsSjd.js → timeline-Cv75Th2U.js} +123 -119
  164. package/dist/timeline-Cv75Th2U.js.map +1 -0
  165. package/dist/timeline.d.ts +2 -2
  166. package/dist/timeline.js +1 -1
  167. package/dist/{tooltip-kfUBWYVB.d.ts → tooltip-CwGfb4lp.d.ts} +2 -3
  168. package/dist/tooltip-CwGfb4lp.d.ts.map +1 -0
  169. package/dist/tree-CvvKbO-f.js +1330 -0
  170. package/dist/tree-CvvKbO-f.js.map +1 -0
  171. package/dist/{tree-component-CQpoPo4s.d.ts → tree-component-D8Bg48tt.d.ts} +12 -12
  172. package/dist/tree-component-D8Bg48tt.d.ts.map +1 -0
  173. package/dist/tree.d.ts +4 -5
  174. package/dist/tree.d.ts.map +1 -1
  175. package/dist/tree.js +1 -1143
  176. package/dist/types-BKaqnpwx.d.ts.map +1 -1
  177. package/dist/{xy-axis-CIFok7MF.d.ts → xy-axis-D9uwpGTT.d.ts} +5 -6
  178. package/dist/xy-axis-D9uwpGTT.d.ts.map +1 -0
  179. package/dist/{xy-axis-BANbgrI5.js → xy-axis-DL0tfJDr.js} +13 -13
  180. package/dist/xy-axis-DL0tfJDr.js.map +1 -0
  181. package/dist/xy-pad.d.ts +1 -2
  182. package/dist/xy-pad.d.ts.map +1 -1
  183. package/dist/xy-pad.js +4 -4
  184. package/dist/xy-pad.js.map +1 -1
  185. package/package.json +17 -13
  186. package/dist/button-DgKUzE5o.js.map +0 -1
  187. package/dist/colour-picker-Bw-AZoWx.js.map +0 -1
  188. package/dist/decorate-BZbkqIhA.js +0 -9
  189. package/dist/hex-editor-Gib1Grg2.d.ts.map +0 -1
  190. package/dist/hex-editor-Wd6ZtZA2.js.map +0 -1
  191. package/dist/highlight-CAjwQ4GE.js.map +0 -1
  192. package/dist/icon-BR5aTIiP.js.map +0 -1
  193. package/dist/icon-DQKdfR7U.d.ts.map +0 -1
  194. package/dist/incr-search-BjCNClnC.js.map +0 -1
  195. package/dist/index-C5dK8RZa.d.ts.map +0 -1
  196. package/dist/index-C9iBN908.d.ts.map +0 -1
  197. package/dist/index-CPVcTTXo.d.ts.map +0 -1
  198. package/dist/index-CQxanqXF.d.ts.map +0 -1
  199. package/dist/index-CpbBI3n7.d.ts.map +0 -1
  200. package/dist/labelled-input-base-DS6-6C0r.js.map +0 -1
  201. package/dist/labelled-input-base-DnRh4reU.d.ts.map +0 -1
  202. package/dist/menu-BV6UFx_z.js.map +0 -1
  203. package/dist/menu-item-Cikacp4F.d.ts.map +0 -1
  204. package/dist/menu-item-DEzL_Yjk.js.map +0 -1
  205. package/dist/radial-input-CNJ8asY2.js.map +0 -1
  206. package/dist/radial-input-xSTd4kEz.d.ts.map +0 -1
  207. package/dist/tab-list-CFF7uSYH.d.ts.map +0 -1
  208. package/dist/timeline-DBWJsSjd.js.map +0 -1
  209. package/dist/tooltip-kfUBWYVB.d.ts.map +0 -1
  210. package/dist/tree-component-CQpoPo4s.d.ts.map +0 -1
  211. package/dist/tree-data-model-DGvRVOFY.js +0 -190
  212. package/dist/tree-data-model-DGvRVOFY.js.map +0 -1
  213. package/dist/tree.js.map +0 -1
  214. package/dist/xy-axis-BANbgrI5.js.map +0 -1
  215. package/dist/xy-axis-CIFok7MF.d.ts.map +0 -1
  216. /package/dist/{interaction-CQDQJf2Q.js → interaction-DG7X1rhI.js} +0 -0
package/dist/tree.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"tree.js","names":["#getAllNodes","#getFocusedIndex","#setFocusedIndex","#extendRangeSelection","#anchor","#toggleExpand","#toggleSelection","#abortPending","#clearSelectionInternal","#modelUnsubscribe","#config","#canSelect","#dispatchSelect","#applyExclusivity","#scrollKeyIntoView","#findNodePath","#pendingNode","#handleImplicitClick","#handleStandardClick","#handleManualClick","#handleExpandOnly","#getFlatIndexOf","#allDescendantsSelected","#applyCheckedToggle","#pendingController","#invokeLoadChildren","#matchesFilter","#collapseSiblingsAtDepth","#findAncestorKeys","#findParent","#getVisibleNodes","#scrollTickledIntoView","#onKeyDown","#onDblClick","#renderNodes","#root","#element","#options","#connectSignal","#childrenOf","#nodeToTree","#findTreePath","#findInChildren","#toTreeNode","#identityToTreeNode","#detectIcons","#depthsWithIcons"],"sources":["../src/tree/tree-base.ts","../src/tree/tree-controller.ts","../src/tree/tree-list.ts"],"sourcesContent":["import type { PropertyValues, TemplateResult } from 'lit';\nimport type { TreeSearchHost } from '../common/searchable.js';\nimport type {\n TreeActivateDetail,\n TreeActivateEvent,\n TreeCollapseDetail,\n TreeCollapseEvent,\n TreeComponent,\n TreeComponentEventMap,\n TreeExpandDetail,\n TreeExpandEvent,\n TreeItemClickDetail,\n TreeItemClickEvent,\n TreeSelectDetail,\n TreeSelectEvent,\n TreeTickleDetail,\n TreeTickleEvent,\n} from '../common/tree-component.js';\nimport type { TreeDataModel } from '../common/tree-data-model.js';\nimport type {\n LoadChildrenCallback,\n TreeExclusivity,\n TreeFilterPredicate,\n TreeInteractionMode,\n TreeNode,\n TreeSelectionFilter,\n} from '../common/types.js';\nimport type { TreeConfig } from './types.js';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { tickledStyles, tickledItemStyles } from '../interaction/index.js';\nimport { TickledController } from '../interaction/tickled-controller.js';\n\n@customElement(`ixfx-tree-base`)\nexport class TreeBaseElement extends LitElement implements TreeComponent, TreeSearchHost {\n @property({ type: Object })\n root: TreeNode | undefined;\n\n @property({ attribute: false })\n model: TreeDataModel | undefined;\n\n /** Callback to lazily load children for a node. Superseded by `model` when both are set. */\n @property({ attribute: false })\n loadChildren: LoadChildrenCallback | undefined;\n\n @property({ reflect: true, attribute: `exclusivity` })\n exclusivity: TreeExclusivity = `none`;\n\n @property({ reflect: true, attribute: `selection-filter` })\n selectionFilter: TreeSelectionFilter = `all`;\n\n /** Controls how pointer/keyboard gestures map to selection changes. Default: `'standard'`. */\n @property({ type: String, attribute: `interaction-mode` })\n interactionMode: TreeInteractionMode = `standard`;\n\n @property({ attribute: false })\n selectedNode: TreeNode | undefined;\n\n @state()\n protected _selectedNodes = new Set<TreeNode>();\n\n get selectedNodes(): ReadonlySet<TreeNode> {\n return this._selectedNodes;\n }\n\n @property({ attribute: false })\n filterPredicate: TreeFilterPredicate | undefined;\n\n @property({ type: Boolean, attribute: `disable-keyboard-navigation` })\n disableKeyboardNavigation = false;\n\n @state()\n protected _expandedKeys = new Set<string>();\n\n protected tickled = new TickledController<string>(this, {\n getItems: () => {\n const nodes = this.#getAllNodes();\n return nodes.map(({ node }) => ({ id: node.item.key, enabled: true }));\n },\n onStateChange: () => {\n this.setAttribute(`data-input-mode`, this.tickled.inputMode);\n },\n });\n\n @state()\n protected _focusedDepth = 0;\n\n #pendingNode: TreeNode | undefined;\n #pendingController: AbortController | undefined;\n #modelUnsubscribe: (() => void) | undefined;\n // Range-select anchor: the flat-list index and node from which a Shift-range is measured.\n #anchor: { node: TreeNode; flatIndex: number; selectionSnapshot?: ReadonlySet<TreeNode> } | undefined;\n\n #config: TreeConfig = {\n indent: 20,\n };\n\n override updated(changedProps: PropertyValues) {\n if (changedProps.has(`root`) && this.root) {\n this.#abortPending();\n this._expandedKeys.clear();\n this.#clearSelectionInternal();\n this.tickled.clearTickled();\n this._focusedDepth = 0;\n }\n\n if (changedProps.has(`model`)) {\n this.#modelUnsubscribe?.();\n this.#modelUnsubscribe = undefined;\n const model = this.model;\n if (model) {\n this.root = model.root;\n this.#modelUnsubscribe = model._subscribe((event) => {\n if (event.type === `root`) {\n this.root = event.root;\n this.requestUpdate();\n } else if (event.type === `invalidate`) {\n // If the invalidated node is currently expanded, collapse it\n if (this._expandedKeys.has(event.key)) {\n this._expandedKeys.delete(event.key);\n this.requestUpdate();\n }\n }\n });\n }\n }\n\n if (changedProps.has(`interactionMode`)) {\n this.#anchor = undefined;\n this.clearSelection();\n }\n\n // When selectedNode is set externally, sync focus to match\n if (changedProps.has(`selectedNode`) && this.selectedNode) {\n const prev = changedProps.get(`selectedNode`) as TreeNode | undefined;\n if (prev !== this.selectedNode) {\n this.tickled.setTickled(this.selectedNode.item.key);\n }\n }\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.setAttribute(`data-input-mode`, `mouse`);\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n this.#modelUnsubscribe?.();\n this.#modelUnsubscribe = undefined;\n }\n\n getConfig(): TreeConfig {\n return { ...this.#config };\n }\n\n setConfig(config: Partial<TreeConfig>) {\n this.#config = { ...this.#config, ...config };\n this.requestUpdate();\n }\n\n // --- Programmatic selection ---\n\n select(node: TreeNode): void {\n if (!this.#canSelect(node))\n return;\n const prev = new Set(this._selectedNodes);\n this._selectedNodes.clear();\n this._selectedNodes.add(node);\n this.selectedNode = node;\n this.#dispatchSelect(prev);\n this.requestUpdate();\n }\n\n deselect(node: TreeNode): void {\n if (!this._selectedNodes.has(node))\n return;\n const prev = new Set(this._selectedNodes);\n this._selectedNodes.delete(node);\n if (this.selectedNode === node) {\n this.selectedNode = [...this._selectedNodes].at(-1);\n }\n this.#dispatchSelect(prev);\n this.requestUpdate();\n }\n\n clearSelection(): void {\n if (this._selectedNodes.size === 0)\n return;\n const prev = new Set(this._selectedNodes);\n this.#clearSelectionInternal();\n this.#dispatchSelect(prev);\n this.requestUpdate();\n }\n\n // --- Navigation ---\n\n navigateTo(keys: readonly string[]): boolean {\n if (!this.root?.children)\n return false;\n\n this.#abortPending();\n this.#clearSelectionInternal();\n this.tickled.clearTickled();\n this._focusedDepth = 0;\n\n let currentNode: TreeNode | undefined = this.root;\n\n for (const key of keys) {\n const children: TreeNode[] | undefined = currentNode?.children;\n if (!children)\n return false;\n\n const found: TreeNode | undefined = children.find(n => n.item.key === key);\n if (!found)\n return false;\n\n this.#applyExclusivity(found.item.key);\n this._expandedKeys.add(found.item.key);\n\n if (key === keys.at(-1)) {\n this.select(found);\n this.tickled.setTickled(found.item.key);\n }\n\n currentNode = found;\n }\n\n this.requestUpdate();\n this.#scrollKeyIntoView(keys.at(-1)!);\n return true;\n }\n\n navigateToNode(predicate: (node: TreeNode) => boolean): boolean {\n if (!this.root?.children)\n return false;\n const keyPath = this.#findNodePath(this.root.children, predicate);\n if (!keyPath)\n return false;\n return this.navigateTo(keyPath);\n }\n\n getNodes(): ReadonlyArray<{ node: TreeNode; depth: number }> {\n if (!this.root?.children)\n return [];\n const result: Array<{ node: TreeNode; depth: number }> = [];\n const visit = (node: TreeNode, depth: number) => {\n result.push({ node, depth });\n if (node.children) {\n for (const child of node.children) visit(child, depth + 1);\n }\n };\n for (const child of this.root.children) visit(child, 0);\n return result;\n }\n\n // --- Internal helpers ---\n\n #canSelect(node: TreeNode): boolean {\n if (this.selectionFilter === `none`)\n return false;\n if (this.selectionFilter === `leaf`)\n return node.item.isLeaf === true;\n if (this.selectionFilter === `branch`)\n return node.item.isLeaf === false || (node.children !== undefined && node.children.length > 0);\n return true;\n }\n\n #clearSelectionInternal(): void {\n this._selectedNodes.clear();\n this.selectedNode = undefined;\n }\n\n #dispatchSelect(previous: ReadonlySet<TreeNode>): void {\n const detail: TreeSelectDetail = {\n selected: new Set(this._selectedNodes),\n previous,\n };\n this.dispatchEvent(new CustomEvent<TreeSelectDetail>(`select`, {\n detail,\n bubbles: true,\n composed: true,\n }));\n }\n\n #findNodePath(\n nodes: TreeNode[],\n predicate: (node: TreeNode) => boolean,\n prefix: string[] = [],\n ): string[] | undefined {\n for (const node of nodes) {\n const path = [...prefix, node.item.key];\n if (predicate(node))\n return path;\n if (node.children?.length) {\n const result = this.#findNodePath(node.children, predicate, path);\n if (result)\n return result;\n }\n }\n return undefined;\n }\n\n protected renderNodeContent(node: TreeNode, _depth: number): TemplateResult | typeof nothing {\n const isBranch = node.item.isLeaf !== true;\n const isExpanded = this._isExpanded(node);\n return html`\n <span class=\"tree-caret\">\n ${isBranch ? html`<ixfx-icon class=\"caret-icon\" name=\"chevron-down\" .rotate=${isExpanded ? nothing : `-90deg`}></ixfx-icon>` : ``}\n </span>\n <span class=\"tree-label\">${node.item.label}</span>\n `;\n }\n\n protected _handleItemClick(node: TreeNode, depth: number, event?: MouseEvent) {\n if (this.#pendingNode && this._expandedKeys.has(this.#pendingNode.item.key)) {\n this.#abortPending();\n }\n\n this.tickled.handlePointerEnter(node.item.key);\n this._focusedDepth = depth;\n\n this.dispatchEvent(new CustomEvent<TreeItemClickDetail>(`item-click`, {\n detail: { node, depth },\n bubbles: true,\n composed: true,\n }));\n\n switch (this.interactionMode) {\n case `implicit`: this.#handleImplicitClick(node, depth); break;\n case `standard`: this.#handleStandardClick(node, depth, event); break;\n case `vscode`: this.#handleStandardClick(node, depth, event); break;\n case `manual`: this.#handleManualClick(node, depth, event); break;\n case `checked`: this.#handleExpandOnly(node, depth); break;\n }\n\n this.requestUpdate();\n }\n\n #handleImplicitClick(node: TreeNode, depth: number): void {\n if (this.#canSelect(node)) {\n const prev = new Set(this._selectedNodes);\n this._selectedNodes.clear();\n this._selectedNodes.add(node);\n this.selectedNode = node;\n if (!prev.has(node) || prev.size !== 1)\n this.#dispatchSelect(prev);\n }\n this.#toggleExpand(node, depth);\n }\n\n #handleStandardClick(node: TreeNode, depth: number, event?: MouseEvent): void {\n const isMeta = event ? (event.metaKey || event.ctrlKey) : false;\n const isShift = event ? event.shiftKey : false;\n\n if (isMeta) {\n if (this.#canSelect(node)) {\n const prev = new Set(this._selectedNodes);\n if (this._selectedNodes.has(node)) {\n this._selectedNodes.delete(node);\n if (this.selectedNode === node)\n this.selectedNode = [...this._selectedNodes].at(-1);\n } else {\n this._selectedNodes.add(node);\n this.selectedNode = node;\n this.#anchor = { node, flatIndex: this.#getFlatIndexOf(node) };\n }\n this.#dispatchSelect(prev);\n }\n return; // no expand on Ctrl+click\n }\n\n if (isShift && this.#anchor) {\n const visible = this.#getAllNodes();\n const anchorIdx = visible.findIndex(n => n.node === this.#anchor!.node);\n const targetIdx = visible.findIndex(n => n.node === node);\n if (anchorIdx >= 0 && targetIdx >= 0) {\n const prev = new Set(this._selectedNodes);\n const from = Math.min(anchorIdx, targetIdx);\n const to = Math.max(anchorIdx, targetIdx);\n const rangeNodes = visible.slice(from, to + 1)\n .map(n => n.node)\n .filter(n => this.#canSelect(n));\n this._selectedNodes = new Set(rangeNodes);\n this.selectedNode = node;\n this.#dispatchSelect(prev);\n }\n return; // no expand on Shift+click\n }\n\n // Plain click: select + toggle expand\n if (this.#canSelect(node)) {\n const prev = new Set(this._selectedNodes);\n this._selectedNodes.clear();\n this._selectedNodes.add(node);\n this.selectedNode = node;\n this.#anchor = { node, flatIndex: this.#getFlatIndexOf(node) };\n if (!prev.has(node) || prev.size !== 1)\n this.#dispatchSelect(prev);\n }\n this.#toggleExpand(node, depth);\n }\n\n #handleExpandOnly(node: TreeNode, depth: number): void {\n this.#toggleExpand(node, depth);\n }\n\n #handleManualClick(node: TreeNode, depth: number, event?: MouseEvent): void {\n const isMeta = event ? (event.metaKey || event.ctrlKey) : false;\n const isShift = event ? event.shiftKey : false;\n\n if (isMeta) {\n if (this.#canSelect(node)) {\n const prev = new Set(this._selectedNodes);\n if (this._selectedNodes.has(node)) {\n this._selectedNodes.delete(node);\n if (this.selectedNode === node)\n this.selectedNode = [...this._selectedNodes].at(-1);\n } else {\n this._selectedNodes.add(node);\n this.selectedNode = node;\n this.#anchor = { node, flatIndex: this.#getFlatIndexOf(node) };\n }\n this.#dispatchSelect(prev);\n }\n return; // no expand on Meta+click\n }\n\n if (isShift && this.#anchor) {\n const visible = this.#getAllNodes();\n const anchorIdx = visible.findIndex(n => n.node === this.#anchor!.node);\n const targetIdx = visible.findIndex(n => n.node === node);\n if (anchorIdx >= 0 && targetIdx >= 0) {\n const prev = new Set(this._selectedNodes);\n const from = Math.min(anchorIdx, targetIdx);\n const to = Math.max(anchorIdx, targetIdx);\n const rangeNodes = visible.slice(from, to + 1)\n .map(n => n.node)\n .filter(n => this.#canSelect(n));\n this._selectedNodes = new Set(rangeNodes);\n this.selectedNode = node;\n this.#dispatchSelect(prev);\n }\n return; // no expand on Shift+click\n }\n\n this.#toggleExpand(node, depth);\n }\n\n #toggleSelection(node: TreeNode, _depth: number): void {\n if (!this.#canSelect(node))\n return;\n const prev = new Set(this._selectedNodes);\n if (this._selectedNodes.has(node)) {\n this._selectedNodes.delete(node);\n if (this.selectedNode === node)\n this.selectedNode = [...this._selectedNodes].at(-1);\n } else {\n this._selectedNodes.add(node);\n this.selectedNode = node;\n this.#anchor = { node, flatIndex: this.#getFlatIndexOf(node) };\n }\n this.#dispatchSelect(prev);\n }\n\n protected _handleCheckboxClick(event: MouseEvent, node: TreeNode, _depth: number): void {\n event.stopPropagation();\n const prev = new Set(this._selectedNodes);\n const allSelected = this.#allDescendantsSelected(node);\n this.#applyCheckedToggle(node, !allSelected);\n if (this.selectedNode === undefined || !this._selectedNodes.has(this.selectedNode)) {\n this.selectedNode = [...this._selectedNodes].at(-1);\n }\n this.#dispatchSelect(prev);\n this.requestUpdate();\n }\n\n #toggleExpand(node: TreeNode, depth: number): void {\n const isExpanded = this._expandedKeys.has(node.item.key);\n if (isExpanded) {\n this._expandedKeys.delete(node.item.key);\n this.dispatchEvent(new CustomEvent<TreeCollapseDetail>(`collapse`, {\n detail: { node, depth },\n bubbles: true,\n composed: true,\n }));\n } else {\n if (node.children === undefined) {\n if (node.item.isLeaf !== false)\n return;\n const loader = this.model ?? (this.loadChildren ? this : undefined);\n if (loader) {\n this.#pendingNode = node;\n const controller = new AbortController();\n this.#pendingController = controller;\n this.#invokeLoadChildren(node, depth, controller).catch(() => {});\n }\n } else {\n this.#applyExclusivity(node.item.key);\n this._expandedKeys.add(node.item.key);\n this.dispatchEvent(new CustomEvent<TreeExpandDetail>(`expand`, {\n detail: { node, depth },\n bubbles: true,\n composed: true,\n }));\n }\n }\n }\n\n #allDescendantsSelected(node: TreeNode): boolean {\n if (!this._selectedNodes.has(node))\n return false;\n if (!node.children?.length)\n return true;\n return node.children.every(child => this.#allDescendantsSelected(child));\n }\n\n #applyCheckedToggle(node: TreeNode, selected: boolean): void {\n if (this.#canSelect(node)) {\n if (selected) {\n this._selectedNodes.add(node);\n } else {\n this._selectedNodes.delete(node);\n }\n }\n if (node.children) {\n for (const child of node.children) {\n this.#applyCheckedToggle(child, selected);\n }\n }\n }\n\n #getFlatIndexOf(node: TreeNode): number {\n return this.#getAllNodes().findIndex(n => n.node === node);\n }\n\n #extendRangeSelection(nodes: Array<{ node: TreeNode; depth: number }>, fromIdx: number, toIdx: number): void {\n // Set anchor at `fromIdx` if not already anchored\n if (!this.#anchor) {\n const anchorNode = nodes[fromIdx]?.node;\n if (anchorNode)\n this.#anchor = { node: anchorNode, flatIndex: fromIdx };\n }\n if (!this.#anchor)\n return;\n\n const anchorIdx = nodes.findIndex(n => n.node === this.#anchor!.node);\n if (anchorIdx < 0)\n return;\n\n const from = Math.min(anchorIdx, toIdx);\n const to = Math.max(anchorIdx, toIdx);\n\n if (this.interactionMode === `vscode`) {\n // On first Shift+arrow: snapshot current selection\n if (!this.#anchor.selectionSnapshot) {\n this.#anchor = { ...this.#anchor, selectionSnapshot: new Set(this._selectedNodes) };\n }\n const snap = this.#anchor.selectionSnapshot!;\n const rangeNodes = nodes.slice(from, to + 1).map(n => n.node).filter(n => this.#canSelect(n));\n // Toggle: items in snapshot stay toggled based on presence in snapshot\n const next = new Set(snap);\n for (const n of rangeNodes) {\n if (snap.has(n))\n next.delete(n);\n else next.add(n);\n }\n const prev = new Set(this._selectedNodes);\n this._selectedNodes = next;\n this.selectedNode = nodes[toIdx]?.node ?? this.selectedNode;\n this.#dispatchSelect(prev);\n } else {\n // standard: range replaces selection\n const prev = new Set(this._selectedNodes);\n const rangeNodes = nodes.slice(from, to + 1).map(n => n.node).filter(n => this.#canSelect(n));\n this._selectedNodes = new Set(rangeNodes);\n this.selectedNode = nodes[toIdx]?.node ?? this.selectedNode;\n this.#dispatchSelect(prev);\n }\n }\n\n async #invokeLoadChildren(node: TreeNode, depth: number, controller: AbortController): Promise<void> {\n try {\n let children: TreeNode[];\n if (this.model) {\n children = await this.model.getChildren(node, depth, controller.signal);\n } else {\n const result = this.loadChildren!(node, depth, controller.signal);\n children = result instanceof Promise ? await result : result;\n }\n if (controller.signal.aborted)\n return;\n node.children = children;\n this.#applyExclusivity(node.item.key);\n this._expandedKeys.add(node.item.key);\n this.#pendingNode = undefined;\n this.#pendingController = undefined;\n this.dispatchEvent(new CustomEvent<TreeExpandDetail>(`expand`, {\n detail: { node, depth },\n bubbles: true,\n composed: true,\n }));\n this.requestUpdate();\n } catch (err) {\n if (controller.signal.aborted)\n return;\n node.children = [];\n this.#pendingNode = undefined;\n this.#pendingController = undefined;\n this.requestUpdate();\n }\n }\n\n protected _isSelected(node: TreeNode): boolean {\n return this._selectedNodes.has(node);\n }\n\n protected _isFocused(node: TreeNode): boolean {\n return this.tickled.isTickled(node.item.key);\n }\n\n protected _isExpanded(node: TreeNode): boolean {\n if (this._expandedKeys.has(node.item.key))\n return true;\n if (this.filterPredicate && node.children) {\n return node.children.some(child => this.#matchesFilter(child, 0));\n }\n return false;\n }\n\n #matchesFilter(node: TreeNode, depth: number): boolean {\n if (!this.filterPredicate)\n return true;\n if (this.filterPredicate(node, depth))\n return true;\n return node.children?.some(child => this.#matchesFilter(child, depth + 1)) ?? false;\n }\n\n protected get _pendingNode(): TreeNode | undefined {\n return this.#pendingNode;\n }\n\n #scrollKeyIntoView(key: string) {\n requestAnimationFrame(() => {\n const el = this.shadowRoot?.querySelector(`[data-key=\"${CSS.escape(key)}\"]`) as HTMLElement | null;\n if (!el)\n return;\n const elRect = el.getBoundingClientRect();\n const hostRect = this.getBoundingClientRect();\n const relativeTop = elRect.top - hostRect.top;\n const relativeBottom = relativeTop + elRect.height;\n if (relativeTop < 0) {\n this.scrollTop += relativeTop;\n } else if (relativeBottom > this.clientHeight) {\n this.scrollTop += relativeBottom - this.clientHeight;\n }\n });\n }\n\n #abortPending() {\n if (this.#pendingController) {\n this.#pendingController.abort();\n this.#pendingController = undefined;\n this.#pendingNode = undefined;\n }\n }\n\n /** Apply exclusivity rules when a node is about to be expanded. */\n #applyExclusivity(expandKey: string): void {\n if (this.exclusivity === `none`)\n return;\n\n if (this.exclusivity === `depth`) {\n this.#collapseSiblingsAtDepth(expandKey);\n } else if (this.exclusivity === `global`) {\n // Collapse all expanded nodes except direct ancestors of the expanding node\n const ancestorKeys = this.#findAncestorKeys(expandKey);\n for (const key of [...this._expandedKeys]) {\n if (!ancestorKeys.has(key) && key !== expandKey) {\n this._expandedKeys.delete(key);\n }\n }\n }\n }\n\n #collapseSiblingsAtDepth(expandKey: string): void {\n if (!this.root)\n return;\n\n const parent = this.#findParent(this.root, expandKey);\n if (!parent?.children)\n return;\n\n for (const child of parent.children) {\n if (child.item.key !== expandKey && this._expandedKeys.has(child.item.key)) {\n this._expandedKeys.delete(child.item.key);\n }\n }\n }\n\n #findAncestorKeys(targetKey: string): Set<string> {\n const keys = new Set<string>();\n const walk = (node: TreeNode): boolean => {\n if (node.item.key === targetKey)\n return true;\n if (!node.children)\n return false;\n for (const child of node.children) {\n if (walk(child)) {\n keys.add(node.item.key);\n return true;\n }\n }\n return false;\n };\n if (this.root)\n walk(this.root);\n return keys;\n }\n\n #findParent(node: TreeNode, targetKey: string, parent: TreeNode | undefined = undefined): TreeNode | undefined {\n if (!node.children)\n return undefined;\n\n for (const child of node.children) {\n if (child.item.key === targetKey) {\n return parent ?? node;\n }\n const found = this.#findParent(child, targetKey, child);\n if (found)\n return found;\n }\n return undefined;\n }\n\n #getVisibleNodes(node: TreeNode, depth: number): Array<{ node: TreeNode; depth: number }> {\n const result: Array<{ node: TreeNode; depth: number }> = [];\n\n const visit = (n: TreeNode, d: number) => {\n result.push({ node: n, depth: d });\n if (this._expandedKeys.has(n.item.key) && n.children) {\n for (const child of n.children) {\n visit(child, d + 1);\n }\n }\n };\n\n if (node.children) {\n for (const child of node.children) {\n visit(child, depth + 1);\n }\n }\n\n return result;\n }\n\n #getAllNodes(): Array<{ node: TreeNode; depth: number }> {\n if (!this.root)\n return [];\n return this.#getVisibleNodes(this.root, 0);\n }\n\n #getFocusedIndex(): number {\n const nodes = this.#getAllNodes();\n const tickledKey = this.tickled.tickledId;\n if (!tickledKey)\n return 0;\n return nodes.findIndex(n => n.node.item.key === tickledKey);\n }\n\n #setFocusedIndex(index: number) {\n const nodes = this.#getAllNodes();\n if (index < 0 || index >= nodes.length)\n return;\n const { node, depth } = nodes[index];\n this.tickled.setTickled(node.item.key);\n this._focusedDepth = depth;\n // Emit tickle for keyboard cursor movement\n this.dispatchEvent(new CustomEvent<TreeTickleDetail>(`tickle`, {\n detail: { node, depth },\n bubbles: true,\n composed: true,\n }));\n this.requestUpdate();\n this.updateComplete.then(() => this.#scrollTickledIntoView());\n }\n\n #scrollTickledIntoView() {\n const tickledKey = this.tickled.tickledId;\n if (tickledKey === undefined)\n return;\n const item = this.shadowRoot?.querySelector(`[data-key=\"${tickledKey}\"]`);\n item?.scrollIntoView({ block: `nearest`, behavior: `smooth` });\n }\n\n #onKeyDown = (event: KeyboardEvent) => {\n const nodes = this.#getAllNodes();\n if (nodes.length === 0)\n return;\n\n // Switch to keyboard mode for any navigation key\n if ([`ArrowDown`, `ArrowUp`, `ArrowLeft`, `ArrowRight`, `Enter`, ` `].includes(event.key)) {\n this.tickled.setInputMode(`keyboard`);\n }\n\n const currentIdx = this.#getFocusedIndex();\n\n switch (event.key) {\n case `ArrowDown`: {\n event.preventDefault();\n const nextIdx = Math.min(currentIdx + 1, nodes.length - 1);\n if (this.interactionMode === `implicit`) {\n this.select(nodes[nextIdx].node);\n }\n this.#setFocusedIndex(nextIdx);\n if (event.shiftKey && (this.interactionMode === `standard` || this.interactionMode === `vscode`)) {\n this.#extendRangeSelection(nodes, currentIdx, nextIdx);\n } else if (this.interactionMode === `vscode`) {\n this.#anchor = undefined; // clear snapshot on plain navigation\n }\n this.requestUpdate();\n break;\n }\n case `ArrowUp`: {\n event.preventDefault();\n const prevIdx = Math.max(currentIdx - 1, 0);\n if (this.interactionMode === `implicit`) {\n this.select(nodes[prevIdx].node);\n }\n this.#setFocusedIndex(prevIdx);\n if (event.shiftKey && (this.interactionMode === `standard` || this.interactionMode === `vscode`)) {\n this.#extendRangeSelection(nodes, currentIdx, prevIdx);\n } else if (this.interactionMode === `vscode`) {\n this.#anchor = undefined; // clear snapshot on plain navigation\n }\n this.requestUpdate();\n break;\n }\n case `ArrowRight`: {\n event.preventDefault();\n const current = nodes[currentIdx];\n if (current && current.node.item.isLeaf !== true) {\n if (!this._expandedKeys.has(current.node.item.key)) {\n this.#toggleExpand(current.node, current.depth);\n } else if (currentIdx + 1 < nodes.length) {\n this.#setFocusedIndex(currentIdx + 1);\n }\n }\n this.requestUpdate();\n break;\n }\n case `ArrowLeft`: {\n event.preventDefault();\n const current = nodes[currentIdx];\n if (current && this._expandedKeys.has(current.node.item.key)) {\n this._expandedKeys.delete(current.node.item.key);\n this.dispatchEvent(new CustomEvent(`collapse`, {\n detail: { node: current.node, depth: current.depth },\n bubbles: true,\n composed: true,\n }));\n } else if (current.depth > 1) {\n const parentDepth = current.depth - 1;\n for (let i = currentIdx - 1; i >= 0; i--) {\n if (nodes[i].depth === parentDepth) {\n this.#setFocusedIndex(i);\n break;\n }\n }\n }\n this.requestUpdate();\n break;\n }\n case `Enter`: {\n event.preventDefault();\n const current = nodes[currentIdx];\n if (current) {\n if (this.interactionMode !== `manual` && this.interactionMode !== `checked`) {\n this.select(current.node);\n }\n this.dispatchEvent(new CustomEvent<TreeActivateDetail>(`activate`, {\n detail: { node: current.node, depth: current.depth },\n bubbles: true,\n composed: true,\n }));\n this.requestUpdate();\n }\n break;\n }\n case ` `: {\n event.preventDefault();\n const current = nodes[currentIdx];\n if (!current)\n break;\n\n if (this.interactionMode === `checked`) {\n this._handleCheckboxClick(new MouseEvent('click'), current.node, current.depth);\n } else if (this.interactionMode === `standard` || this.interactionMode === `vscode` || this.interactionMode === `manual`) {\n this.#toggleSelection(current.node, current.depth);\n }\n break;\n }\n case `Escape`: {\n event.preventDefault();\n this.#abortPending();\n break;\n }\n }\n };\n\n protected renderLoadingIndicator(): TemplateResult | typeof nothing {\n return html`<span class=\"loading-spinner\"></span>`;\n }\n\n protected override render() {\n const nodes = this.#getAllNodes();\n\n return html`\n <div\n id=\"container\"\n data-input-mode=${this.tickled.inputMode}\n @keydown=${this.#onKeyDown}\n @dblclick=${this.#onDblClick}\n @pointerleave=${(e: PointerEvent) => this.tickled.handlePointerLeave(e)}\n tabindex=\"0\"\n >\n ${this.root ? this.#renderNodes(nodes) : nothing}\n </div>\n `;\n }\n\n #onDblClick = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n const li = target.closest(`li`) as HTMLElement | null;\n if (!li)\n return;\n const key = li.dataset.key;\n if (!key)\n return;\n const nodes = this.#getAllNodes();\n const node = nodes.find(n => n.node.item.key === key);\n if (!node)\n return;\n this.dispatchEvent(new CustomEvent<TreeActivateDetail>(`activate`, {\n detail: { node: node.node, depth: node.depth },\n bubbles: true,\n composed: true,\n }));\n };\n\n #renderNodes(nodes: Array<{ node: TreeNode; depth: number }>) {\n if (nodes.length === 0 && this.#pendingNode) {\n return html`\n <div class=\"tree-loading\">\n ${this.renderLoadingIndicator()}\n </div>\n `;\n }\n\n return html`\n <ul class=\"tree-list\" role=\"tree\">\n ${nodes.map(({ node, depth }) => this._renderNode(node, depth))}\n </ul>\n `;\n }\n\n protected _renderNode(node: TreeNode, depth: number): TemplateResult {\n const selected = this._isSelected(node);\n const tickled = this._isFocused(node);\n const isBranch = node.item.isLeaf !== true;\n const isExpanded = this._isExpanded(node);\n const isPending = this.#pendingNode === node;\n const isFiltered = this.filterPredicate !== undefined && !this.#matchesFilter(node, depth);\n\n return html`\n <li\n class=\"item ${selected ? `selected` : ``} ${tickled ? `tickled` : ``} ${isBranch ? `branch` : `leaf`} ${isFiltered ? `filtered` : ``}\"\n role=\"treeitem\"\n aria-selected=${selected}\n aria-expanded=${isBranch ? isExpanded : nothing}\n aria-level=${depth + 1}\n data-key=${node.item.key}\n style=${`--depth: ${depth}`}\n @click=${(e: MouseEvent) => this._handleItemClick(node, depth, e)}\n @pointerenter=${() => {\n this.tickled.handlePointerEnter(node.item.key);\n this.dispatchEvent(new CustomEvent<TreeTickleDetail>(`tickle`, {\n detail: { node, depth },\n bubbles: true,\n composed: true,\n }));\n }}\n >\n ${this.renderNodeContent(node, depth)}\n ${isPending ? this.renderLoadingIndicator() : nothing}\n </li>\n `;\n }\n\n static override styles = [\n tickledStyles,\n tickledItemStyles,\n css`\n :host {\n --tree-bg: var(--surface-3);\n --tree-text: var(--surface-3-text);\n --tree-muted-text: var(--surface-muted-text);\n --tree-indent: 1ch;\n --tree-item-height: 28px;\n --tree-caret-size: 10px;\n --tree-radius: var(--radius-s);\n\n display: block;\n overflow: auto;\n box-sizing: border-box;\n background: var(--tree-bg);\n color: var(--tree-text);\n }\n\n #container {\n outline: none;\n min-height: 100%;\n }\n\n .tree-list {\n list-style: none;\n margin: 0;\n padding: var(--space-xs);\n }\n\n .item {\n display: flex;\n align-items: center;\n height: var(--tree-item-height);\n padding-left: calc(var(--tree-indent) * var(--depth, 0));\n cursor: pointer;\n user-select: none;\n font-family: var(--font-family);\n font-size: var(--text-m);\n border-radius: var(--tree-radius);\n transition: background var(--transition, 0.15s ease-out);\n margin: 1px 0;\n }\n\n .tree-caret {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--tree-caret-size);\n height: var(--tree-caret-size);\n flex-shrink: 0;\n margin-right: var(--space-xs);\n }\n\n .caret-icon {\n width: var(--tree-caret-size);\n height: var(--tree-caret-size);\n color: var(--tree-muted-text);\n transition: transform var(--transition, 0.15s ease-out);\n }\n\n .item.selected .caret-icon {\n color: var(--accent-text);\n }\n\n .tree-label {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .tree-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--space-m);\n }\n\n .loading-spinner {\n width: 16px;\n height: 16px;\n border: 2px solid var(--surface-5);\n border-top-color: var(--accent);\n border-radius: 50%;\n animation: tree-spin 0.7s linear infinite;\n }\n\n @keyframes tree-spin {\n to { transform: rotate(360deg); }\n }\n\n .item.filtered {\n display: none;\n }\n\n ::highlight(incr-search-highlight) {\n background: var(--search-highlight-bg, var(--accent));\n color: var(--search-highlight-color, var(--accent-text, #fff));\n border-radius: 2px;\n padding: 0 1px;\n }\n `,\n ];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-tree-base': TreeBaseElement;\n }\n}\n\nexport interface TreeBaseElementEventMap extends TreeComponentEventMap {\n 'item-click': TreeItemClickEvent;\n 'expand': TreeExpandEvent;\n 'collapse': TreeCollapseEvent;\n 'select': TreeSelectEvent;\n 'tickle': TreeTickleEvent;\n 'activate': TreeActivateEvent;\n}\n\nexport interface TreeBaseElement {\n addEventListener: (<K extends keyof TreeBaseElementEventMap>(\n type: K,\n listener: (this: TreeBaseElement, event: TreeBaseElementEventMap[K]) => void,\n options?: boolean | AddEventListenerOptions,\n ) => void) & ((\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ) => void);\n removeEventListener: (<K extends keyof TreeBaseElementEventMap>(\n type: K,\n listener: (this: TreeBaseElement, event: TreeBaseElementEventMap[K]) => void,\n options?: boolean | EventListenerOptions,\n ) => void) & ((\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | EventListenerOptions,\n ) => void);\n}\n","import type { TraversableTree } from '@ixfx/collections';\nimport type { TreeBaseElement } from './tree-base.js';\nimport type { TreeItem, TreeNode } from './types.js';\n\nexport type TreeControllerOptions<T> = {\n valueToItem: (value: T, node: TraversableTree<T>) => TreeItem;\n};\n\nexport class TreeController<T> {\n #root: TraversableTree<T>;\n #element: TreeBaseElement;\n #options: TreeControllerOptions<T>;\n\n #nodeToTree = new WeakMap<TreeNode, TraversableTree<T>>();\n #identityToTreeNode = new Map<unknown, TraversableTree<T>>();\n\n #connectSignal: AbortController | undefined;\n\n constructor(\n root: TraversableTree<T>,\n element: TreeBaseElement,\n options: TreeControllerOptions<T>,\n ) {\n this.#root = root;\n this.#element = element;\n this.#options = options;\n }\n\n connect() {\n this.disconnect();\n this.#connectSignal = new AbortController();\n const { signal } = this.#connectSignal;\n\n const rootValue = this.#root.getValue();\n const rootItem = this.#options.valueToItem(rootValue, this.#root);\n const rootChildren = this.#childrenOf(this.#root);\n\n this.#element.root = { item: rootItem, children: rootChildren };\n\n this.#element.addEventListener(`expand`, (e: Event) => {\n const { node } = (e as CustomEvent<{ node: TreeNode }>).detail;\n const treeNode = this.#nodeToTree.get(node);\n if (!treeNode)\n return;\n node.children = this.#childrenOf(treeNode);\n this.#element.requestUpdate();\n }, { signal });\n\n this.#element.addEventListener(`collapse`, (_e: Event) => {\n }, { signal });\n }\n\n disconnect() {\n this.#connectSignal?.abort();\n this.#connectSignal = undefined;\n }\n\n navigateToValue(predicate: (value: T) => boolean): boolean {\n const treePath = this.#findTreePath(this.#root, predicate);\n if (!treePath)\n return false;\n\n const keys: string[] = [];\n\n for (let i = 1; i < treePath.length; i++) {\n const treeNode = treePath[i];\n const key = this.#options.valueToItem(treeNode.getValue(), treeNode).key;\n keys.push(key);\n\n if (i < treePath.length - 1) {\n const currentChildren = i === 1\n ? this.#element.root?.children ?? []\n : this.#findInChildren(this.#element.root?.children ?? [], keys);\n\n const treeNodeMap = this.#nodeToTree;\n const node = currentChildren.find(n => n.item.key === key);\n if (!node)\n return false;\n\n if (node.children === undefined) {\n const mapped = treeNodeMap.get(node);\n if (mapped)\n node.children = this.#childrenOf(mapped);\n }\n }\n }\n\n return this.#element.navigateTo(keys);\n }\n\n #findInChildren(children: TreeNode[], keys: string[]): TreeNode[] {\n if (keys.length === 0)\n return children;\n const key = keys[0];\n const found = children.find(n => n.item.key === key);\n return found?.children ?? [];\n }\n\n #childrenOf(treeNode: TraversableTree<T>): TreeNode[] {\n return Array.from(treeNode.children(), child => this.#toTreeNode(child));\n }\n\n #toTreeNode(treeNode: TraversableTree<T>): TreeNode {\n const value = treeNode.getValue();\n const childList = [...treeNode.children()];\n const userItem = this.#options.valueToItem(value, treeNode);\n\n const isLeaf = userItem.isLeaf ?? childList.length === 0;\n\n const treeNodeMap: TreeNode = {\n item: { ...userItem, isLeaf },\n };\n\n this.#nodeToTree.set(treeNodeMap, treeNode);\n this.#identityToTreeNode.set(treeNode.getIdentity(), treeNode);\n return treeNodeMap;\n }\n\n #findTreePath(\n node: TraversableTree<T>,\n predicate: (value: T) => boolean,\n ancestors: Array<TraversableTree<T>> = [],\n ): Array<TraversableTree<T>> | undefined {\n const path = [...ancestors, node];\n if (predicate(node.getValue()))\n return path;\n for (const child of node.children()) {\n const result = this.#findTreePath(child, predicate, path);\n if (result)\n return result;\n }\n return undefined;\n }\n}\n","import type { TemplateResult } from 'lit';\nimport type { TreeBaseElementEventMap } from './tree-base.js';\nimport type { TreeNode } from './types.js';\nimport { css, html, nothing } from 'lit';\nimport { customElement } from 'lit/decorators.js';\nimport { TreeBaseElement } from './tree-base.js';\n\ntype CheckboxState = `checked` | `unchecked` | `indeterminate`;\n\nfunction computeCheckboxState(node: TreeNode, selectedNodes: ReadonlySet<TreeNode>): CheckboxState {\n if (node.item.isLeaf || !node.children?.length) {\n return selectedNodes.has(node) ? `checked` : `unchecked`;\n }\n const childStates = node.children.map(c => computeCheckboxState(c, selectedNodes));\n const allChecked = childStates.every(s => s === `checked`);\n const allUnchecked = childStates.every(s => s === `unchecked`);\n if (allChecked)\n return `checked`;\n if (allUnchecked)\n return `unchecked`;\n return `indeterminate`;\n}\n\n@customElement(`ixfx-tree-list`)\nexport class TreeListElement extends TreeBaseElement {\n #depthsWithIcons = new Set<number>();\n\n protected override render() {\n this.#detectIcons();\n return super.render();\n }\n\n #detectIcons() {\n this.#depthsWithIcons.clear();\n const visit = (node: TreeNode, depth: number) => {\n if (node.item.icon) {\n this.#depthsWithIcons.add(depth);\n }\n if (node.children) {\n for (const child of node.children) {\n visit(child, depth + 1);\n }\n }\n };\n if (this.root) {\n visit(this.root, 0);\n }\n }\n\n protected override renderNodeContent(node: TreeNode, depth: number): TemplateResult {\n const isBranch = node.item.isLeaf !== true;\n const isExpanded = this._isExpanded(node);\n const icon = node.item.icon;\n const tooltip = node.item.tooltip;\n\n const caretAndLabel = html`\n <span class=\"tree-caret\">\n ${isBranch ? html`<ixfx-icon class=\"caret-icon\" name=\"chevron-down\" .rotate=${isExpanded ? nothing : `-90deg`}></ixfx-icon>` : ``}\n </span>\n ${icon ? html`<ixfx-icon class=\"tree-icon\" name=\"${icon}\"></ixfx-icon>` : nothing}\n <span class=\"tree-label\">\n ${node.item.label}\n ${tooltip ? html`<ixfx-tooltip class=\"tree-tooltip\" anchor=\"--tooltip-tree-${node.item.key}\" .value=${tooltip}></ixfx-tooltip>` : nothing}\n </span>\n `;\n\n if (this.interactionMode === `checked`) {\n const state = computeCheckboxState(node, this._selectedNodes);\n return html`\n <input\n type=\"checkbox\"\n class=\"tree-checkbox\"\n .checked=${state === `checked`}\n .indeterminate=${state === `indeterminate`}\n aria-label=\"Select ${node.item.label}\"\n @click=${(e: MouseEvent) => this._handleCheckboxClick(e, node, depth)}\n />${caretAndLabel}`;\n }\n\n return caretAndLabel;\n }\n\n protected override _renderNode(node: TreeNode, depth: number): TemplateResult {\n const selected = this._isSelected(node);\n const tickled = this._isFocused(node);\n const isBranch = node.item.isLeaf !== true;\n const isExpanded = this._isExpanded(node);\n const isPending = this._pendingNode === node;\n const hasIconAtDepth = this.#depthsWithIcons.has(depth);\n\n return html`\n <li\n class=\"item ${selected ? `selected` : ``} ${tickled ? `tickled` : ``} ${isBranch ? `branch` : `leaf`} ${hasIconAtDepth ? `has-icon-at-depth` : ``}\"\n data-key=${node.item.key}\n role=\"treeitem\"\n aria-selected=${selected}\n aria-expanded=${isBranch ? isExpanded : nothing}\n aria-level=${depth + 1}\n style=${`--depth: ${depth}`}\n @click=${(e: MouseEvent) => this._handleItemClick(node, depth, e)}\n @pointerenter=${() => this.tickled.handlePointerEnter(node.item.key)}\n >\n ${this.renderNodeContent(node, depth)}\n ${isPending ? this.renderLoadingIndicator() : nothing}\n </li>\n `;\n }\n\n static override styles = [\n ...TreeBaseElement.styles,\n css`\n .tree-caret {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--tree-caret-size);\n height: var(--tree-caret-size);\n flex-shrink: 0;\n margin-right: var(--space-xs);\n }\n\n .caret-icon {\n width: var(--tree-caret-size);\n height: var(--tree-caret-size);\n color: var(--tree-muted-text);\n transition: transform var(--transition, 0.15s ease-out);\n }\n\n .item.selected .caret-icon {\n color: var(--accent-text);\n }\n\n .tree-icon {\n flex-shrink: 0;\n width: var(--icon-size, 1em);\n height: var(--icon-size, 1em);\n margin-right: var(--icon-spacing, 0.3em);\n }\n\n .item:not(.has-icon-at-depth) .tree-icon {\n display: none;\n }\n\n .item.has-icon-at-depth .tree-label {\n margin-left: var(--icon-size, 1em);\n }\n\n .tree-tooltip {\n position: absolute;\n anchor-name: --tooltip-tree;\n }\n\n .tree-checkbox {\n flex-shrink: 0;\n margin-right: var(--space-xs, 3px);\n cursor: pointer;\n accent-color: var(--accent);\n pointer-events: auto;\n }\n\n /* In checked mode the checkbox communicates selection state —\n suppress the row highlight so it doesn't double-signal */\n :host([interaction-mode=\"checked\"]) .item.selected {\n background: transparent;\n color: inherit;\n outline: none;\n }\n\n \n\n .tree-label {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n position: relative;\n }\n `,\n ];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-tree-list': TreeListElement;\n }\n}\n\nexport interface TreeListElement {\n addEventListener: (<K extends keyof TreeBaseElementEventMap>(\n type: K,\n listener: (this: TreeListElement, event: TreeBaseElementEventMap[K]) => void,\n options?: boolean | AddEventListenerOptions,\n ) => void) & ((\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ) => void);\n}\n"],"mappings":"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"}