@ixfx/components 0.8.8 → 0.9.1

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 (69) hide show
  1. package/bundle/index.d.ts +252 -43
  2. package/bundle/index.d.ts.map +1 -1
  3. package/bundle/index.js +1177 -39
  4. package/bundle/index.js.map +1 -1
  5. package/dist/crumbs.d.ts +1 -1
  6. package/dist/{data-grid-BKa9i86q.d.ts → data-grid-C588pTgt.d.ts} +3 -3
  7. package/dist/{data-grid-BKa9i86q.d.ts.map → data-grid-C588pTgt.d.ts.map} +1 -1
  8. package/dist/data-grid.d.ts +2 -2
  9. package/dist/data-grid.js +1 -1
  10. package/dist/{detail-list-CHTomlbR.d.ts → detail-list-IKl76Wnp.d.ts} +4 -4
  11. package/dist/{detail-list-CHTomlbR.d.ts.map → detail-list-IKl76Wnp.d.ts.map} +1 -1
  12. package/dist/detail-list.d.ts +3 -3
  13. package/dist/detail-list.js +1 -1
  14. package/dist/{grid-list-CsZcXxMC.d.ts → grid-list-C1zq5U1W.d.ts} +20 -56
  15. package/dist/grid-list-C1zq5U1W.d.ts.map +1 -0
  16. package/dist/{grid-list-C8oMxLl-.js → grid-list-zUZRI8hk.js} +39 -3
  17. package/dist/grid-list-zUZRI8hk.js.map +1 -0
  18. package/dist/grid-list.d.ts +2 -2
  19. package/dist/grid-list.js +1 -1
  20. package/dist/incr-search.d.ts +1 -1
  21. package/dist/{index-Dgrx-DIA.d.ts → index--qnhBWZJ.d.ts} +2 -2
  22. package/dist/{index-Dgrx-DIA.d.ts.map → index--qnhBWZJ.d.ts.map} +1 -1
  23. package/dist/index.d.ts +30 -9
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +11 -11
  26. package/dist/index.js.map +1 -1
  27. package/dist/{labelled-slider-input-BCH9968c.js → labelled-slider-input-aEYDvW2S.js} +2 -2
  28. package/dist/{labelled-slider-input-BCH9968c.js.map → labelled-slider-input-aEYDvW2S.js.map} +1 -1
  29. package/dist/labelled-slider-input.js +1 -1
  30. package/dist/list-native-drag-controller-Cmpx7jnx.d.ts +68 -0
  31. package/dist/list-native-drag-controller-Cmpx7jnx.d.ts.map +1 -0
  32. package/dist/{list-native-drag-controller-DrY3qeJM.js → list-native-drag-controller-DaBNcjgG.js} +28 -2
  33. package/dist/list-native-drag-controller-DaBNcjgG.js.map +1 -0
  34. package/dist/miller.d.ts +2 -2
  35. package/dist/plots.js +1 -1
  36. package/dist/slider-input-BxURAAmD.d.ts.map +1 -1
  37. package/dist/{slider-input-WR8_RwHg.js → slider-input-Cb5uSV42.js} +78 -11
  38. package/dist/slider-input-Cb5uSV42.js.map +1 -0
  39. package/dist/slider-input.js +1 -1
  40. package/dist/{split-layout-CA5jbNbG.js → split-layout-Bx0g8k8-.js} +24 -1
  41. package/dist/{split-layout-CA5jbNbG.js.map → split-layout-Bx0g8k8-.js.map} +1 -1
  42. package/dist/split-layout-JK3xWVX2.d.ts.map +1 -1
  43. package/dist/split-layout.js +1 -1
  44. package/dist/{tree-DSMn566I.js → tree-CwifXCzR.js} +1006 -19
  45. package/dist/tree-CwifXCzR.js.map +1 -0
  46. package/dist/{tree-component-nPP5Y-WS.d.ts → tree-component-BW2iCFq9.d.ts} +107 -3
  47. package/dist/tree-component-BW2iCFq9.d.ts.map +1 -0
  48. package/dist/tree.d.ts +102 -4
  49. package/dist/tree.d.ts.map +1 -1
  50. package/dist/tree.js +2 -2
  51. package/dist/{vertical-list-A6oWfivZ.d.ts → vertical-list-CHrXmmQ3.d.ts} +3 -3
  52. package/dist/{vertical-list-A6oWfivZ.d.ts.map → vertical-list-CHrXmmQ3.d.ts.map} +1 -1
  53. package/dist/vertical-list.d.ts +2 -2
  54. package/dist/vertical-list.js +1 -1
  55. package/dist/{xy-axis-CrrVdDFe.js → xy-axis-COKw338Q.js} +2 -2
  56. package/dist/xy-axis-COKw338Q.js.map +1 -0
  57. package/dist/xy-axis-DQqd2yXJ.d.ts.map +1 -1
  58. package/docs-user/index.json +2 -2
  59. package/docs-user/tree.md +75 -0
  60. package/package.json +1 -1
  61. package/dist/grid-list-C8oMxLl-.js.map +0 -1
  62. package/dist/grid-list-CsZcXxMC.d.ts.map +0 -1
  63. package/dist/list-drag-types-kpaXz2pZ.d.ts +0 -42
  64. package/dist/list-drag-types-kpaXz2pZ.d.ts.map +0 -1
  65. package/dist/list-native-drag-controller-DrY3qeJM.js.map +0 -1
  66. package/dist/slider-input-WR8_RwHg.js.map +0 -1
  67. package/dist/tree-DSMn566I.js.map +0 -1
  68. package/dist/tree-component-nPP5Y-WS.d.ts.map +0 -1
  69. package/dist/xy-axis-CrrVdDFe.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"tree-DSMn566I.js","names":["#root","#loadChildren","#cache","#notify","#subscribers","#getAllNodes","#getFocusedIndex","#setFocusedIndex","#extendRangeSelection","#anchor","#toggleExpand","#toggleSelection","#abortPending","#ownedRegistry","#effectiveSearchModes","#unregisterSearchCommands","#leavingAnimations","#diffVisibleNodes","#enteringKeys","#treeAnimReady","#renderedKeys","#leaving","#lastNodeByKey","#cancelLeavingAnimation","#cancelAllLeavingAnimations","#matchesFilter","#clearSelectionInternal","#modelUnsubscribe","#runItemAnimations","#syncSearchCommands","#config","#canSelect","#dispatchSelect","#applyCheckedToggle","#applyExclusivity","#scrollKeyIntoView","#findNodePath","#pendingNode","#handleImplicitClick","#handleStandardClick","#handleManualClick","#handleExpandOnly","#clickedOnCaret","#getFlatIndexOf","#allDescendantsSelected","#pendingController","#invokeLoadChildren","#collapseSiblingsAtDepth","#findAncestorKeys","#findParent","#getVisibleNodes","#scrollTickledIntoView","#onKeyDown","#onDblClick","#renderNodes","#weaveLeaving","customElement","#detectIcons","#depthsWithIcons","#renderCheckbox","customElement","#root","#element","#options","#connectSignal","#childrenOf","#nodeToTree","#findTreePath","#toTreeNode","#identityToTreeNode"],"sources":["../src/common/tree-data-model.ts","../src/tree/tree-base.ts","../src/tree/tree-list.ts","../src/tree/tree-controller.ts"],"sourcesContent":["import type { LoadChildrenCallback, TreeItem, TreeNode } from './types.js';\nimport { collectDataResult } from './data-provider.js';\n\n// ---------------------------------------------------------------------------\n// Subscription event types (internal — not part of the public API)\n// ---------------------------------------------------------------------------\n\ntype InvalidateEvent = { type: `invalidate`; key: string };\ntype RootEvent = { type: `root`; root: TreeNode };\ntype ModelEvent = InvalidateEvent | RootEvent;\n\ntype ModelSubscriber = (event: ModelEvent) => void;\n\n// ---------------------------------------------------------------------------\n// Pure tree-mutation helpers (functional, produce new roots)\n// ---------------------------------------------------------------------------\n\n// function cloneNode(node: TreeNode): TreeNode {\n// if (node.children === undefined)\n// return { item: { ...node.item } };\n// return { item: { ...node.item }, children: node.children.map(cloneNode) };\n// }\n\nfunction findNode(root: TreeNode, key: string): TreeNode | undefined {\n if (root.item.key === key)\n return root;\n if (!root.children)\n return undefined;\n for (const child of root.children) {\n const found = findNode(child, key);\n if (found)\n return found;\n }\n return undefined;\n}\n\n/** Return a new root with the node at `key` replaced by `replacer(node)`. */\nfunction mapNode(root: TreeNode, key: string, replacer: (n: TreeNode) => TreeNode): TreeNode {\n if (root.item.key === key)\n return replacer(root);\n if (!root.children)\n return root;\n return { item: root.item, children: root.children.map(c => mapNode(c, key, replacer)) };\n}\n\n/** Return a new root with `newChild` appended to the children of the node at `parentKey`. */\nfunction addChildTo(root: TreeNode, parentKey: string, newChild: TreeNode): TreeNode {\n return mapNode(root, parentKey, parent => ({\n item: parent.item,\n children: [...(parent.children ?? []), newChild],\n }));\n}\n\n/** Return a new root with the node at `key` removed (along with all its descendants). */\nfunction removeNodeFrom(root: TreeNode, key: string): TreeNode {\n if (!root.children)\n return root;\n return {\n item: root.item,\n children: root.children\n .filter(c => c.item.key !== key)\n .map(c => removeNodeFrom(c, key)),\n };\n}\n\n/** Return a new root with the node at `key` moved to become a child of `newParentKey`. */\nfunction moveNodeTo(root: TreeNode, key: string, newParentKey: string): TreeNode {\n const target = findNode(root, key);\n if (!target)\n return root;\n const withoutTarget = removeNodeFrom(root, key);\n return addChildTo(withoutTarget, newParentKey, target);\n}\n\n// ---------------------------------------------------------------------------\n// TreeDataModelOptions\n// ---------------------------------------------------------------------------\n\nexport type TreeDataModelOptions = {\n /** The initial root node. Required. */\n root: TreeNode;\n /**\n * Optional callback for lazily loading children.\n * If omitted, nodes with `children === undefined` are treated as empty branches.\n */\n loadChildren?: LoadChildrenCallback;\n};\n\n// ---------------------------------------------------------------------------\n// TreeDataModel\n// ---------------------------------------------------------------------------\n\n/**\n * Manages tree data for tree-like components.\n *\n * Handles two concerns:\n * 1. **Lazy loading** — caches children fetched via `loadChildren` and can invalidate\n * specific branches so they are re-fetched on next expand.\n * 2. **Structural mutations** — convenience methods to add, remove, update, or move\n * nodes. Each mutation produces a new immutable root and notifies connected components.\n *\n * Assign an instance to a component's `model` property instead of setting `root`/`loadChildren`\n * directly. The same model instance can be shared across multiple components.\n *\n * @example\n * ```typescript\n * const model = new TreeDataModel({\n * root: { item: { key: 'root', label: 'Root' }, children: [] },\n * loadChildren: async (node, depth, signal) => fetchChildren(node.item.key),\n * });\n * myTreeList.model = model;\n * myMillerList.model = model;\n *\n * // Later — invalidate a branch to force a re-fetch on next expand:\n * model.invalidate('some-key');\n * ```\n */\nexport class TreeDataModel {\n #root: TreeNode;\n #loadChildren: LoadChildrenCallback | undefined;\n #cache = new Map<string, TreeNode[]>();\n #subscribers = new Set<ModelSubscriber>();\n\n constructor(options: TreeDataModelOptions) {\n this.#root = options.root;\n this.#loadChildren = options.loadChildren;\n }\n\n // ---------------------------------------------------------------------------\n // Root\n // ---------------------------------------------------------------------------\n\n /** The current immutable root snapshot. */\n get root(): TreeNode {\n return this.#root;\n }\n\n /**\n * Replace the entire root with a new immutable snapshot.\n * All cached children are cleared. Connected components re-render.\n */\n setRoot(root: TreeNode): void {\n this.#root = root;\n this.#cache.clear();\n this.#notify({ type: `root`, root });\n }\n\n // ---------------------------------------------------------------------------\n // Child loading\n // ---------------------------------------------------------------------------\n\n /**\n * Returns children for the given node.\n * If children are cached, they are returned immediately (as a resolved Promise).\n * Otherwise the `loadChildren` callback is invoked and the result is cached.\n * If no `loadChildren` is set and no cache entry exists, returns `[]`.\n *\n * Called by components internally — not typically called by application code.\n */\n async getChildren(node: TreeNode, depth: number, signal: AbortSignal): Promise<TreeNode[]> {\n const key = node.item.key;\n if (this.#cache.has(key)) {\n return this.#cache.get(key)!;\n }\n if (!this.#loadChildren) {\n return [];\n }\n const items = await collectDataResult(this.#loadChildren({ node, depth }, signal), signal);\n const children = [...items] as TreeNode[];\n if (!signal.aborted) {\n this.#cache.set(key, children);\n }\n return children;\n }\n\n // ---------------------------------------------------------------------------\n // Cache invalidation\n // ---------------------------------------------------------------------------\n\n /**\n * Clears the cached children for the node with the given key.\n * Connected components will collapse that node (if currently expanded), so that\n * the next expand triggers a fresh `loadChildren` call.\n */\n invalidate(key: string): void {\n this.#cache.delete(key);\n this.#notify({ type: `invalidate`, key });\n }\n\n // ---------------------------------------------------------------------------\n // Convenience mutators\n // ---------------------------------------------------------------------------\n\n /**\n * Adds `node` as a child of the node identified by `parentKey`.\n * Returns the new root (connected components are notified automatically).\n */\n addNode(parentKey: string, node: TreeNode): TreeNode {\n this.#root = addChildTo(this.#root, parentKey, node);\n this.#notify({ type: `root`, root: this.#root });\n return this.#root;\n }\n\n /**\n * Removes the node with the given key and all its descendants.\n * Returns the new root (connected components are notified automatically).\n */\n removeNode(key: string): TreeNode {\n this.#cache.delete(key);\n this.#root = removeNodeFrom(this.#root, key);\n this.#notify({ type: `root`, root: this.#root });\n return this.#root;\n }\n\n /**\n * Applies a partial update to the `item` of the node with the given key.\n * Returns the new root (connected components are notified automatically).\n */\n updateItem(key: string, patch: Partial<TreeItem>): TreeNode {\n this.#root = mapNode(this.#root, key, n => ({\n item: { ...n.item, ...patch },\n children: n.children,\n }));\n this.#notify({ type: `root`, root: this.#root });\n return this.#root;\n }\n\n /**\n * Moves the node with the given key to become a child of `newParentKey`.\n * Returns the new root (connected components are notified automatically).\n */\n moveNode(key: string, newParentKey: string): TreeNode {\n this.#root = moveNodeTo(this.#root, key, newParentKey);\n this.#notify({ type: `root`, root: this.#root });\n return this.#root;\n }\n\n // ---------------------------------------------------------------------------\n // Internal subscription (used by components — not part of the public API)\n // ---------------------------------------------------------------------------\n\n /**\n * Subscribe to model events. Returns an unsubscribe function.\n * Components call this when the `model` property is set, and unsubscribe when it is unset.\n *\n * @internal\n */\n _subscribe(callback: ModelSubscriber): () => void {\n this.#subscribers.add(callback);\n return () => this.#subscribers.delete(callback);\n }\n\n #notify(event: ModelEvent): void {\n for (const sub of this.#subscribers) {\n sub(event);\n }\n }\n}\n","/* eslint-disable ts/no-unsafe-declaration-merging */\nimport type { CommandRegistry } from '@clinth/ui-commands';\nimport 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 TreeItemDblClickDetail,\n TreeItemDblClickEvent,\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 { ListSearchMode } from '../incr-search/index.js';\nimport type { TreeConfig } from './types.js';\nimport { createCommandRegistry } from '@clinth/ui-commands';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { repeat } from 'lit/directives/repeat.js';\nimport { collectDataResult } from '../common/data-provider.js';\nimport {\n createTreeListSearchAdapter,\n LIST_SEARCH_MODES,\n ListSearchController,\n\n listSearchStyles,\n registerListSearchCommands,\n} from '../incr-search/index.js';\nimport { tickledItemStyles, tickledStyles } from '../interaction/index.js';\nimport { animateListItemIn, animateListItemOut } from '../interaction/list-item-animation.js';\nimport { TickledController } from '../interaction/tickled-controller.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\n\n/** Above this many rows entering / leaving at once, skip the animation entirely. */\nconst MAX_ANIMATED_ROWS = 50;\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 @property({ attribute: false })\n registry: CommandRegistry<unknown> | undefined = undefined;\n\n /**\n * Space-separated subset of `navigate select filter` — limits which\n * incremental-search modes are offered. Unset ⇒ all three; empty ⇒ search\n * disabled. See `docs/infra-incremental.md`.\n */\n @property({ type: String, attribute: `search-modes`, reflect: true })\n searchModes: string | undefined;\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 /** Incremental search (navigate / select / filter). See `docs/infra-incremental.md`. */\n readonly search = new ListSearchController<{ node: TreeNode; depth: number }>(this, {\n adapter: createTreeListSearchAdapter(this, {\n labelSelector: `.tree-label`,\n highlightKey: `incr-search-highlight`,\n }),\n });\n\n #unregisterSearchCommands: (() => void) | undefined;\n\n #effectiveSearchModes(): ListSearchMode[] {\n const raw = this.searchModes?.trim();\n if (raw === undefined)\n return [...LIST_SEARCH_MODES];\n const requested = new Set(raw.split(/\\s+/));\n return LIST_SEARCH_MODES.filter(m => requested.has(m));\n }\n\n #syncSearchCommands(): void {\n if (!this.#ownedRegistry)\n return;\n this.search.setModes(this.#effectiveSearchModes());\n this.#unregisterSearchCommands?.();\n this.#unregisterSearchCommands = registerListSearchCommands(this.#ownedRegistry, this.search);\n }\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 #ownedRegistry: CommandRegistry<unknown> | undefined;\n\n #config: TreeConfig = {\n indent: 20,\n };\n\n // --- Insertion / removal animation ---\n // The visible node list is diffed each update: rows that appear (a branch\n // expanded, a node added to the model) collapse in; rows that disappear (a\n // branch collapsed, a node removed) are kept as fading \"ghost\" rows until\n // their collapse-out finishes. All no-ops under `prefers-reduced-motion`.\n #renderedKeys: string[] = [];\n #lastNodeByKey = new Map<string, { node: TreeNode; depth: number }>();\n #enteringKeys = new Set<string>();\n #leaving = new Map<string, { node: TreeNode; depth: number }>();\n #leavingAnimations = new Map<string, Animation>();\n #treeAnimReady = false;\n\n #cancelLeavingAnimation(key: string): void {\n const animation = this.#leavingAnimations.get(key);\n animation?.cancel();\n this.#leavingAnimations.delete(key);\n }\n\n #cancelAllLeavingAnimations(): void {\n for (const animation of this.#leavingAnimations.values()) {\n try {\n animation.cancel();\n } catch {\n // Ignore — cancelling a finished animation can reject its `finished`.\n }\n }\n this.#leavingAnimations.clear();\n }\n\n override willUpdate(changedProps: PropertyValues) {\n super.willUpdate(changedProps);\n this.#diffVisibleNodes();\n }\n\n #diffVisibleNodes(): void {\n const nodes = this.root ? this.#getAllNodes() : [];\n const nowKeys = new Set(nodes.map(n => n.node.item.key));\n\n this.#enteringKeys.clear();\n if (this.#treeAnimReady && this.#renderedKeys.length > 0) {\n const prevSet = new Set(this.#renderedKeys);\n for (const { node } of nodes) {\n if (!prevSet.has(node.item.key))\n this.#enteringKeys.add(node.item.key);\n }\n if (this.#enteringKeys.size > MAX_ANIMATED_ROWS)\n this.#enteringKeys.clear();\n\n for (const key of this.#renderedKeys) {\n if (!nowKeys.has(key) && !this.#leaving.has(key)) {\n const last = this.#lastNodeByKey.get(key);\n if (last)\n this.#leaving.set(key, last);\n }\n }\n }\n // A ghost whose key is visible again (re-expanded fast) stops being a\n // ghost. Its outgoing animation must be cancelled: merely deleting the\n // bookkeeping leaves the `fill: forwards` final frame overriding the\n // reused `<li>` (height 0 / opacity 0) indefinitely.\n for (const key of [...this.#leaving.keys()]) {\n if (nowKeys.has(key)) {\n this.#cancelLeavingAnimation(key);\n this.#leaving.delete(key);\n }\n }\n if (this.#leaving.size > MAX_ANIMATED_ROWS) {\n this.#cancelAllLeavingAnimations();\n this.#leaving.clear();\n }\n }\n\n /** True while `node` is a fading ghost row (removed / collapsed, still animating out). */\n protected _isLeaving(node: TreeNode): boolean {\n return this.#leaving.has(node.item.key);\n }\n\n /**\n * True when `filterPredicate` is set and neither `node` nor any descendant\n * matches — the row should carry the `filtered` class (`display: none`).\n */\n protected _isFilteredOut(node: TreeNode, depth: number): boolean {\n return this.filterPredicate !== undefined && !this.#matchesFilter(node, depth);\n }\n\n /** Splice the fading ghost rows back into the visible list near where they were. */\n #weaveLeaving(nodes: Array<{ node: TreeNode; depth: number }>): Array<{ node: TreeNode; depth: number }> {\n if (this.#leaving.size === 0)\n return nodes;\n const result = [...nodes];\n const indexOfKey = (key: string): number => result.findIndex(e => e.node.item.key === key);\n for (const [key, entry] of this.#leaving) {\n const prevIdx = this.#renderedKeys.indexOf(key);\n let insertAt = result.length;\n for (let j = prevIdx + 1; j < this.#renderedKeys.length; j++) {\n const at = indexOfKey(this.#renderedKeys[j]);\n if (at !== -1) {\n insertAt = at;\n break;\n }\n }\n result.splice(insertAt, 0, entry);\n }\n return result;\n }\n\n #runItemAnimations(): void {\n if (this.#enteringKeys.size > 0) {\n for (const el of this.renderRoot.querySelectorAll<HTMLElement>(`.item`)) {\n const key = el.dataset.key;\n if (key === undefined || !this.#enteringKeys.has(key))\n continue;\n // A revived row may still carry its outgoing collapse animation\n // (same `<li>` reused by the keyed repeat). Cancel it so the entrance\n // starts from a clean style cascade.\n if (this.#leavingAnimations.has(key)) {\n this.#cancelLeavingAnimation(key);\n } else {\n for (const animation of el.getAnimations())\n animation.cancel();\n }\n animateListItemIn(el);\n }\n this.#enteringKeys.clear();\n }\n if (this.#leaving.size > 0) {\n for (const el of this.renderRoot.querySelectorAll<HTMLElement>(`.item.leaving`)) {\n const key = el.dataset.key;\n if (key === undefined || this.#leavingAnimations.has(key))\n continue;\n const result = animateListItemOut(el);\n const animation = result.animation;\n if (!animation) {\n // Reduced motion / zero size: no handle to own; drop the ghost.\n void result.then(() => {\n if (!this.#leaving.has(key))\n return;\n this.#leaving.delete(key);\n this.requestUpdate();\n });\n continue;\n }\n // Supersede any stale handle for the same key before owning the new one.\n this.#cancelLeavingAnimation(key);\n this.#leavingAnimations.set(key, animation);\n void result.then(() => {\n // Race-safe: only the current outgoing animation may clean up.\n if (this.#leavingAnimations.get(key) !== animation)\n return;\n this.#leavingAnimations.delete(key);\n this.#leaving.delete(key);\n this.requestUpdate();\n // Remove the retained `fill: forwards` effect after the ghost row\n // has been removed from the next render, so a later reuse of the\n // node (or Lit's DOM pool) never inherits the collapsed frame.\n // Awaiting updateComplete avoids a one-frame flash back to full size.\n void this.updateComplete.then(() => {\n try {\n animation.cancel();\n } catch {\n // Ignore — already cancelled by a revival path.\n }\n });\n });\n }\n }\n const visible = this.root ? this.#getAllNodes() : [];\n this.#renderedKeys = visible.map(n => n.node.item.key);\n this.#lastNodeByKey.clear();\n for (const entry of visible)\n this.#lastNodeByKey.set(entry.node.item.key, entry);\n this.#treeAnimReady = true;\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 // A new root invalidates every ghost row; cancel their animations so no\n // retained `fill: forwards` frame survives on a reused `<li>`.\n this.#cancelAllLeavingAnimations();\n this.#leaving.clear();\n this.#enteringKeys.clear();\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 this.#runItemAnimations();\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.setAttribute(`data-input-mode`, `mouse`);\n const registry = this.#ownedRegistry = createCommandRegistry();\n registry.register({\n id: `select-all`,\n label: `Select All`,\n description: `Select all visible items`,\n execute: () => this.selectAll(),\n });\n registry.register({\n id: `deselect-all`,\n label: `Deselect All`,\n description: `Clear all selection`,\n execute: () => this.deselectAll(),\n });\n this.registry = registry;\n this.#syncSearchCommands();\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n this.#cancelAllLeavingAnimations();\n this.#leaving.clear();\n this.#enteringKeys.clear();\n this.#modelUnsubscribe?.();\n this.#modelUnsubscribe = undefined;\n this.#unregisterSearchCommands?.();\n this.#unregisterSearchCommands = undefined;\n if (this.#ownedRegistry) {\n this.#ownedRegistry.unregister(`select-all`);\n this.#ownedRegistry.unregister(`deselect-all`);\n this.#ownedRegistry = undefined;\n this.registry = undefined;\n }\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 selectAll(): void {\n const prev = new Set(this._selectedNodes);\n if (this.interactionMode === `checked`) {\n for (const { node } of this.#getAllNodes()) {\n if (!this.#canSelect(node))\n continue;\n this.#applyCheckedToggle(node, true);\n }\n } else {\n for (const { node } of this.#getAllNodes()) {\n if (!this.#canSelect(node))\n continue;\n this._selectedNodes.add(node);\n }\n this.selectedNode = [...this._selectedNodes].at(-1);\n }\n this.#dispatchSelect(prev);\n this.requestUpdate();\n }\n\n deselectAll(): void {\n const prev = new Set(this._selectedNodes);\n if (this.interactionMode === `checked`) {\n for (const { node } of this.#getAllNodes()) {\n if (!this.#canSelect(node))\n continue;\n this.#applyCheckedToggle(node, false);\n }\n } else {\n this.#clearSelectionInternal();\n }\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 /** Expand ancestors + move the cursor to `key`, without touching the selection (search \"navigate\" mode). */\n revealKey(key: string): boolean {\n if (!this.root?.children)\n return false;\n const path = this.#findNodePath(this.root.children, n => n.item.key === key);\n if (!path)\n return false;\n for (let i = 0; i < path.length - 1; i++) {\n this.#applyExclusivity(path[i]);\n this._expandedKeys.add(path[i]);\n }\n this.tickled.setTickled(key);\n this.requestUpdate();\n void this.updateComplete.then(() => this.#scrollKeyIntoView(key));\n return true;\n }\n\n /** Replace the selection with `nodes` (subject to `selectionFilter`) — search \"select\" mode. */\n selectMany(nodes: Iterable<TreeNode>): void {\n const prev = new Set(this._selectedNodes);\n this._selectedNodes = new Set([...nodes].filter(n => this.#canSelect(n)));\n this.selectedNode = [...this._selectedNodes].at(-1);\n this.#dispatchSelect(prev);\n this.requestUpdate();\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, depth);\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 // Second (or later) click of a double-click. `MouseEvent.detail` is the\n // running click count, so it is 2 on the second click. Swallow it: the\n // container's dblclick handler dispatches `item-dblclick`, and skipping the\n // switch below means a branch is never toggled open/closed by a double-click.\n if (event && event.detail >= 2)\n return;\n\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, event); 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 /**\n * True when a click landed on the expand/collapse caret rather than the node\n * label. Caret clicks should only toggle expansion, never select or navigate.\n * The caret and label are siblings in the same shadow root, so `closest` on\n * the event target resolves reliably. See tree-fix.md.\n */\n #clickedOnCaret(node: TreeNode, event?: MouseEvent): boolean {\n // Leaf nodes still render an (empty) caret gutter for alignment; clicking\n // there should behave like a label click, so only guard branch nodes.\n if (node.item.isLeaf === true)\n return false;\n const target = event?.target;\n if (!(target instanceof Element))\n return false;\n return target.closest(`.tree-caret`) !== null;\n }\n\n #handleImplicitClick(node: TreeNode, depth: number, event?: MouseEvent): void {\n if (!this.#clickedOnCaret(node, event) && 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. A click on the caret only toggles\n // expansion — it must not change selection or trigger navigation.\n if (!this.#clickedOnCaret(node, event) && 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 children = [...await collectDataResult(\n this.loadChildren!({ node, depth }, controller.signal),\n controller.signal,\n )];\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 {\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, depth = 0): 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, depth + 1));\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 // `_isExpanded` also returns true for branches that have a filter match\n // among their descendants, so filter-search reveals the matches rather\n // than just narrowing the collapsed top level.\n if (n.children && this._isExpanded(n, d)) {\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 // Root itself is never rendered — start at -1 so its children are depth 0\n return this.#getVisibleNodes(this.root, -1);\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 if (this.search.isOpen)\n return;\n const nodes = this.#getAllNodes();\n if (nodes.length === 0)\n return;\n\n if ((event.ctrlKey || event.metaKey) && event.key === `a`) {\n event.preventDefault();\n this.selectAll();\n return;\n }\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 > 0) {\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 ${this.search.renderField()}\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 const detail = { node: node.node, depth: node.depth };\n this.dispatchEvent(new CustomEvent<TreeItemDblClickDetail>(`item-dblclick`, {\n detail,\n bubbles: true,\n composed: true,\n }));\n // `activate` still fires here for back-compat (Enter key also dispatches it).\n this.dispatchEvent(new CustomEvent<TreeActivateDetail>(`activate`, {\n detail,\n bubbles: true,\n composed: true,\n }));\n };\n\n #renderNodes(nodes: Array<{ node: TreeNode; depth: number }>) {\n if (nodes.length === 0 && this.#pendingNode && this.#leaving.size === 0) {\n return html`\n <div class=\"tree-loading\">\n ${this.renderLoadingIndicator()}\n </div>\n `;\n }\n\n // Keyed by node key so Lit never recycles a <li> across nodes — otherwise a\n // running leave animation (WAAPI, fill:forwards) would land on whatever node\n // reuses that <li> after the list shrinks, squashing it to 0 height.\n return html`\n <ul class=\"tree-list\" role=\"tree\">\n ${repeat(\n this.#weaveLeaving(nodes),\n ({ node }) => node.item.key,\n ({ node, depth }) => this._renderNode(node, depth),\n )}\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, depth);\n const isPending = this.#pendingNode === node;\n const isFiltered = this._isFilteredOut(node, depth);\n const isLeaving = this._isLeaving(node);\n\n return html`\n <li\n class=\"item ${selected ? `selected` : ``} ${tickled ? `tickled` : ``} ${isBranch ? `branch` : `leaf`} ${isFiltered ? `filtered` : ``} ${isLeaving ? `leaving` : ``}\"\n role=\"treeitem\"\n aria-selected=${selected}\n aria-expanded=${isBranch ? isExpanded : nothing}\n aria-hidden=${isLeaving ? `true` : 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 themeFallbacks,\n tickledStyles,\n tickledItemStyles,\n listSearchStyles,\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: 30px;\n --tree-caret-size: 30px;\n --tree-radius: var(--radius-s);\n\n position: relative;\n display: block;\n overflow: hidden;\n box-sizing: border-box;\n background: var(--tree-bg);\n color: var(--tree-text);\n }\n\n /* min-height (not height) so the tree still grows to its content when the\n host has no explicit height; when it does, this fills it and scrolls.\n The scroll lives here, not on :host, so the search popover (a sibling of\n #container, positioned against :host) stays put while the list scrolls. */\n #container {\n outline: none;\n min-height: 100%;\n max-height: 100%;\n overflow: auto;\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 /* Deliberately narrower than the icon: Lucide chevrons fill only ~half\n their viewBox, so letting the glyph overflow a slim box closes the\n visual gap to the label without shifting the indent. */\n width: calc(var(--tree-caret-size) * 0.5);\n height: var(--tree-caret-size);\n flex-shrink: 0;\n margin-right: 1px;\n overflow: visible;\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 /* Fading-out ghost row (see #runItemAnimations) — inert while it collapses. */\n .item.leaving {\n pointer-events: none;\n overflow: hidden;\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 'item-dblclick': TreeItemDblClickEvent;\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","/* eslint-disable ts/no-unsafe-declaration-merging */\nimport type { TemplateResult } from 'lit';\nimport type { TreeBaseElementEventMap } from './tree-base.js';\nimport type { TreeNode } from './types.js';\nimport { css, html, nothing } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport { TreeBaseElement } from './tree-base.js';\n\n/** Checkbox tri-state in `checked` interactionMode: a branch node is `indeterminate` when some but not all of its descendants are selected. */\nexport type TreeCheckboxState = `checked` | `unchecked` | `indeterminate`;\n\nfunction computeCheckboxState(node: TreeNode, selectedNodes: ReadonlySet<TreeNode>): TreeCheckboxState {\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 /**\n * Optional renderer for the checkbox shown in `checked` interactionMode.\n * Receives the node's current tri-state (`checked` / `unchecked` / `indeterminate`,\n * the latter when some but not all descendants are selected) and returns a Lit\n * template.\n *\n * When set, the checkbox becomes a `<span role=\"checkbox\">` whose contents are\n * whatever this returns. When unset, a native `<input type=\"checkbox\">` is used.\n *\n * @example\n * list.checkboxRenderer = (state) => state === `unchecked`\n * ? html``\n * : html`<svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\"\n * fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n * stroke-linecap=\"round\" stroke-linejoin=\"round\"\n * style=\"opacity:${state === `indeterminate` ? 0.35 : 0.6}\">\n * <polyline points=\"3,8 7,12 13,4\" />\n * </svg>`;\n */\n @property({ attribute: false })\n checkboxRenderer: ((state: TreeCheckboxState) => unknown) | undefined;\n\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 // Root itself is never rendered — start at -1 so its children are depth 0\n visit(this.root, -1);\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, depth);\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`${this.#renderCheckbox(node, depth, state)}${caretAndLabel}`;\n }\n\n return caretAndLabel;\n }\n\n #renderCheckbox(node: TreeNode, depth: number, state: TreeCheckboxState): TemplateResult {\n const onClick = (e: MouseEvent) => this._handleCheckboxClick(e, node, depth);\n\n if (this.checkboxRenderer) {\n const ariaChecked = state === `indeterminate` ? `mixed` : state === `checked` ? `true` : `false`;\n return html`\n <span\n class=\"tree-checkbox tree-checkbox-custom\"\n part=\"checkbox\"\n role=\"checkbox\"\n tabindex=\"-1\"\n aria-checked=${ariaChecked}\n aria-label=\"Select ${node.item.label}\"\n @click=${onClick}\n >${this.checkboxRenderer(state)}</span>`;\n }\n\n return html`\n <input\n type=\"checkbox\"\n class=\"tree-checkbox\"\n part=\"checkbox\"\n .checked=${state === `checked`}\n .indeterminate=${state === `indeterminate`}\n aria-label=\"Select ${node.item.label}\"\n @click=${onClick}\n />`;\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, depth);\n const isPending = this._pendingNode === node;\n const hasIconAtDepth = this.#depthsWithIcons.has(depth);\n const isLeaving = this._isLeaving(node);\n const isFiltered = this._isFilteredOut(node, depth);\n\n return html`\n <li\n class=\"item ${selected ? `selected` : ``} ${tickled ? `tickled` : ``} ${isBranch ? `branch` : `leaf`} ${hasIconAtDepth ? `has-icon-at-depth` : ``} ${isLeaving ? `leaving` : ``} ${isFiltered ? `filtered` : ``}\"\n data-key=${node.item.key}\n role=\"treeitem\"\n aria-selected=${selected}\n aria-expanded=${isBranch ? isExpanded : nothing}\n aria-hidden=${isLeaving ? `true` : 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 themeFallbacks,\n ...TreeBaseElement.styles,\n css`\n .tree-caret {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n /* Deliberately narrower than the icon: Lucide chevrons fill only ~half\n their viewBox, so letting the glyph overflow a slim box closes the\n visual gap to the label without shifting the indent. */\n width: calc(var(--tree-caret-size) * 0.5);\n height: var(--tree-caret-size);\n flex-shrink: 0;\n margin-right: 1px;\n overflow: visible;\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, 0px);\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 .tree-checkbox-custom {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n /* Reserves a click target even when the renderer returns empty content\n (e.g. the \"nothing when unchecked\" subtle style) — without an explicit\n size the empty span collapses to 0×0 and becomes unclickable. */\n width: var(--tree-checkbox-size, 14px);\n height: var(--tree-checkbox-size, 14px);\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","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 let currentColumn = this.#element.root?.children ?? [];\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 node = currentColumn.find(n => n.item.key === key);\n if (!node)\n return false;\n\n if (node.children === undefined) {\n const mapped = this.#nodeToTree.get(node);\n if (mapped)\n node.children = this.#childrenOf(mapped);\n }\n currentColumn = node.children ?? [];\n }\n }\n\n return this.#element.navigateTo(keys);\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"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"tree-component-nPP5Y-WS.d.ts","names":[],"sources":["../src/common/tree-data-model.ts","../src/common/tree-component.ts"],"mappings":";;KAOK;EAAoB;EAAoB;;KACxC;EAAc;EAAc,MAAM;;KAClC,aAAa,kBAAkB;KAE/B,mBAAmB,OAAO;KAmEnB;;EAEV,MAAM;;;;;EAKN,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;cAgCJ;;EAMC,YAAA,SAAS;;MAUjB,QAAQ;;;;;EAQZ,QAAQ,MAAM;;;;;;;;;EAkBR,YAAY,MAAM,UAAU,eAAe,QAAQ,cAAc,QAAQ;;;;;;EAyB/E,WAAW;;;;;EAaX,QAAQ,mBAAmB,MAAM,WAAW;;;;;EAU5C,WAAW,cAAc;;;;;EAWzB,WAAW,aAAa,OAAO,QAAQ,YAAY;;;;;EAanD,SAAS,aAAa,uBAAuB;;;;;;;EAgB7C,WAAW,UAAU;;;;;;;;KC/NX;;WAED,UAAU,YAAY;;WAEtB,UAAU,YAAY;;;;;;;KAQrB;WACD,MAAM;WACN;;;;;;KAOC;WACD,MAAM;WACN;;;;;;KAOC;WACD,MAAM;WACN;;;;;;;KAQC;WACD,MAAM;WACN;;;;;;KAOC;WACD,MAAM;WACN;;;;;;KAOC;WACD,MAAM;WACN;;KAIC,kBAAkB,YAAY;KAC9B,kBAAkB,YAAY;KAC9B,oBAAoB,YAAY;KAChC,qBAAqB,YAAY;KACjC,wBAAwB,YAAY;KACpC,kBAAkB,YAAY;KAC9B,oBAAoB,YAAY;UAM3B;EACf,UAAU;EACV,UAAU;EACV,YAAY;EACZ,cAAc;EACd,UAAU;EACV,YAAY;;;;;;;;;;;;;;;UAoBG,sBAAsB;;;;;;EAQrC,MAAM;;;;;;;EAQN,OAAO;;;;;;EAOP,cAAc;;;;;EAQd,cAAc;;;;;WAML,eAAe,YAAY;;;;;;EASpC,iBAAiB;;;;;;EASjB,iBAAiB;;;;;;EASjB,aAAa;;EAKb,SAAS,MAAM;;EAEf,WAAW,MAAM;;EAEjB;;;;;;EAMA;;EAEA;;;;;EAQA,aAAa;;;;;EAMb,iBAAiB,YAAY,MAAM;;;;;;EAOnC,YAAY;;EAGZ,aAAa,OAAO,SAAS;;;;;EAQ7B,gBAAgB;IAAgB,MAAM;IAAU;;;;;;;;;;;UAejC,uBAAuB;WAC7B,YAAY;WACZ,gBAAgB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"xy-axis-CrrVdDFe.js","names":["#options","#rangeManual","#recompute","#rangeAuto","#rangeStream","#renderIcon","customElement","#addToSeries","#ensurePlot","#seriesSet","#seriesOrder","#instances","#pendingStyles","#onSubPlotPointerMove","#onSubPlotPointerLeave","#escapeHTML","customElement","#bucketIndexFromPosition","#computeBars","#emitSelectionChange","#bucketIndexFromPointer","#setInlineIndex","#updateBubbleTooltip","#hasProgrammaticData","#series","#parseDeclarativeData","#resetHoverState","#readCssVar","#computeGeometry","#getGapPx","#getBarLengthOverride","#valueRefreshTimer","#clearValueRefreshTimer","#scheduleValueRefresh","#tooltipShowTimer","#tooltipHideTimer","#tooltipVisible","#tooltipIndex","#tooltipPosition","#clearBubbleTooltip","#tooltipPositionFor","#refreshBubbleText","#formatBarAt","#isBarInColoredRange","#emitClick","#onPointerMove","#onPointerLeave","#onPointerDown","#onPointerUp","customElement","#lastClientX","#lastClientY","#updateTooltip","#getIndexFromX","#series","#hasProgrammaticData","#updateTooltipAtLastPos","#parseDeclarativeData","#computePoints","#renderByStyle","#onPointerMove","#onPointerLeave","#onClick","customElement","#lastClientX","#lastClientY","#updateTooltip","#findNearestPoint","#lastPoints","#xSeries","#ySeries","#updateTooltipAtLastPos","#computePoints","#computeColours","#onPointerMove","#onPointerLeave","#onClick","customElement"],"sources":["../src/plots/colour-map.ts","../src/plots/data.ts","../src/util/is-numeric.ts","../src/util/tooltip.ts","../src/plots/svg-utils.ts","../src/plots/multi-axis.ts","../src/plots/plot-histogram.ts","../src/plots/single-axis.ts","../src/plots/xy-axis.ts"],"sourcesContent":["/**\n * Colour mapping for plot components.\n *\n * Pipeline:\n * scaledValue (0..1)\n * → applyMapping (easing / custom fn)\n * → computeColour (mode → ColourResult)\n * → applyAgeModification (xy-axis only, compounds age-style on top)\n */\nimport type { EasingName } from '@ixfx/modulation';\nimport { Easings } from '@ixfx/modulation';\nimport { Colour } from '@ixfx/visual';\n\n// --- Types ---\n\nexport type ColourMode = `fixed` | `opacity` | `hue` | `saturation` | `lightness` | `scale`;\n\nexport type ColourMapConfig = {\n mode: ColourMode;\n /** Parsed colours for 'scale' mode. Must have ≥ 2 entries. */\n palette: string[];\n /** ixfx easing name — applied before the colour mode mapping. Takes precedence over valueMap. */\n easingName: string;\n /** Custom value mapping fn (0..1 → 0..1). Used when easingName is empty. */\n valueMap: ((v: number) => number) | null;\n};\n\nexport type ColourResult = { fill: string; opacity: number };\n\n// --- Defaults ---\n\nconst DEFAULT_BASE = `oklch(60% 0.15 140)`;\nconst DEFAULT_PALETTE = [`green`, `yellow`, `red`];\n\n// --- Scale cache: keyed by palette string to avoid recomputing colour steps every render ---\n\nconst _scaleCache = new Map<string, string[]>();\n\nfunction getScaleSteps(palette: string[]): string[] {\n const key = palette.join(`\\x00`);\n if (!_scaleCache.has(key)) {\n _scaleCache.set(key, Colour.scale(palette as Parameters<typeof Colour.scale>[0], { stepsBetween: 99 }));\n }\n return _scaleCache.get(key)!;\n}\n\n// --- Helpers ---\n\n/** Resolve a CSS custom property to its final value, handling var() references. */\nfunction resolveCssVariable(el: Element, prop: string): string {\n const style = getComputedStyle(el);\n let value = style.getPropertyValue(prop).trim();\n\n // Handle var() references - resolve up to 5 levels deep\n const varRegex = /var\\((--[\\w-]+)(?:,\\s*(.*))?\\)/g;\n for (let i = 0; i < 5 && value.includes(`var(`); i++) {\n value = value.replace(varRegex, (_, varName, fallback) => {\n const resolved = style.getPropertyValue(varName).trim();\n if (resolved)\n return resolved;\n if (fallback)\n return fallback.trim();\n return ``;\n });\n }\n\n return value;\n}\n\n/** Read the resolved --plot-color CSS variable from an element. */\nexport function readBaseColour(el: Element): string {\n const v = resolveCssVariable(el, `--plot-color`);\n return v || DEFAULT_BASE;\n}\n\n/** Parse a comma-separated colour string attribute into an array. Falls back to default palette. */\nexport function parseColourScaleAttr(attr: string): string[] {\n if (!attr.trim())\n return DEFAULT_PALETTE;\n const parsed = attr.split(`,`).map(s => s.trim()).filter(Boolean);\n return parsed.length >= 2 ? parsed : DEFAULT_PALETTE;\n}\n\n/** Parse any CSS colour string to HSL scalars (h, s, l all 0..1). */\nfunction toHslScalar(css: string): { h: number; s: number; l: number } {\n try {\n const hsl = Colour.HslSpace.fromCss(css, { scalar: true });\n return { h: hsl.h, s: hsl.s, l: hsl.l };\n } catch {\n return { h: 0.39, s: 0.5, l: 0.55 }; // ~green fallback\n }\n}\n\n/** Apply easing or custom mapping to a 0..1 value. Returns clamped 0..1. */\nfunction applyMapping(v: number, config: ColourMapConfig): number {\n const clamped = Math.max(0, Math.min(1, v));\n if (config.easingName) {\n try {\n return Math.max(0, Math.min(1, Easings.get(config.easingName as EasingName)(clamped)));\n } catch { /* invalid easing name — fall through */ }\n }\n if (config.valueMap) {\n return Math.max(0, Math.min(1, config.valueMap(clamped)));\n }\n return clamped;\n}\n\n// --- Main colour computation ---\n\n/**\n * Compute the fill colour and opacity for a single data point.\n * @param scaledValue Normalised value in 0..1 (data range for single-axis; age fraction for xy).\n * @param baseColour Resolved base colour string (from --plot-color).\n * @param config Colour map configuration.\n */\nexport function computeColour(scaledValue: number, baseColour: string, config: ColourMapConfig): ColourResult {\n const mapped = applyMapping(scaledValue, config);\n\n switch (config.mode) {\n case `fixed`:\n return { fill: baseColour, opacity: 1 };\n\n case `opacity`:\n return { fill: baseColour, opacity: Math.max(0.04, mapped) };\n\n case `hue`: {\n const hsl = toHslScalar(baseColour);\n return {\n fill: `hsl(${Math.round(mapped * 360)}deg ${Math.round(hsl.s * 100)}% ${Math.round(hsl.l * 100)}%)`,\n opacity: 1,\n };\n }\n\n case `saturation`: {\n const hsl = toHslScalar(baseColour);\n return {\n fill: `hsl(${Math.round(hsl.h * 360)}deg ${Math.round(mapped * 100)}% ${Math.round(hsl.l * 100)}%)`,\n opacity: 1,\n };\n }\n\n case `lightness`: {\n const hsl = toHslScalar(baseColour);\n return {\n fill: `hsl(${Math.round(hsl.h * 360)}deg ${Math.round(hsl.s * 100)}% ${Math.round(mapped * 100)}%)`,\n opacity: 1,\n };\n }\n\n case `scale`: {\n const palette = config.palette.length >= 2 ? config.palette : DEFAULT_PALETTE;\n const steps = getScaleSteps(palette);\n const idx = Math.min(steps.length - 1, Math.floor(mapped * steps.length));\n return { fill: steps[idx], opacity: 1 };\n }\n\n default:\n return { fill: baseColour, opacity: 1 };\n }\n}\n\n/**\n * Apply xy-axis age-style modification on top of a base ColourResult.\n * 'size' is not handled here — the caller adjusts the radius separately.\n */\nexport function applyAgeModification(base: ColourResult, ageFraction: number, ageStyle: string): ColourResult {\n if (ageStyle === `opacity`) {\n return { ...base, opacity: base.opacity * Math.max(0.08, ageFraction ** 0.6) };\n }\n if (ageStyle === `desaturation`) {\n const hsl = toHslScalar(base.fill);\n const sFaded = hsl.s * ageFraction; // older → less saturation\n return {\n fill: `hsl(${Math.round(hsl.h * 360)}deg ${Math.round(sFaded * 100)}% ${Math.round(hsl.l * 100)}%)`,\n opacity: base.opacity,\n };\n }\n return base;\n}\n","import { rangeStream } from \"@ixfx/numbers\";\n\nexport type PlotDataSeriesOptions = {\n /**\n * Limit of how many data points to store.\n * Default: 100\n */\n capacityLimit: number;\n /**\n * If _true_, it maintains the same scale over its lifetime.\n * If _false_, scale adjusts based on items in its cache.\n *\n * Default: true\n */\n persistentScaling: boolean;\n\n fixedRange: { min: number; max: number } | null;\n};\n\n/**\n * A data series\n */\nexport class PlotDataSeries {\n values: number[] = [];\n #rangeStream = rangeStream();\n #rangeAuto: { min: number; max: number } = { min: 0, max: 0 };\n #rangeManual: { min: number; max: number } | null = null;\n #options: PlotDataSeriesOptions;\n\n /**\n * Constructor.\n *\n * Default options:\n * - `capacityLimit`: 100\n * - `persistentScaling`: true\n * - `fixedRange`: null\n * @param options\n */\n constructor(options: Partial<PlotDataSeriesOptions> = {}) {\n this.#options = {\n capacityLimit: 100,\n persistentScaling: true,\n fixedRange: null,\n ...options,\n };\n if (this.#options.fixedRange !== null) {\n this.#rangeManual = this.#options.fixedRange;\n }\n }\n\n /**\n * Sets a manual range, this disabled auto-scaling.\n * Use {@link unsetRange} to re-enable auto-scaling.\n * @param min\n * @param max\n */\n setRange(min: number, max: number) {\n this.#rangeManual = { min, max };\n }\n\n /**\n * Disable the manual range\n */\n unsetRange() {\n this.#rangeManual = null;\n this.#recompute();\n }\n\n get isAutoRange() {\n return this.#rangeManual === null;\n }\n\n /**\n * Adds a single value\n * @param valueOrValues Value to add\n */\n add(valueOrValues: number | number[]) {\n if (typeof valueOrValues === `number`) {\n this.values.push(valueOrValues);\n if (this.isAutoRange) {\n this.#rangeAuto = this.#rangeStream.seen(valueOrValues);\n }\n } else {\n this.values.push(...valueOrValues);\n if (this.isAutoRange) {\n for (const v of valueOrValues) {\n this.#rangeAuto = this.#rangeStream.seen(v);\n }\n }\n }\n if (this.values.length > this.#options.capacityLimit) {\n this.values = this.values.slice(this.values.length - this.#options.capacityLimit);\n if (!this.#options.persistentScaling && this.isAutoRange) {\n this.#recompute();\n }\n }\n }\n\n #recompute() {\n if (!this.#options.persistentScaling) {\n this.#rangeStream = rangeStream();\n }\n for (let i = 0; i < this.values.length; i++) {\n this.#rangeAuto = this.#rangeStream.seen(this.values[i]);\n }\n }\n\n /**\n * Sets the entire data series at once, replacing any existing data. If the number of values exceeds the `capacityLimit`, only the most recent values up to the limit are kept.\n * @param values\n */\n set(values: number[]) {\n if (values.length > this.#options.capacityLimit) {\n values = values.slice(values.length - this.#options.capacityLimit);\n }\n this.values = values;\n this.#recompute();\n }\n\n /**\n * Returns the manual range if this is in effect, or the automatic\n */\n get range() {\n if (this.#rangeManual)\n return this.#rangeManual;\n return this.#rangeAuto;\n }\n\n /**\n * Clear all data and reset range. If `persistentScaling` is _false_, also resets scaling to initial state.\n * @returns _true_ if there was data to clear\n */\n clear(): boolean {\n const empty = this.values.length === 0;\n this.values = [];\n if (!this.#options.persistentScaling) {\n this.#recompute();\n }\n return !empty;\n }\n}","export function isNumeric(str: unknown): boolean {\n if (typeof str === `number`)\n return true;\n if (typeof str !== `string`)\n return false;\n const trimmed = str.trim();\n return trimmed !== `` && !Number.isNaN(Number(trimmed));\n}","import { html, LitElement, nothing } from \"lit\";\nimport { property } from \"lit/decorators.js\";\nimport { classMap } from \"lit/directives/class-map.js\";\nimport { unsafeHTML } from \"lit/directives/unsafe-html.js\";\nimport { hasIcon } from \"../icons/index.js\";\nimport { safeCustomElement as customElement } from \"./custom-elements.js\";\nimport { isNumeric } from \"./is-numeric.js\";\n\nexport type FormatValueForHuman = (v: unknown) => string;\nexport type TooltipOrientations = `top` | `right` | `bottom` | `left`;\n\n// `ixfx-tooltip` renders to light DOM (see createRenderRoot() below) so it can inherit\n// styling from whatever shadow root it's embedded in (e.g. range-input bundles its own\n// tooltipValueStyles for a scoped bubble-arrow look). That means Lit's `static styles`\n// mechanism can't apply here (it needs adoptedStyleSheets, only available on a ShadowRoot\n// or Document) - so a *standalone* `ixfx-tooltip` (appended directly to <body>, not nested\n// in another component's shadow root) gets no styling at all unless something supplies it.\n// This injects that baseline once, globally, scoped to the bare tag so it never leaks into\n// (or fights with) a host component's own shadow-scoped tooltip styles.\nlet _baseStylesInjected = false;\nfunction ensureBaseTooltipStyles(): void {\n if (_baseStylesInjected)\n return;\n _baseStylesInjected = true;\n const style = document.createElement(`style`);\n style.textContent = `\n ixfx-tooltip {\n display: inline-block;\n background: var(--surface-5);\n color: var(--surface-5-text);\n border: var(--border);\n border-radius: var(--radius-l, 6px);\n box-shadow: var(--shadow-m);\n padding: var(--space-s, 4px);\n font-size: 10px;\n font-family: var(--font-family, inherit);\n }\n ixfx-tooltip .tooltip-type-number {\n font-family: var(--font-mono, ui-monospace, monospace);\n }\n `;\n document.head.appendChild(style);\n}\n\n@customElement(`ixfx-tooltip`)\nexport class TooltipElement extends LitElement {\n override connectedCallback(): void {\n super.connectedCallback();\n ensureBaseTooltipStyles();\n }\n\n static numberFormatter = (v: number) => Math.floor(v).toString();\n\n static defaultFormatter: FormatValueForHuman = (v) => {\n if (typeof v === `number`) {\n if (Number.isInteger(v))\n return v.toString();\n return v.toFixed(2);\n } else if (typeof v === `string`) {\n return v;\n } else {\n return JSON.stringify(v);\n }\n };\n\n valueFormatTooltip: FormatValueForHuman = TooltipElement.defaultFormatter;\n\n @property({ type: String })\n orientation: TooltipOrientations = `top`;\n\n @property({ type: String })\n anchor = `--tooltip`;\n\n @property()\n value: unknown;\n\n @property({ type: String })\n icon?: string;\n\n #renderIcon() {\n if (!this.icon)\n return nothing;\n\n if (this.icon.startsWith(`<svg`)) {\n return html`<span class=\"tooltip-icon\" style=\"display:inline-flex;align-items:center;margin-right:0.25em\">${unsafeHTML(this.icon)}</span>`;\n }\n\n if (!hasIcon(this.icon))\n return nothing;\n\n return html`<ixfx-icon class=\"tooltip-icon\" style=\"margin-right:0.25em\" name=\"${this.icon}\"></ixfx-icon>`;\n }\n\n protected render() {\n const classes = {\n \"tooltip\": true,\n \"tooltip-orientation-top\": this.orientation === `top`,\n \"tooltip-orientation-bottom\": this.orientation === `bottom`,\n \"tooltip-orientation-right\": this.orientation === `right`,\n \"tooltip-orientation-left\": this.orientation === `left`,\n \"tooltip-type-text\": true,\n \"tooltip-type-number\": false,\n \"tooltip-style-bubble\": true,\n };\n let value = ``;\n switch (typeof this.value) {\n case `number`:\n classes[`tooltip-type-number`] = true;\n value = this.valueFormatTooltip(this.value);\n break;\n case `string`:\n if (isNumeric(this.value)) {\n classes[`tooltip-type-number`] = true;\n value = this.valueFormatTooltip(Number.parseFloat(this.value));\n } else {\n value = this.value;\n }\n break;\n default:\n value = JSON.stringify(this.value);\n }\n return html`<output style=\"--anchor-id: ${this.anchor}\" class=${classMap(classes)}>${this.#renderIcon()}${value}</output>`;\n }\n\n protected createRenderRoot() {\n return this;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ixfx-tooltip\": TooltipElement;\n }\n}\n","/**\n * Shared utilities for SVG-based plot components.\n */\nimport type { TooltipElement } from '../util/tooltip.js';\nimport '../util/tooltip.js';\n\n// --- Tooltip singleton ---\n\nlet _tooltipEl: HTMLDivElement | null = null;\nlet _tooltipOwner: Element | null = null;\n\nfunction ensureTooltip(): HTMLDivElement {\n if (_tooltipEl)\n return _tooltipEl;\n const el = document.createElement(`div`);\n el.style.cssText = `\n position: fixed;\n pointer-events: none;\n z-index: 9999;\n background: var(--surface-5);\n color: var(--surface-5-text);\n border: var(--border);\n border-radius: var(--radius-l, 6px);\n box-shadow: var(--shadow-m);\n padding: 2px 6px;\n font-size: 10px;\n font-family: ui-monospace, monospace;\n opacity: 0;\n transition: opacity 0.1s ease;\n `;\n document.body.appendChild(el);\n _tooltipEl = el;\n return el;\n}\n\nexport function showTooltip(owner: Element, clientX: number, clientY: number, text: string): void {\n const el = ensureTooltip();\n _tooltipOwner = owner;\n el.textContent = text;\n el.style.whiteSpace = `nowrap`;\n el.style.left = `${clientX + 14}px`;\n el.style.top = `${clientY + 14}px`;\n el.style.opacity = `1`;\n}\n\nexport function showTooltipHTML(owner: Element, clientX: number, clientY: number, html: string): void {\n const el = ensureTooltip();\n _tooltipOwner = owner;\n el.innerHTML = html;\n el.style.whiteSpace = `normal`;\n el.style.left = `${clientX + 14}px`;\n el.style.top = `${clientY + 14}px`;\n el.style.opacity = `1`;\n}\n\nexport function hideTooltip(owner: Element): void {\n if (_tooltipOwner !== owner)\n return;\n const el = ensureTooltip();\n el.style.opacity = `0`;\n _tooltipOwner = null;\n}\n\n// --- Bar/segment bubble tooltip (ixfx-tooltip based) ---\n//\n// Unlike showTooltip() above (which tracks the cursor directly), this variant is meant\n// for discrete hover targets (e.g. histogram buckets): the caller decides *when* to\n// (re)position it (typically only on a hovered-index change, not on every pointermove),\n// and where along the cross-axis it should sit (typically cursor-relative, captured once).\n\nlet _bubbleEl: TooltipElement | null = null;\nlet _bubbleOwner: Element | null = null;\n\n// Visual chrome (background/border/radius/shadow/padding/font) is intrinsic to `ixfx-tooltip`\n// itself (see ensureBaseTooltipStyles() in util/tooltip.ts) - only positioning/animation is set here.\nfunction ensureBubble(): TooltipElement {\n if (_bubbleEl)\n return _bubbleEl;\n const el = document.createElement(`ixfx-tooltip`) as TooltipElement;\n el.style.cssText = `\n position: fixed;\n z-index: 9999;\n pointer-events: none;\n opacity: 0;\n transition: opacity 0.12s ease;\n `;\n document.body.appendChild(el);\n _bubbleEl = el;\n return el;\n}\n\n/**\n * Shows/repositions an `ixfx-tooltip` bubble.\n * `mainClient` centers the bubble along the given axis (e.g. a bar's midpoint);\n * `crossClient` places it along the other axis (e.g. an offset from the cursor).\n */\nexport function showBubbleTooltip(owner: Element, text: string, mainClient: number, crossClient: number, orientation: `horizontal` | `vertical`): void {\n const el = ensureBubble();\n _bubbleOwner = owner;\n el.value = text;\n if (orientation === `horizontal`) {\n el.style.left = `${mainClient}px`;\n el.style.top = `${crossClient}px`;\n el.style.transform = `translate(-50%, -100%)`;\n } else {\n el.style.left = `${crossClient}px`;\n el.style.top = `${mainClient}px`;\n el.style.transform = `translate(0, -50%)`;\n }\n el.style.opacity = `1`;\n}\n\nexport function hideBubbleTooltip(owner: Element): void {\n if (_bubbleOwner !== owner)\n return;\n const el = ensureBubble();\n el.style.opacity = `0`;\n _bubbleOwner = null;\n}\n\n// --- Sizing helpers ---\n\n/** Stroke width proportional to the smaller dimension of the viewport. */\nexport function adaptiveStroke(width: number, height: number): number {\n return Math.max(1, Math.min(width, height) / 25);\n}\n\n/** Dot radius based on available space per data point and viewport height. */\nexport function adaptiveRadius(width: number, height: number, dataLength: number): number {\n if (dataLength === 0)\n return 3;\n const widthPerPoint = width / dataLength;\n return Math.max(1.5, Math.min(widthPerPoint * 0.45, height * 0.2, 8));\n}\n\n// --- Value scaling ---\n\n/** Normalize a value from [min, max] to [0, 1]. Returns 0.5 if range is zero. */\nexport function scaleValue(v: number, min: number, max: number): number {\n const range = max - min;\n return range === 0 ? 0.5 : (v - min) / range;\n}\n","import type { PlotSingleAxis, PlotSingleAxisPointerMoveDetail } from './single-axis.js';\nimport { css, html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { repeat } from 'lit/directives/repeat.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport { hideTooltip, showTooltipHTML } from './svg-utils.js';\n\nexport type PlotMultiAxisLayout = `overlap` | `horizontal` | `vertical` | `grid`;\n\nexport type PlotMultiAxisDataPointClickDetail = {\n readonly value: number;\n readonly index: number;\n readonly series: string;\n};\n\nexport type PlotMultiAxisDataPointClickEvent = CustomEvent<PlotMultiAxisDataPointClickDetail>;\n\nexport interface PlotMultiAxisElementEventMap {\n 'plot-datapoint-click': PlotMultiAxisDataPointClickEvent;\n}\n\nconst PLOT_PALETTE = [\n `oklch(60% 0.15 30)`,\n `oklch(60% 0.15 90)`,\n `oklch(60% 0.15 150)`,\n `oklch(60% 0.15 210)`,\n `oklch(60% 0.15 270)`,\n `oklch(60% 0.15 330)`,\n `oklch(60% 0.15 60)`,\n `oklch(60% 0.15 180)`,\n];\n\n@customElement(`ixfx-plot-multi-axis`)\n// eslint-disable-next-line ts/no-unsafe-declaration-merging\nexport class PlotMultiAxis extends LitElement {\n @property() layout: PlotMultiAxisLayout = `overlap`;\n\n @property({ attribute: `grid-min-width`, type: Number })\n gridMinWidth = 200;\n\n /** Override to customize tooltip value display. */\n valueFormat: (v: number | undefined) => string = v => v ? v.toFixed(2) : ``;\n\n #instances = new Map<string, PlotSingleAxis>();\n #seriesOrder: string[] = [];\n #seriesSet = new Set<string>();\n #pendingStyles = new Map<string, Record<string, string>>();\n\n /**\n * Adds a single data point\n * @param name Series name\n * @param value Value\n * @param witholdRedraw If _false_ (default) plot is automatically redrawn\n */\n addData(name: string, value: number, witholdRedraw = false): PlotSingleAxis {\n const el = this.#addToSeries(name, value, witholdRedraw);\n // if (witholdRedraw)\n // return el;\n // this.requestUpdate();\n // this.redraw();\n return el;\n }\n\n setData(name: string, values: number[], witholdRedraw = false): PlotSingleAxis {\n const [el, created] = this.#ensurePlot(name);\n if (!this.#seriesSet.has(name)) {\n this.#seriesSet.add(name);\n this.#seriesOrder.push(name);\n }\n el.set(values, witholdRedraw);\n // if (witholdRedraw)\n // return el;\n if (created)\n this.requestUpdate();\n return el;\n }\n\n setObjects(data: Record<string, number[]>, witholdRedraw = false): void {\n const entries = Object.entries(data);\n for (const [name, vals] of entries) {\n this.setData(name, vals, true);\n }\n if (witholdRedraw)\n return;\n // this.requestUpdate();\n this.redraw();\n }\n\n /**\n * Calls redraw() on all subplots.\n */\n redraw(): void {\n for (const el of this.#instances.values()) {\n el.redraw();\n }\n }\n\n /**\n * Adds a record of data points to the plot. Each key in the record corresponds to a series name, and its value is added as a data point to that series. If a series does not exist for a given key, it will be created.\n * @param data Data to add\n * @param witholdRedraw If _false_ (default) plot is automatically redrawn after adding the data. If _true_, plot is not redrawn automatically, and you need to call `redraw()` manually to update the plot after adding the data.\n */\n addObject(data: Record<string, number | number[]>, witholdRedraw = false): void {\n const entries = Object.entries(data);\n for (const [name, val] of entries) {\n this.#addToSeries(name, val, true);\n }\n if (witholdRedraw)\n return;\n // this.requestUpdate();\n this.redraw();\n }\n\n /**\n * Styles a series by setting CSS variables on the subplot.\n * @param name Name of series\n * @param styles Styles to apply\n */\n styleSeries(name: string, styles: Record<string, string>): void {\n const normalised: Record<string, string> = {};\n for (const [key, val] of Object.entries(styles)) {\n normalised[key.startsWith(`--`) ? key : `--${key}`] = val;\n }\n\n const el = this.#instances.get(name);\n if (!el) {\n this.#pendingStyles.set(name, normalised);\n return;\n }\n for (const [key, val] of Object.entries(normalised)) {\n el.style.setProperty(key, val);\n }\n }\n\n /**\n * Clears data from all sub-plots\n * @returns _True_ if there was data to clear\n */\n clear(): boolean {\n let cleared = false;\n for (const el of this.#instances.values()) {\n cleared = cleared || el.clear();\n }\n return cleared;\n }\n\n /**\n * Clears data from a given series\n * @param name Series name\n * @returns _True_ if series was found and had data\n */\n clearSeries(name: string): boolean {\n const el = this.#instances.get(name);\n if (el) {\n el.clear();\n return true;\n }\n return false;\n }\n\n /**\n * Returns a copy of the series names\n */\n get series(): string[] {\n return [...this.#seriesOrder];\n }\n\n #addToSeries(name: string, valueOrValues: number[] | number, withholdRedraw = false): PlotSingleAxis {\n const [el, created] = this.#ensurePlot(name);\n\n if (!this.#seriesSet.has(name)) {\n this.#seriesSet.add(name);\n this.#seriesOrder.push(name);\n }\n\n el.add(valueOrValues, withholdRedraw);\n if (created)\n this.requestUpdate();\n return el;\n }\n\n #ensurePlot(name: string): [el: PlotSingleAxis, created: boolean] {\n let el = this.#instances.get(name);\n if (el)\n return [el, false];\n\n el = document.createElement(`ixfx-plot-single-axis`) as PlotSingleAxis;\n el.tooltips = false;\n this.#instances.set(name, el);\n\n const colorIndex = this.#instances.size % PLOT_PALETTE.length;\n el.style.setProperty(`--plot-color`, PLOT_PALETTE[colorIndex]);\n\n const pending = this.#pendingStyles.get(name);\n if (pending) {\n for (const [key, val] of Object.entries(pending)) {\n el.style.setProperty(key, val);\n }\n this.#pendingStyles.delete(name);\n }\n\n el.addEventListener(`plot-datapoint-click`, (e: Event) => {\n const ce = e as CustomEvent<{ value: number; index: number }>;\n this.dispatchEvent(\n new CustomEvent<PlotMultiAxisDataPointClickDetail>(`plot-datapoint-click`, {\n detail: { ...ce.detail, series: name },\n bubbles: true,\n composed: true,\n }),\n );\n });\n\n el.addEventListener(`plot-pointer-move`, (e: Event) => {\n const ce = e as CustomEvent<PlotSingleAxisPointerMoveDetail>;\n this.#onSubPlotPointerMove(ce.detail.clientX, ce.detail.clientY, ce.detail.index);\n });\n\n el.addEventListener(`plot-pointer-leave`, () => {\n this.#onSubPlotPointerLeave();\n });\n\n return [el, true];\n }\n\n #onSubPlotPointerMove(clientX: number, clientY: number, index: number): void {\n if (index < 0) {\n hideTooltip(this);\n return;\n }\n\n const parts: string[] = [];\n for (const [name, inst] of this.#instances) {\n const val = inst.getValueAt(index);\n if (val === undefined)\n continue;\n const color = getComputedStyle(inst).getPropertyValue(`--plot-color`).trim();\n parts.push(`<span style=\"color:${color}\">${this.#escapeHTML(name)}</span> ${this.valueFormat(val)}`);\n }\n\n if (parts.length === 0) {\n hideTooltip(this);\n return;\n }\n\n showTooltipHTML(this, clientX, clientY, parts.join(`<br>`));\n }\n\n #onSubPlotPointerLeave(): void {\n hideTooltip(this);\n }\n\n #escapeHTML(s: string): string {\n return s.replace(/&/g, `&amp;`).replace(/</g, `&lt;`).replace(/>/g, `&gt;`).replace(/\"/g, `&quot;`);\n }\n\n protected override render() {\n const gridStyle = this.layout === `grid` ? `--grid-min-width: ${this.gridMinWidth}px` : ``;\n\n return html`\n <div\n id=\"container\"\n class=\"layout layout-${this.layout}\"\n part=\"container\"\n style=${gridStyle}\n >\n ${repeat(\n this.#seriesOrder,\n name => name,\n name => this.#ensurePlot(name)[0],\n )}\n </div>\n `;\n }\n\n static override styles = css`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n min-height: 40px;\n --plot-color: var(--accent);\n }\n\n #container {\n width: 100%;\n height: 100%;\n }\n\n #container.layout-overlap {\n display: grid;\n }\n #container.layout-overlap > * {\n grid-area: 1 / 1;\n background: transparent;\n }\n\n #container.layout-horizontal {\n display: flex;\n flex-direction: row;\n gap: var(--space-s, 4px);\n }\n #container.layout-horizontal > * {\n flex: 1;\n min-width: 0;\n }\n\n #container.layout-vertical {\n display: flex;\n flex-direction: column;\n gap: var(--space-s, 4px);\n }\n #container.layout-vertical > * {\n flex: 1;\n min-height: 0;\n }\n\n #container.layout-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(var(--grid-min-width, 200px), 1fr));\n gap: var(--space-s, 4px);\n }\n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-plot-multi-axis': PlotMultiAxis;\n }\n}\n\n// eslint-disable-next-line ts/no-unsafe-declaration-merging\nexport interface PlotMultiAxis {\n addEventListener: {\n <K extends keyof PlotMultiAxisElementEventMap>(\n type: K,\n listener: (this: PlotMultiAxis, event: PlotMultiAxisElementEventMap[K]) => void,\n options?: boolean | AddEventListenerOptions,\n ): void;\n (\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ): void;\n };\n}\n","/* eslint-disable ts/no-unsafe-declaration-merging */\nimport type { PropertyValues } from 'lit';\nimport { css, html, LitElement, svg } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport { PlotDataSeries } from './data.js';\nimport { hideBubbleTooltip, showBubbleTooltip } from './svg-utils.js';\n\nexport type PlotHistogramOrientation = `horizontal` | `vertical`;\n\n/**\n * - `hover`: floating `ixfx-tooltip` bubble, shown/hidden with a debounce delay.\n * - `inline`: the title overlay-text switches to the hovered bucket's value, instantly.\n * - `none`: no hover feedback.\n */\nexport type PlotHistogramValueTooltips = `hover` | `inline` | `none`;\n\nexport type PlotHistogramInteractionMode = `inspect` | `select`;\n\nexport type PlotHistogramBucketClickDetail = {\n readonly bucketIndex: number;\n readonly valueMin: number;\n readonly valueMax: number;\n readonly relativeValue: number;\n};\n\nexport type PlotHistogramBucketClickEvent = CustomEvent<PlotHistogramBucketClickDetail>;\n\n/**\n * A bar-range selection. `null` on both fields means \"no selection\".\n * - `barIndices` — inclusive bucket indices (`start` ≤ `end`).\n * - `dataValues` — the value span those buckets cover (`min` is the low edge of\n * the first bucket, `max` the high edge of the last).\n */\nexport type PlotHistogramSelectionRange = {\n readonly barIndices: { readonly start: number; readonly end: number } | null;\n readonly dataValues: { readonly min: number; readonly max: number } | null;\n};\n\nexport type PlotHistogramSelectionChangeDetail = PlotHistogramSelectionRange & {\n /**\n * `false` while the pointer is still dragging out the range; `true` once the\n * drag is released, and for `setSelection()` / `clearSelection()`.\n */\n readonly committed: boolean;\n};\n\nexport type PlotHistogramSelectionChangeEvent = CustomEvent<PlotHistogramSelectionChangeDetail>;\n\nexport interface PlotHistogramElementEventMap {\n 'plot-bucket-click': PlotHistogramBucketClickEvent;\n 'plot-selection-change': PlotHistogramSelectionChangeEvent;\n}\n\ntype BarLayout = {\n count: number;\n valueMin: number;\n valueMax: number;\n relativeValue: number;\n x: number;\n y: number;\n width: number;\n height: number;\n};\n\n@customElement(`ixfx-plot-histogram`)\nexport class PlotHistogram extends LitElement {\n @property({ attribute: `orientation` })\n orientation: PlotHistogramOrientation = `horizontal`;\n\n @property({ type: Number })\n resolution = 0.1;\n\n @property({ type: Number })\n min?: number;\n\n @property({ type: Number })\n max?: number;\n\n @property({ type: Number })\n capacity = 100;\n\n /**\n * Fallback overlay-text, shown when nothing is hovered.\n * Not reflected to the native `title` attribute, so the browser's own hover tooltip doesn't show.\n */\n @property({ attribute: false })\n title = ``;\n\n @property({ type: Boolean, reflect: true })\n paused = false;\n\n /** How hovering a bucket is communicated: a floating tooltip, the inline overlay-text, or nothing. */\n @property({ attribute: `value-tooltips` })\n valueTooltips: PlotHistogramValueTooltips = `hover`;\n\n /** Delay (ms) before the `hover` tooltip appears/disappears. Switching directly between buckets is instant. */\n @property({ type: Number, attribute: `tooltip-delay` })\n tooltipDelay = 400;\n\n /** Max rate (ms) at which an already-shown value display refreshes to match live-changing bucket data. */\n @property({ type: Number, attribute: `value-update-interval` })\n valueUpdateInterval = 500;\n\n /** Interaction mode: 'inspect' for hover tooltips, 'select' for click-drag selection. */\n @property({ attribute: `interaction-mode` })\n interactionMode: PlotHistogramInteractionMode = `inspect`;\n\n /** Override to customize the value/frequency label used by the tooltip and overlay text. */\n valueFormat: (valueMin: number, valueMax: number, frequency: number) => string\n = (valueMin, valueMax, frequency) => `${valueMin.toFixed(2)} - ${valueMax.toFixed(2)}: ${frequency}`;\n\n @state() private _width = 100;\n @state() private _height = 40;\n @state() private _hoveredIndex: number | null = null;\n @state() private _inlineOverlayText: string | null = null;\n @state() private _coloredRangeMin: number | null = null;\n @state() private _coloredRangeMax: number | null = null;\n @state() private _selectionStart: number | null = null;\n @state() private _selectionEnd: number | null = null;\n @state() private _isDragging = false;\n @state() private _selectionOverlayText: string | null = null;\n\n #series = new PlotDataSeries({ capacityLimit: 100, persistentScaling: true });\n #hasProgrammaticData = false;\n\n #parseDeclarativeData(text: string): number[] {\n if (!text)\n return [];\n const tokens = text.trim().split(/[,\\s;]+/);\n return tokens.map(t => Number.parseFloat(t)).filter(n => !Number.isNaN(n));\n }\n\n add(v: number): void {\n this.#hasProgrammaticData = true;\n this.#series.add(v);\n if (this.paused)\n return;\n this.requestUpdate();\n }\n\n set(values: number[]): void {\n this.#hasProgrammaticData = true;\n this.#series.set(values);\n if (this.paused)\n return;\n this.requestUpdate();\n }\n\n clear(): void {\n this.#series.clear();\n this.requestUpdate();\n }\n\n setColoredRange(min: number, max: number): void {\n this._coloredRangeMin = min;\n this._coloredRangeMax = max;\n this.requestUpdate();\n }\n\n clearColoredRange(): void {\n this._coloredRangeMin = null;\n this._coloredRangeMax = null;\n this.requestUpdate();\n }\n\n setSelection(startBarIndex: number, endBarIndex: number): void {\n const bars = this.#computeBars();\n const start = Math.min(startBarIndex, endBarIndex);\n const end = Math.max(startBarIndex, endBarIndex);\n const clampedStart = Math.max(0, Math.min(start, bars.length - 1));\n const clampedEnd = Math.max(0, Math.min(end, bars.length - 1));\n this._selectionStart = clampedStart;\n this._selectionEnd = clampedEnd;\n if (clampedStart <= clampedEnd) {\n const startBar = bars[clampedStart];\n const endBar = bars[clampedEnd];\n this.setColoredRange(startBar.valueMin, endBar.valueMax);\n }\n this.requestUpdate();\n this.#emitSelectionChange(true);\n }\n\n clearSelection(): void {\n const had = this._selectionStart !== null || this._selectionEnd !== null;\n this._selectionStart = null;\n this._selectionEnd = null;\n this.requestUpdate();\n if (had)\n this.#emitSelectionChange(true);\n }\n\n getSelectedRange(): PlotHistogramSelectionRange {\n if (this._selectionStart === null || this._selectionEnd === null) {\n return { barIndices: null, dataValues: null };\n }\n const bars = this.#computeBars();\n const start = Math.min(this._selectionStart, this._selectionEnd);\n const end = Math.max(this._selectionStart, this._selectionEnd);\n const clampedStart = Math.max(0, Math.min(start, bars.length - 1));\n const clampedEnd = Math.max(0, Math.min(end, bars.length - 1));\n const startBar = bars[clampedStart];\n const endBar = bars[clampedEnd];\n return {\n barIndices: { start: clampedStart, end: clampedEnd },\n dataValues: { min: startBar.valueMin, max: endBar.valueMax },\n };\n }\n\n protected override firstUpdated(_changed: PropertyValues): void {\n this._width = this.clientWidth || 100;\n this._height = this.clientHeight || 40;\n const ro = new ResizeObserver((entries) => {\n const e = entries[0];\n this._width = e.contentRect.width;\n this._height = e.contentRect.height;\n });\n ro.observe(this);\n\n if (!this.#hasProgrammaticData) {\n const data = this.#parseDeclarativeData(this.textContent ?? ``);\n if (data.length > 0) {\n this.#series.set(data);\n }\n }\n\n // `title` is a standard global HTML attribute the browser uses for its own native hover\n // tooltip. Read any declarative value into our (attribute-less) property, then strip the\n // attribute so only our overlay-text/tooltip UI reacts to hover, not the browser's.\n const declaredTitle = this.getAttribute(`title`);\n if (declaredTitle !== null) {\n this.title = declaredTitle;\n this.removeAttribute(`title`);\n }\n }\n\n protected override updated(changed: PropertyValues): void {\n if (changed.has(`capacity`)) {\n const old = [...this.#series.values];\n this.#series = new PlotDataSeries({\n capacityLimit: this.capacity,\n persistentScaling: true,\n });\n if (old.length > 0)\n this.#series.set(old);\n }\n if (changed.has(`valueTooltips`))\n this.#resetHoverState();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.#resetHoverState();\n }\n\n #readCssVar(name: string): string {\n return getComputedStyle(this).getPropertyValue(name).trim();\n }\n\n #getGapPx(): number {\n const val = this.#readCssVar(`--plot-histogram-gap`);\n if (val === ``)\n return 1;\n const parsed = Number.parseFloat(val);\n return Number.isFinite(parsed) ? Math.max(0, parsed) : 1;\n }\n\n #getBarLengthOverride(): number | null {\n const val = this.#readCssVar(`--plot-histogram-bar-length`);\n if (val === `` || val === `auto`)\n return null;\n const parsed = Number.parseFloat(val);\n return Number.isFinite(parsed) ? Math.max(0, Math.min(1, parsed)) : null;\n }\n\n #emitClick(i: number, valueMin: number, valueMax: number, relativeValue: number): void {\n this.dispatchEvent(\n new CustomEvent<PlotHistogramBucketClickDetail>(`plot-bucket-click`, {\n detail: { bucketIndex: i, valueMin, valueMax, relativeValue },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n /**\n * Fire `plot-selection-change` with the current bar-range selection (indices +\n * data span). `committed` is `false` mid-drag, `true` on release / programmatic\n * change.\n */\n #emitSelectionChange(committed: boolean): void {\n this.dispatchEvent(\n new CustomEvent<PlotHistogramSelectionChangeDetail>(`plot-selection-change`, {\n detail: { ...this.getSelectedRange(), committed },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n /** Bucket layout + counts, shared by render() and pointer hit-testing. */\n #computeGeometry() {\n const { values, range } = this.#series;\n const w = this._width;\n const h = this._height;\n const isHorizontal = this.orientation === `horizontal`;\n const padding = Math.min(4, (isHorizontal ? h : w) * 0.05);\n\n const dataMin = this.min ?? range.min;\n const dataMax = this.max ?? range.max;\n const dataSpan = dataMax - dataMin || 1;\n\n const bucketCount = Math.max(1, Math.floor(1 / this.resolution));\n\n const availableMain = (isHorizontal ? w : h) - padding * 2;\n const availableCross = (isHorizontal ? h : w) - padding * 2;\n\n const buckets: number[] = Array.from({ length: bucketCount }).fill(0) as number[];\n for (const v of values) {\n const normalized = (v - dataMin) / dataSpan;\n const index = Math.min(bucketCount - 1, Math.max(0, Math.floor(normalized * bucketCount)));\n buckets[index]++;\n }\n\n return { w, h, isHorizontal, padding, dataMin, dataMax, dataSpan, bucketCount, availableMain, availableCross, buckets };\n }\n\n /** Per-bucket rect geometry (SVG pixel coords) + value/count, shared by render() and pointer hit-testing. */\n #computeBars(): BarLayout[] {\n const { isHorizontal, padding, dataMin, dataSpan, bucketCount, availableMain, availableCross, buckets } = this.#computeGeometry();\n const bucketSize = availableMain / bucketCount;\n const gap = this.#getGapPx();\n const barLengthOverride = this.#getBarLengthOverride();\n const maxCount = Math.max(1, ...buckets);\n\n return buckets.map((count, i) => {\n const relativeValue = count / maxCount;\n const barLen = barLengthOverride !== null\n ? barLengthOverride * availableCross\n : relativeValue * availableCross;\n\n const valueMin = dataMin + (i / bucketCount) * dataSpan;\n const valueMax = dataMin + ((i + 1) / bucketCount) * dataSpan;\n\n if (isHorizontal) {\n const x = padding + i * bucketSize;\n const width = i === bucketCount - 1\n ? Math.max(0, padding + availableMain - x)\n : Math.max(0, bucketSize - gap);\n const y = padding + availableCross - barLen;\n return { count, valueMin, valueMax, relativeValue, x, y, width, height: barLen };\n } else {\n const y = padding + i * bucketSize;\n const height = i === bucketCount - 1\n ? Math.max(0, padding + availableMain - y)\n : Math.max(0, bucketSize - gap);\n return { count, valueMin, valueMax, relativeValue, x: padding, y, width: barLen, height };\n }\n });\n }\n\n #isBarInColoredRange(bar: BarLayout): boolean {\n if (this._coloredRangeMin === null || this._coloredRangeMax === null)\n return true;\n return bar.valueMin < this._coloredRangeMax && bar.valueMax > this._coloredRangeMin;\n }\n\n /** Index of the bar rect under the pointer, or -1 if none (matches click hit-testing). */\n #bucketIndexFromPointer(clientX: number, clientY: number): number {\n const rect = this.getBoundingClientRect();\n const x = clientX - rect.left;\n const y = clientY - rect.top;\n return this.#computeBars().findIndex(b => x >= b.x && x <= b.x + b.width && y >= b.y && y <= b.y + b.height);\n }\n\n /** Gets bucket index from position, clamping to valid range (0 to bucketCount-1). */\n #bucketIndexFromPosition(clientX: number, clientY: number): number {\n const { isHorizontal, padding, bucketCount, availableMain } = this.#computeGeometry();\n const rect = this.getBoundingClientRect();\n const x = clientX - rect.left;\n const y = clientY - rect.top;\n\n let relativePos: number;\n if (isHorizontal) {\n relativePos = (x - padding) / availableMain;\n } else {\n relativePos = (y - padding) / availableMain;\n }\n relativePos = Math.max(0, Math.min(1, relativePos));\n return Math.floor(relativePos * bucketCount);\n }\n\n // --- Hover state (drives both the `inline` overlay-text and the `hover` bubble tooltip) ---\n\n #tooltipIndex: number | null = null;\n #tooltipVisible = false;\n #tooltipShowTimer: number | null = null;\n #tooltipHideTimer: number | null = null;\n #tooltipPosition: { mainClient: number; crossClient: number } | null = null;\n #valueRefreshTimer: number | null = null;\n\n #clearValueRefreshTimer(): void {\n if (this.#valueRefreshTimer !== null) {\n clearTimeout(this.#valueRefreshTimer);\n this.#valueRefreshTimer = null;\n }\n }\n\n /** While a bucket stays hovered, re-invoke `tick` at most every `valueUpdateInterval` ms, so a live-streaming bucket's displayed value stays fresh without updating on every single data point. */\n #scheduleValueRefresh(tick: () => void): void {\n this.#clearValueRefreshTimer();\n this.#valueRefreshTimer = window.setTimeout(() => {\n this.#valueRefreshTimer = null;\n tick();\n this.#scheduleValueRefresh(tick);\n }, this.valueUpdateInterval);\n }\n\n #clearBubbleTooltip(): void {\n if (this.#tooltipShowTimer !== null) {\n clearTimeout(this.#tooltipShowTimer);\n this.#tooltipShowTimer = null;\n }\n if (this.#tooltipHideTimer !== null) {\n clearTimeout(this.#tooltipHideTimer);\n this.#tooltipHideTimer = null;\n }\n if (this.#tooltipVisible) {\n this.#tooltipVisible = false;\n hideBubbleTooltip(this);\n }\n this.#tooltipIndex = null;\n this.#tooltipPosition = null;\n }\n\n #resetHoverState(): void {\n this.#clearValueRefreshTimer();\n this.#clearBubbleTooltip();\n this._hoveredIndex = null;\n this._inlineOverlayText = null;\n }\n\n /** Bubble position: centred on the bar along the bucket axis, offset from the cursor on the other axis. */\n #tooltipPositionFor(bar: BarLayout, clientX: number, clientY: number): { mainClient: number; crossClient: number } {\n const hostRect = this.getBoundingClientRect();\n const offset = 14;\n if (this.orientation === `horizontal`) {\n return { mainClient: hostRect.left + bar.x + bar.width / 2, crossClient: clientY - offset };\n }\n return { mainClient: hostRect.top + bar.y + bar.height / 2, crossClient: clientX + offset };\n }\n\n #refreshBubbleText(): void {\n if (this.#tooltipIndex === null || !this.#tooltipVisible || !this.#tooltipPosition)\n return;\n const bar = this.#computeBars()[this.#tooltipIndex];\n if (!bar)\n return;\n const text = this.valueFormat(bar.valueMin, bar.valueMax, bar.count);\n showBubbleTooltip(this, text, this.#tooltipPosition.mainClient, this.#tooltipPosition.crossClient, this.orientation);\n }\n\n /**\n * Drives the floating bubble tooltip. Only reacts to the hovered bucket *changing*\n * (not every pointermove), so the tooltip doesn't track minor cursor movement.\n * Debounces the initial show and the final hide; switching between buckets while\n * already visible updates instantly. While a bucket stays hovered, its displayed\n * value is refreshed at `valueUpdateInterval`.\n */\n #updateBubbleTooltip(index: number | null, clientX: number, clientY: number): void {\n if (index === this.#tooltipIndex)\n return;\n this.#tooltipIndex = index;\n this.#clearValueRefreshTimer();\n\n if (index === null) {\n if (this.#tooltipShowTimer !== null) {\n clearTimeout(this.#tooltipShowTimer);\n this.#tooltipShowTimer = null;\n }\n if (this.#tooltipVisible) {\n this.#tooltipHideTimer = window.setTimeout(() => {\n this.#tooltipHideTimer = null;\n this.#tooltipVisible = false;\n this.#tooltipPosition = null;\n hideBubbleTooltip(this);\n }, this.tooltipDelay);\n }\n return;\n }\n\n if (this.#tooltipHideTimer !== null) {\n clearTimeout(this.#tooltipHideTimer);\n this.#tooltipHideTimer = null;\n }\n\n const bar = this.#computeBars()[index];\n if (!bar)\n return;\n const text = this.valueFormat(bar.valueMin, bar.valueMax, bar.count);\n const position = this.#tooltipPositionFor(bar, clientX, clientY);\n this.#tooltipPosition = position;\n\n if (this.#tooltipVisible) {\n showBubbleTooltip(this, text, position.mainClient, position.crossClient, this.orientation);\n this.#scheduleValueRefresh(() => this.#refreshBubbleText());\n return;\n }\n\n if (this.#tooltipShowTimer !== null)\n clearTimeout(this.#tooltipShowTimer);\n this.#tooltipShowTimer = window.setTimeout(() => {\n this.#tooltipShowTimer = null;\n this.#tooltipVisible = true;\n showBubbleTooltip(this, text, position.mainClient, position.crossClient, this.orientation);\n this.#scheduleValueRefresh(() => this.#refreshBubbleText());\n }, this.tooltipDelay);\n }\n\n #formatBarAt(index: number): string | null {\n const bar = this.#computeBars()[index];\n return bar ? this.valueFormat(bar.valueMin, bar.valueMax, bar.count) : null;\n }\n\n /**\n * Drives the `inline` overlay-text: instant on hover change, throttled while stationary\n * over a live-changing bucket. `_inlineOverlayText` is cached reactive state rather than\n * being recomputed fresh in render() on every data change, since add()/set() trigger their\n * own re-render independent of the throttle timer.\n */\n #setInlineIndex(index: number | null): void {\n if (index === this._hoveredIndex)\n return;\n this._hoveredIndex = index;\n this.#clearValueRefreshTimer();\n if (index === null) {\n this._inlineOverlayText = null;\n return;\n }\n this._inlineOverlayText = this.#formatBarAt(index);\n this.#scheduleValueRefresh(() => {\n if (this._hoveredIndex !== null)\n this._inlineOverlayText = this.#formatBarAt(this._hoveredIndex);\n });\n }\n\n #onPointerMove = (e: PointerEvent): void => {\n if (this.interactionMode === `select` && this._isDragging) {\n const index = this.#bucketIndexFromPosition(e.clientX, e.clientY);\n if (index === this._selectionEnd)\n return;\n this._selectionEnd = index;\n const start = Math.min(this._selectionStart!, this._selectionEnd!);\n const end = Math.max(this._selectionStart!, this._selectionEnd!);\n const bars = this.#computeBars();\n if (start <= end) {\n const startBar = bars[start];\n const endBar = bars[end];\n this.setColoredRange(startBar.valueMin, endBar.valueMax);\n this._selectionOverlayText = `Select: ${startBar.valueMin.toFixed(2)} – ${endBar.valueMax.toFixed(2)}`;\n }\n this.requestUpdate();\n this.#emitSelectionChange(false);\n return;\n }\n if (this.interactionMode === `select`) {\n return;\n }\n if (this.valueTooltips === `none`)\n return;\n const index = this.#bucketIndexFromPointer(e.clientX, e.clientY);\n const bucketIndex = index >= 0 ? index : null;\n\n if (this.valueTooltips === `inline`)\n this.#setInlineIndex(bucketIndex);\n else\n this.#updateBubbleTooltip(bucketIndex, e.clientX, e.clientY);\n };\n\n #onPointerLeave = (): void => {\n if (this.interactionMode === `select`) {\n if (this._isDragging) {\n this._isDragging = false;\n this._selectionOverlayText = null;\n this.requestUpdate();\n this.#emitSelectionChange(true);\n }\n return;\n }\n if (this.valueTooltips === `none`)\n return;\n if (this.valueTooltips === `inline`)\n this.#setInlineIndex(null);\n else\n this.#updateBubbleTooltip(null, 0, 0);\n };\n\n #onPointerDown = (e: PointerEvent): void => {\n if (this.interactionMode !== `select`)\n return;\n const index = this.#bucketIndexFromPosition(e.clientX, e.clientY);\n this._isDragging = true;\n this._selectionStart = index;\n this._selectionEnd = index;\n const bars = this.#computeBars();\n const startBar = bars[index];\n const endBar = bars[index];\n this.setColoredRange(startBar.valueMin, endBar.valueMax);\n this._selectionOverlayText = `Select: ${startBar.valueMin.toFixed(2)} – ${endBar.valueMax.toFixed(2)}`;\n this.requestUpdate();\n this.#emitSelectionChange(false);\n };\n\n #onPointerUp = (): void => {\n if (this.interactionMode === `select` && this._isDragging) {\n this._isDragging = false;\n this.#emitSelectionChange(true);\n }\n };\n\n override render() {\n const { w, h, padding } = this.#computeGeometry();\n const bars = this.#computeBars();\n\n const barsContent = bars.map((b, i) => {\n const inRange = this.#isBarInColoredRange(b);\n const greyStyle = inRange ? `` : `filter: grayscale(1)`;\n return svg`\n <rect class=\"bar\" x=${b.x} y=${b.y} width=${b.width} height=${b.height}\n style=\"--value: ${b.relativeValue}; ${greyStyle}\"\n @click=${() => this.#emitClick(i, b.valueMin, b.valueMax, b.relativeValue)} />\n `;\n });\n\n const textColor = `var(--plot-text, var(--surface-2-text, #fff))`;\n let overlayText: string;\n if (this.interactionMode === `select` && this._selectionOverlayText !== null) {\n overlayText = this._selectionOverlayText;\n } else if (this.valueTooltips === `inline` && this._inlineOverlayText !== null) {\n overlayText = this._inlineOverlayText;\n } else {\n overlayText = this.title;\n }\n const titleContent = overlayText\n ? svg`<text x=${padding + 2} y=${padding + Math.min(10, h * 0.6)}\n class=\"overlay-text\" fill=${textColor}\n style=\"opacity: 0.6\">${overlayText}</text>`\n : svg``;\n\n return html`\n <svg width=${w} height=${h} viewBox=\"0 0 ${w} ${h}\"\n xmlns=\"http://www.w3.org/2000/svg\"\n @pointermove=${this.#onPointerMove}\n @pointerleave=${this.#onPointerLeave}\n @pointerdown=${this.#onPointerDown}\n @pointerup=${this.#onPointerUp}>\n <rect width=${w} height=${h} fill=\"transparent\" />\n ${barsContent}\n ${titleContent}\n </svg>\n `;\n }\n\n static override styles = css`\n :host {\n display: inline-block;\n width: 100%;\n height: 100%;\n min-width: 20px;\n min-height: 20px;\n\n --plot-histogram-fill: currentColor;\n --plot-histogram-gap: 1px;\n --plot-histogram-border-radius: 0;\n --plot-histogram-bar-length: auto;\n }\n\n svg {\n display: block;\n cursor: crosshair;\n overflow: visible;\n }\n\n rect.bar {\n fill: var(--plot-histogram-fill, currentColor);\n rx: var(--plot-histogram-border-radius, 0);\n opacity: calc(0.15 + var(--value) * 0.85);\n }\n\n .overlay-text {\n font-family: var(--font-mono, ui-monospace, monospace);\n font-size: 9px;\n dominant-baseline: hanging;\n pointer-events: none;\n }\n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-plot-histogram': PlotHistogram;\n }\n}\n\nexport interface PlotHistogram {\n addEventListener: (<K extends keyof PlotHistogramElementEventMap>(\n type: K,\n listener: (this: PlotHistogram, event: PlotHistogramElementEventMap[K]) => void,\n options?: boolean | AddEventListenerOptions,\n ) => void) & ((\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ) => void);\n}\n","import type { PropertyValues, SVGTemplateResult } from 'lit';\nimport type { ColourMode, ColourResult } from './colour-map.js';\nimport { clamp } from '@ixfx/numbers';\nimport { css, html, LitElement, svg } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport { applyAgeModification, computeColour, parseColourScaleAttr, readBaseColour } from './colour-map.js';\nimport { PlotDataSeries } from './data.js';\nimport { adaptiveRadius, adaptiveStroke, hideTooltip, scaleValue, showTooltip } from './svg-utils.js';\n\nexport type SingleAxisDrawStyle\n = | `line-sharp`\n | `line-round`\n | `circles`\n | `squares`\n | `vbar`\n | `hbar`\n | `hist-bottom`\n | `hist-top`\n | `hist-middle`;\n\nexport type SingleAxisAgeStyle = `none` | `opacity` | `desaturation` | `size`;\n\ntype PlotPoint = { x: number; y: number; value: number; scaledValue: number; index: number; ageFraction: number };\n\n// --- Pure SVG fragment renderers ---\n// Lines use a single ColourResult (the last / most-recent point's colour).\n// Per-point styles use a ColourResult[] aligned with the points array.\n\nfunction buildLinePath(points: PlotPoint[]): string {\n if (points.length === 0)\n return ``;\n let d = `M ${points[0].x},${points[0].y}`;\n for (let i = 1; i < points.length; i++) {\n d += ` L ${points[i].x},${points[i].y}`;\n }\n return d;\n}\n\nfunction renderLine(points: PlotPoint[], cr: ColourResult, strokeW: number, round: boolean) {\n return svg`<path\n d=${buildLinePath(points)}\n fill=\"none\"\n stroke=${cr.fill}\n stroke-width=${strokeW}\n opacity=${cr.opacity}\n stroke-linecap=${round ? `round` : `butt`}\n stroke-linejoin=${round ? `round` : `miter`}\n />`;\n}\n\nfunction renderArea(points: PlotPoint[], cr: ColourResult, bottom: number, areaColor?: string): SVGTemplateResult {\n if (points.length < 2)\n return svg``;\n const lineD = buildLinePath(points);\n const fillColor = areaColor || cr.fill;\n const areaD = `${lineD} L ${points[points.length - 1].x},${bottom} L ${points[0].x},${bottom} Z`;\n return svg`<path d=${areaD} fill=${fillColor} opacity=${cr.opacity * 0.2} />`;\n}\n\nfunction renderCircles(points: PlotPoint[], crs: ColourResult[], radius: number, ageStyle: SingleAxisAgeStyle) {\n return points.map((p, i) => {\n const r = ageStyle === `size` ? radius * Math.max(0.2, p.ageFraction) : radius;\n return svg`<circle cx=${p.x} cy=${p.y} r=${r} fill=${crs[i].fill} opacity=${crs[i].opacity} />`;\n });\n}\n\nfunction renderSquares(points: PlotPoint[], crs: ColourResult[], size: number, ageStyle: SingleAxisAgeStyle) {\n return points.map((p, i) => {\n const s = ageStyle === `size` ? size * Math.max(0.2, p.ageFraction) : size;\n return svg`<rect\n x=${p.x - s / 2} y=${p.y - s / 2}\n width=${s} height=${s}\n fill=${crs[i].fill} opacity=${crs[i].opacity}\n />`;\n });\n}\n\nfunction renderVbars(points: PlotPoint[], crs: ColourResult[], strokeW: number, bottom: number, ageStyle: SingleAxisAgeStyle) {\n return points.map((p, i) => {\n const sw = ageStyle === `size` ? strokeW * Math.max(0.2, p.ageFraction) : strokeW;\n return svg`<line\n x1=${p.x} y1=${bottom} x2=${p.x} y2=${p.y}\n stroke=${crs[i].fill} stroke-width=${sw} opacity=${crs[i].opacity}\n />`;\n });\n}\n\nfunction renderHbars(points: PlotPoint[], crs: ColourResult[], strokeW: number, tickLen: number, ageStyle: SingleAxisAgeStyle) {\n return points.map((p, i) => {\n const tl = ageStyle === `size` ? tickLen * Math.max(0.2, p.ageFraction) : tickLen;\n return svg`<line\n x1=${p.x - tl / 2} y1=${p.y} x2=${p.x + tl / 2} y2=${p.y}\n stroke=${crs[i].fill} stroke-width=${strokeW} opacity=${crs[i].opacity}\n />`;\n });\n}\n\nfunction renderHistBottom(points: PlotPoint[], crs: ColourResult[], barW: number, bottom: number, ageStyle: SingleAxisAgeStyle) {\n return points.map((p, i) => {\n const w = ageStyle === `size` ? barW * Math.max(0.2, p.ageFraction) : barW;\n return svg`<rect\n x=${p.x - w / 2} y=${p.y}\n width=${w} height=${Math.max(1, bottom - p.y)}\n fill=${crs[i].fill} opacity=${crs[i].opacity}\n />`;\n });\n}\n\nfunction renderHistTop(points: PlotPoint[], crs: ColourResult[], barW: number, top: number, ageStyle: SingleAxisAgeStyle) {\n return points.map((p, i) => {\n const w = ageStyle === `size` ? barW * Math.max(0.2, p.ageFraction) : barW;\n return svg`<rect\n x=${p.x - w / 2} y=${top}\n width=${w} height=${Math.max(1, p.y - top)}\n fill=${crs[i].fill} opacity=${crs[i].opacity}\n />`;\n });\n}\n\nfunction renderHistMiddle(points: PlotPoint[], crs: ColourResult[], barW: number, mid: number, ageStyle: SingleAxisAgeStyle) {\n return points.map((p, i) => {\n const w = ageStyle === `size` ? barW * Math.max(0.2, p.ageFraction) : barW;\n return svg`<rect\n x=${p.x - w / 2} y=${Math.min(p.y, mid)}\n width=${w} height=${Math.max(1, Math.abs(p.y - mid))}\n fill=${crs[i].fill} opacity=${crs[i].opacity}\n />`;\n });\n}\n\n// --- Component ---\n\n/**\n * PlotSingleAxis\n *\n * Adding data:\n * - add(value: number): adds a single value to the end of the data series.\n * - set(values: number[]): replaces the entire data series at once.\n */\n@customElement(`ixfx-plot-single-axis`)\n// eslint-disable-next-line ts/no-unsafe-declaration-merging\nexport class PlotSingleAxis extends LitElement {\n @property({ attribute: `draw-style` })\n drawStyle: SingleAxisDrawStyle = `line-sharp`;\n\n @property({ attribute: `age-style` })\n ageStyle: SingleAxisAgeStyle = `none`;\n\n @property() title = ``;\n\n @property({ type: Boolean }) precise = false;\n @property({ type: Boolean }) tooltips = true;\n @property({ type: Number }) capacity = 100;\n\n @property({ type: Number }) rangeMin = Number.NaN;\n @property({ type: Number }) rangeMax = Number.NaN;\n\n @property({ type: Boolean, attribute: `persistent-scale` })\n persistentScale = true;\n\n @property({ type: Boolean, reflect: true }) paused = false;\n @property({ type: Boolean, attribute: `click-pauses` }) clickPauses = false;\n\n @property({ type: Boolean, attribute: `shaded` })\n shaded = false;\n\n @property({ attribute: `area-color` })\n areaColor = ``;\n\n // --- Colour mapping ---\n @property({ attribute: `color-mode` }) colorMode: ColourMode = `fixed`;\n @property({ attribute: `color-easing` }) colorEasing = ``;\n @property({ attribute: `color-scale` }) colorScale = ``;\n /** Custom value-mapping function (0..1 → 0..1). Ignored when color-easing is set. */\n colorValueMap: ((v: number) => number) | null = null;\n\n @state() private _width = 100;\n @state() private _height = 40;\n\n #series = new PlotDataSeries();\n #hasProgrammaticData = false;\n #lastClientX: number | null = null;\n #lastClientY: number | null = null;\n\n #parseDeclarativeData(text: string): number[] {\n if (!text)\n return [];\n const tokens = text.trim().split(/[,\\s;]+/);\n return tokens\n .map(t => Number.parseFloat(t))\n .filter(n => !Number.isNaN(n));\n }\n\n /** Override to customize tooltip label. */\n valueFormat: (v: number | undefined) => string = v => v ? v.toFixed(2) : ``;\n\n /**\n * Adds a value to the data series.\n *\n * Pass `withholdRedraw = true` to prevent automatic redraw after adding the value. In this case, call `redraw()` manually after adding all values to update the plot.\n *\n * Use {@link set} to replace the entire data series at once.\n * @param valueOrValues Single value, or several values\n * @param withholdRedraw If _false_ (default) plot is automatically redrawn\n */\n add(valueOrValues: number | number[], withholdRedraw = false): void {\n this.#hasProgrammaticData = true;\n this.#series.add(valueOrValues);\n if (this.paused)\n return;\n if (withholdRedraw)\n return;\n this.redraw();\n }\n\n /**\n * Redraws the plot.\n * Normally not needed, unless add() is called with withholdRedraw = true, or styleSeries() is used to update series styles.\n */\n redraw() {\n this.requestUpdate();\n this.#updateTooltipAtLastPos();\n }\n\n /**\n * Sets the entire data for a series at once, replacing contents.\n *\n * Use add() to add values one by one.\n *\n * Pass `withholdRedraw = true` to prevent automatic redraw after setting the values. In this case, call `redraw()` manually after setting the values to update the plot.\n * @param values Values\n * @param withholdRedraw If _false_ (default) plot is automatically redrawn\n */\n set(values: number[], withholdRedraw = false): void {\n this.#hasProgrammaticData = true;\n this.#series.set(values);\n if (this.paused)\n return;\n if (withholdRedraw)\n return;\n this.redraw();\n }\n\n /**\n * Clears all data and redraws\n */\n clear(): boolean {\n const result = this.#series.clear();\n this.requestUpdate();\n return result;\n }\n\n protected override firstUpdated(_changed: PropertyValues): void {\n this._width = this.clientWidth || 100;\n this._height = this.clientHeight || 40;\n const ro = new ResizeObserver((entries) => {\n const e = entries[0];\n this._width = e.contentRect.width;\n this._height = e.contentRect.height;\n });\n ro.observe(this);\n\n if (!this.#hasProgrammaticData) {\n const data = this.#parseDeclarativeData(this.textContent ?? ``);\n if (data.length > 0) {\n this.#series.set(data);\n }\n }\n }\n\n protected override updated(changed: PropertyValues): void {\n if (changed.has(`capacity`) || changed.has(`persistentScale`) || changed.has(`rangeMin`) || changed.has(`rangeMax`)) {\n const old = [...this.#series.values];\n const fixedRange = (!Number.isNaN(this.rangeMin) && !Number.isNaN(this.rangeMax)) ? { min: this.rangeMin, max: this.rangeMax } : null;\n this.#series = new PlotDataSeries({\n capacityLimit: this.capacity,\n persistentScaling: this.persistentScale,\n fixedRange,\n });\n if (old.length > 0)\n this.#series.set(old);\n }\n }\n\n #getIndexFromX(clientX: number, rect: DOMRect): number {\n const n = this.#series.values.length;\n if (n === 0)\n return -1;\n const x = clientX - rect.left;\n if (x < 0 || x > rect.width)\n return -1;\n const padding = rect.height < 20 ? 0 : Math.min(4, rect.height * 0.05);\n const plotW = rect.width - padding * 2;\n const index = Math.floor((x - padding) / (plotW / n));\n return index >= 0 && index < n ? index : -1;\n }\n\n #updateTooltip(clientX: number, clientY: number): void {\n if (!this.tooltips)\n return;\n const rect = this.getBoundingClientRect();\n const index = this.#getIndexFromX(clientX, rect);\n if (index < 0) {\n hideTooltip(this); return;\n }\n showTooltip(this, clientX, clientY, this.valueFormat(this.#series.values[index]));\n }\n\n #updateTooltipAtLastPos(): void {\n if (this.#lastClientX === null || this.#lastClientY === null)\n return;\n this.#updateTooltip(this.#lastClientX, this.#lastClientY);\n }\n\n #onPointerMove = (e: PointerEvent): void => {\n this.#lastClientX = e.clientX;\n this.#lastClientY = e.clientY;\n this.#updateTooltip(e.clientX, e.clientY);\n const index = this.#getIndexFromX(e.clientX, this.getBoundingClientRect());\n this.dispatchEvent(new CustomEvent(`plot-pointer-move`, {\n detail: { clientX: e.clientX, clientY: e.clientY, index },\n bubbles: true,\n composed: true,\n }));\n };\n\n #onPointerLeave = (): void => {\n this.#lastClientX = null;\n this.#lastClientY = null;\n hideTooltip(this);\n this.dispatchEvent(new CustomEvent(`plot-pointer-leave`, {\n bubbles: true,\n composed: true,\n }));\n };\n\n #onClick = (e: MouseEvent): void => {\n if (this.clickPauses)\n this.paused = !this.paused;\n const index = this.#getIndexFromX(e.clientX, this.getBoundingClientRect());\n if (index < 0)\n return;\n this.dispatchEvent(new CustomEvent(`plot-datapoint-click`, {\n detail: { value: this.#series.values[index], index },\n bubbles: true,\n composed: true,\n }));\n };\n\n #computePoints(values: number[], min: number, max: number, padding: number, plotW: number, plotH: number): PlotPoint[] {\n const n = values.length;\n const widthPerPoint = n > 0 ? plotW / n : plotW;\n const scaleX = (i: number) => padding + (i + 0.5) * widthPerPoint;\n return values.map((value, index) => {\n const sv = clamp(scaleValue(value, min, max));\n const ageFraction = n > 1 ? index / (n - 1) : 1;\n return { x: scaleX(index), y: padding + (1 - sv) * plotH, value, scaledValue: sv, index, ageFraction };\n });\n }\n\n get series() {\n return this.#series;\n }\n\n /**\n * Get all values in the data series as a readonly array.\n */\n get values(): readonly number[] {\n return this.#series.values;\n }\n\n /**\n * Get length of data series\n */\n get dataLength(): number {\n return this.#series.values.length;\n }\n\n /**\n * Get value at specific index of data series\n * @param index\n */\n getValueAt(index: number): number | undefined {\n return this.#series.values[index];\n }\n\n /**\n * Get value index based on client X position\n * @param clientX\n */\n getIndexFromClientX(clientX: number): number {\n return this.#getIndexFromX(clientX, this.getBoundingClientRect());\n }\n\n #renderByStyle(\n points: PlotPoint[],\n crs: ColourResult[],\n strokeW: number,\n radius: number,\n barW: number,\n bottom: number,\n top: number,\n mid: number,\n ): SVGTemplateResult[] {\n const lineCr = crs.at(-1) ?? { fill: `currentColor`, opacity: 1 };\n const isLine = this.drawStyle === `line-sharp` || this.drawStyle === `line-round`;\n const needsArea = isLine && this.shaded;\n const areaColor = this.areaColor || undefined;\n\n if (needsArea) {\n const area = renderArea(points, lineCr, bottom, areaColor);\n const line = this.drawStyle === `line-sharp`\n ? renderLine(points, lineCr, strokeW, false)\n : renderLine(points, lineCr, strokeW, true);\n return [area, line];\n }\n\n switch (this.drawStyle) {\n case `line-sharp`: return [renderLine(points, lineCr, strokeW, false)];\n case `line-round`: return [renderLine(points, lineCr, strokeW, true)];\n case `circles`: return renderCircles(points, crs, radius, this.ageStyle);\n case `squares`: return renderSquares(points, crs, radius * 2, this.ageStyle);\n case `vbar`: return renderVbars(points, crs, strokeW, bottom, this.ageStyle);\n case `hbar`: return renderHbars(points, crs, strokeW, barW, this.ageStyle);\n case `hist-bottom`: return renderHistBottom(points, crs, barW, bottom, this.ageStyle);\n case `hist-top`: return renderHistTop(points, crs, barW, top, this.ageStyle);\n case `hist-middle`: return renderHistMiddle(points, crs, barW, mid, this.ageStyle);\n default: return [];\n }\n }\n\n override render() {\n const { values, range } = this.#series;\n const w = this._width;\n const h = this._height;\n const padding = h < 20 ? 0 : Math.min(4, h * 0.05);\n const plotW = Math.max(1, w - padding * 2);\n const plotH = Math.max(1, h - padding * 2);\n const bottom = padding + plotH;\n const top = padding;\n const mid = padding + plotH / 2;\n\n const strokeW = adaptiveStroke(w, h);\n const radius = adaptiveRadius(w, h, values.length);\n const barW = values.length > 0\n ? Math.max(1, (plotW / values.length) * 0.85)\n : plotW;\n\n const textColor = `var(--plot-text, var(--surface-2-text, #fff))`;\n\n const points = values.length > 0\n ? this.#computePoints(values, range.min, range.max, padding, plotW, plotH)\n : [];\n\n // Colour mapping\n const baseColour = points.length > 0 ? readBaseColour(this) : ``;\n const colourConfig = {\n mode: this.colorMode,\n palette: parseColourScaleAttr(this.colorScale),\n easingName: this.colorEasing,\n valueMap: this.colorValueMap,\n };\n const isDiscrete = this.drawStyle !== `line-sharp` && this.drawStyle !== `line-round`;\n const crs: ColourResult[] = points.map((p) => {\n const base = computeColour(p.scaledValue, baseColour, colourConfig);\n return isDiscrete ? applyAgeModification(base, p.ageFraction, this.ageStyle) : base;\n });\n\n const dataContent = points.length > 0\n ? this.#renderByStyle(points, crs, strokeW, radius, barW, bottom, top, mid)\n : [];\n\n const titleContent = this.title\n ? svg`<text\n x=${padding + 2} y=${top + Math.min(10, h * 0.6)}\n class=\"overlay-text\"\n fill=${textColor}\n style=\"opacity: 0.6\"\n >${this.title}</text>`\n : svg``;\n\n const latestValue = values.length > 0 ? values.at(-1) : null;\n const preciseContent = this.precise && latestValue !== null\n ? svg`<text\n x=${w - padding - 2} y=${top + Math.min(10, h * 0.6)}\n class=\"overlay-text\"\n text-anchor=\"end\"\n fill=${textColor}\n style=\"opacity: 0.8\"\n >${this.valueFormat(latestValue)}</text>`\n : svg``;\n\n return html`\n <svg\n width=${w} height=${h}\n viewBox=\"0 0 ${w} ${h}\"\n xmlns=\"http://www.w3.org/2000/svg\"\n @pointermove=${this.#onPointerMove}\n @pointerleave=${this.#onPointerLeave}\n @click=${this.#onClick}\n >\n <rect width=${w} height=${h} fill=\"transparent\" />\n ${dataContent.map(c => c)}\n ${titleContent}\n ${preciseContent}\n </svg>\n `;\n }\n\n static override styles = css`\n :host {\n display: inline-block;\n width: 100%;\n height: 100%;\n min-width: 20px;\n min-height: 4px;\n }\n\n svg {\n display: block;\n cursor: crosshair;\n overflow: visible;\n }\n\n .overlay-text {\n font-family: var(--font-mono, ui-monospace, monospace);\n font-size: 9px;\n dominant-baseline: hanging;\n pointer-events: none;\n }\n `;\n}\n\nexport type PlotSingleAxisPointerMoveDetail = {\n readonly clientX: number;\n readonly clientY: number;\n readonly index: number;\n};\n\nexport type PlotSingleAxisPointerMoveEvent = CustomEvent<PlotSingleAxisPointerMoveDetail>;\n\nexport interface PlotSingleAxisElementEventMap {\n 'plot-pointer-move': PlotSingleAxisPointerMoveEvent;\n 'plot-pointer-leave': Event;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-plot-single-axis': PlotSingleAxis;\n }\n}\n\n// eslint-disable-next-line ts/no-unsafe-declaration-merging\nexport interface PlotSingleAxis {\n addEventListener: {\n <K extends keyof PlotSingleAxisElementEventMap>(\n type: K,\n listener: (this: PlotSingleAxis, event: PlotSingleAxisElementEventMap[K]) => void,\n options?: boolean | AddEventListenerOptions,\n ): void;\n (\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ): void;\n };\n}\n","import type { PropertyValues } from 'lit';\nimport type { ColourMode, ColourResult } from './colour-map.js';\nimport { css, html, LitElement, svg } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport { applyAgeModification, computeColour, parseColourScaleAttr, readBaseColour } from './colour-map.js';\nimport { PlotDataSeries } from './data.js';\nimport { adaptiveRadius, hideTooltip, scaleValue, showTooltip } from './svg-utils.js';\n\nexport type XyDrawStyle = `circles` | `squares`;\nexport type XyAgeStyle = `none` | `opacity` | `desaturation` | `size`;\n\ntype XyPoint = { x: number; y: number; xVal: number; yVal: number; index: number; ageFraction: number };\n\n// --- Component ---\n\n@customElement(`ixfx-plot-xy-axis`)\nexport class PlotXyAxis extends LitElement {\n @property({ attribute: `draw-style` })\n drawStyle: XyDrawStyle = `circles`;\n\n @property({ attribute: `age-style` })\n ageStyle: XyAgeStyle = `none`;\n\n @property() title = ``;\n @property({ type: Boolean }) precise = false;\n @property({ type: Boolean }) tooltips = true;\n @property({ type: Number }) capacity = 100;\n\n @property({ type: Boolean, attribute: `persistent-scale` })\n persistentScale = true;\n\n @property({ type: Boolean, reflect: true }) paused = false;\n @property({ type: Boolean, attribute: `click-pauses` }) clickPauses = false;\n\n // --- Colour mapping ---\n @property({ attribute: `color-mode` }) colorMode: ColourMode = `fixed`;\n @property({ attribute: `color-easing` }) colorEasing = ``;\n @property({ attribute: `color-scale` }) colorScale = ``;\n /**\n * Custom value-mapping fn (0..1 → 0..1). For xy-axis the input is the point's ageFraction\n * (0 = oldest, 1 = newest). Ignored when color-easing is set.\n */\n colorValueMap: ((v: number) => number) | null = null;\n\n @state() private _width = 100;\n @state() private _height = 100;\n\n #xSeries = new PlotDataSeries({ capacityLimit: 100, persistentScaling: true });\n #ySeries = new PlotDataSeries({ capacityLimit: 100, persistentScaling: true });\n\n /** Override to customize tooltip label. */\n valueFormat: (x: number, y: number) => string = (x, y) => `${x.toFixed(2)}, ${y.toFixed(2)}`;\n\n add(x: number, y: number): void {\n this.#xSeries.add(x);\n this.#ySeries.add(y);\n if (this.paused)\n return;\n this.requestUpdate();\n this.#updateTooltipAtLastPos();\n }\n\n setXY(xs: number[], ys: number[]): void {\n this.#xSeries.set(xs);\n this.#ySeries.set(ys);\n if (this.paused)\n return;\n this.requestUpdate();\n this.#updateTooltipAtLastPos();\n }\n\n clear(): void {\n this.#xSeries.clear();\n this.#ySeries.clear();\n this.requestUpdate();\n }\n\n protected override firstUpdated(_changed: PropertyValues): void {\n this._width = this.clientWidth || 100;\n this._height = this.clientHeight || 100;\n const ro = new ResizeObserver((entries) => {\n const e = entries[0];\n this._width = e.contentRect.width;\n this._height = e.contentRect.height;\n });\n ro.observe(this);\n }\n\n protected override updated(changed: PropertyValues): void {\n if (changed.has(`capacity`) || changed.has(`persistentScale`)) {\n const opts = { capacityLimit: this.capacity, persistentScaling: this.persistentScale };\n const oldX = [...this.#xSeries.values];\n const oldY = [...this.#ySeries.values];\n this.#xSeries = new PlotDataSeries(opts);\n this.#ySeries = new PlotDataSeries(opts);\n if (oldX.length > 0) {\n this.#xSeries.set(oldX); this.#ySeries.set(oldY);\n }\n }\n }\n\n #computePoints(padding: number, plotW: number, plotH: number): XyPoint[] {\n const xs = this.#xSeries.values;\n const ys = this.#ySeries.values;\n const n = Math.min(xs.length, ys.length);\n if (n === 0)\n return [];\n\n const { min: xMin, max: xMax } = this.#xSeries.range;\n const { min: yMin, max: yMax } = this.#ySeries.range;\n\n return Array.from({ length: n }, (_, i) => ({\n x: padding + scaleValue(xs[i], xMin, xMax) * plotW,\n y: padding + (1 - scaleValue(ys[i], yMin, yMax)) * plotH,\n xVal: xs[i],\n yVal: ys[i],\n index: i,\n ageFraction: n > 1 ? i / (n - 1) : 1,\n }));\n }\n\n /** Compute the final ColourResult for each xy point: base colour → age modification. */\n #computeColours(points: XyPoint[], baseColour: string): ColourResult[] {\n const config = {\n mode: this.colorMode,\n palette: parseColourScaleAttr(this.colorScale),\n easingName: this.colorEasing,\n valueMap: this.colorValueMap,\n };\n return points.map((p) => {\n const base = computeColour(p.ageFraction, baseColour, config);\n return applyAgeModification(base, p.ageFraction, this.ageStyle);\n });\n }\n\n #findNearestPoint(clientX: number, clientY: number, points: XyPoint[], rect: DOMRect): XyPoint | null {\n const x = clientX - rect.left;\n const y = clientY - rect.top;\n let best: XyPoint | null = null;\n let bestDist = Infinity;\n for (const p of points) {\n const dx = p.x - x;\n const dy = p.y - y;\n const d = dx * dx + dy * dy;\n if (d < bestDist) {\n bestDist = d; best = p;\n }\n }\n return best && Math.sqrt(bestDist) < 30 ? best : null;\n }\n\n #lastPoints: XyPoint[] = [];\n #lastClientX: number | null = null;\n #lastClientY: number | null = null;\n\n #updateTooltip(clientX: number, clientY: number): void {\n if (!this.tooltips)\n return;\n const rect = this.getBoundingClientRect();\n const nearest = this.#findNearestPoint(clientX, clientY, this.#lastPoints, rect);\n if (!nearest) {\n hideTooltip(this); return;\n }\n showTooltip(this, clientX, clientY, this.valueFormat(nearest.xVal, nearest.yVal));\n }\n\n #updateTooltipAtLastPos(): void {\n if (this.#lastClientX === null || this.#lastClientY === null)\n return;\n this.#updateTooltip(this.#lastClientX, this.#lastClientY);\n }\n\n #onPointerMove = (e: PointerEvent): void => {\n this.#lastClientX = e.clientX;\n this.#lastClientY = e.clientY;\n this.#updateTooltip(e.clientX, e.clientY);\n };\n\n #onPointerLeave = (): void => {\n this.#lastClientX = null;\n this.#lastClientY = null;\n hideTooltip(this);\n };\n\n #onClick = (e: MouseEvent): void => {\n if (this.clickPauses)\n this.paused = !this.paused;\n const rect = (e.currentTarget as SVGElement).getBoundingClientRect();\n const nearest = this.#findNearestPoint(e.clientX, e.clientY, this.#lastPoints, rect);\n if (!nearest)\n return;\n this.dispatchEvent(new CustomEvent(`plot-datapoint-click`, {\n detail: { x: nearest.xVal, y: nearest.yVal, index: nearest.index },\n bubbles: true,\n composed: true,\n }));\n };\n\n override render() {\n const w = this._width;\n const h = this._height;\n const padding = Math.min(6, Math.min(w, h) * 0.06);\n const plotW = Math.max(1, w - padding * 2);\n const plotH = Math.max(1, h - padding * 2);\n\n const points = this.#computePoints(padding, plotW, plotH);\n this.#lastPoints = points;\n\n const baseColour = points.length > 0 ? readBaseColour(this) : ``;\n const colours = this.#computeColours(points, baseColour);\n\n const radius = adaptiveRadius(w, h, points.length);\n const textColor = `var(--plot-text, var(--surface-2-text, #fff))`;\n\n const dataContent = points.map((p, i) => {\n const cr = colours[i];\n const sizeFactor = this.ageStyle === `size` ? Math.max(0.2, p.ageFraction) : 1;\n if (this.drawStyle === `circles`) {\n const r = radius * sizeFactor;\n return svg`<circle cx=${p.x} cy=${p.y} r=${r} fill=${cr.fill} opacity=${cr.opacity} />`;\n }\n const s = radius * 2 * sizeFactor;\n return svg`<rect x=${p.x - s / 2} y=${p.y - s / 2} width=${s} height=${s} fill=${cr.fill} opacity=${cr.opacity} />`;\n });\n\n const titleContent = this.title\n ? svg`<text\n x=${padding + 2} y=${padding + 2}\n class=\"overlay-text\"\n fill=${textColor}\n style=\"opacity: 0.6\"\n >${this.title}</text>`\n : svg``;\n\n const n = Math.min(this.#xSeries.values.length, this.#ySeries.values.length);\n const latestX = n > 0 ? this.#xSeries.values[n - 1] : null;\n const latestY = n > 0 ? this.#ySeries.values[n - 1] : null;\n const preciseContent = this.precise && latestX !== null && latestY !== null\n ? svg`<text\n x=${w - padding - 2} y=${padding + 2}\n class=\"overlay-text\"\n text-anchor=\"end\"\n fill=${textColor}\n style=\"opacity: 0.8\"\n >${this.valueFormat(latestX, latestY)}</text>`\n : svg``;\n\n return html`\n <svg\n width=${w} height=${h}\n viewBox=\"0 0 ${w} ${h}\"\n xmlns=\"http://www.w3.org/2000/svg\"\n @pointermove=${this.#onPointerMove}\n @pointerleave=${this.#onPointerLeave}\n @click=${this.#onClick}\n >\n <rect width=${w} height=${h} fill=\"transparent\" />\n ${dataContent}\n ${titleContent}\n ${preciseContent}\n </svg>\n `;\n }\n\n static override styles = css`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n min-width: 40px;\n min-height: 40px;\n }\n\n svg {\n display: block;\n cursor: crosshair;\n }\n\n .overlay-text {\n font-family: var(--font-mono, ui-monospace, monospace);\n font-size: 9px;\n dominant-baseline: hanging;\n pointer-events: none;\n }\n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-plot-xy-axis': PlotXyAxis;\n }\n}\n"],"mappings":"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"}