@ixfx/components 0.4.2 → 0.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundle/index.d.ts +435 -1193
- package/bundle/index.d.ts.map +1 -1
- package/bundle/index.js +7765 -20670
- package/bundle/index.js.map +1 -1
- package/dist/ac-text.d.ts +12 -7
- package/dist/ac-text.d.ts.map +1 -1
- package/dist/ac-text.js +2 -3
- package/dist/ac-text.js.map +1 -1
- package/dist/{button-C3fLMKUv.js → button-DxYee1ZH.js} +2 -2
- package/dist/{button-C3fLMKUv.js.map → button-DxYee1ZH.js.map} +1 -1
- package/dist/button.d.ts +1 -2
- package/dist/button.d.ts.map +1 -1
- package/dist/button.js +1 -2
- package/dist/checkbox.d.ts +0 -1
- package/dist/checkbox.d.ts.map +1 -1
- package/dist/checkbox.js +1 -1
- package/dist/checkbox.js.map +1 -1
- package/dist/{colour-picker-0sgAha1T.js → colour-picker-BacNRabo.js} +14 -16
- package/dist/colour-picker-BacNRabo.js.map +1 -0
- package/dist/colour-picker.d.ts +1 -1
- package/dist/colour-picker.js +1 -1
- package/dist/crumbs.d.ts +5 -2
- package/dist/crumbs.d.ts.map +1 -1
- package/dist/crumbs.js +45 -20
- package/dist/crumbs.js.map +1 -1
- package/dist/data-display.d.ts +1 -2
- package/dist/data-display.d.ts.map +1 -1
- package/dist/data-display.js +25 -23
- package/dist/data-display.js.map +1 -1
- package/dist/{data-provider-DgI909FP.js → data-provider-35TyWclX.js} +2 -2
- package/dist/data-provider-35TyWclX.js.map +1 -0
- package/dist/{decorate-DdjvVHS-.js → decorate-VRK8rslU.js} +2 -2
- package/dist/{decorate-DdjvVHS-.js.map → decorate-VRK8rslU.js.map} +1 -1
- package/dist/editable-label.d.ts +1 -2
- package/dist/editable-label.d.ts.map +1 -1
- package/dist/editable-label.js +1 -1
- package/dist/editable-label.js.map +1 -1
- package/dist/{hex-editor-WZrjRtvL.js → hex-editor-Bk6rxhfg.js} +9 -11
- package/dist/hex-editor-Bk6rxhfg.js.map +1 -0
- package/dist/{hex-editor-CMIxtNgT.d.ts → hex-editor-Caq8vNQk.d.ts} +2 -3
- package/dist/hex-editor-Caq8vNQk.d.ts.map +1 -0
- package/dist/hex.d.ts +1 -1
- package/dist/hex.js +1 -1
- package/dist/highlight-B-eQrhhb.js.map +1 -1
- package/dist/{icon-Ndo40kNO.js → icon-B22XVlCt.js} +6 -4
- package/dist/{icon-Ndo40kNO.js.map → icon-B22XVlCt.js.map} +1 -1
- package/dist/{icon-epZd-JIO.d.ts → icon-DpA9x2Ve.d.ts} +3 -4
- package/dist/icon-DpA9x2Ve.d.ts.map +1 -0
- package/dist/icons.d.ts +2 -2
- package/dist/icons.js +1 -1
- package/dist/{incr-search-CeERfijK.js → incr-search-2pz21xtR.js} +9 -6
- package/dist/incr-search-2pz21xtR.js.map +1 -0
- package/dist/incr-search.d.ts +1 -1
- package/dist/incr-search.js +1 -1
- package/dist/{index-CowKi2mo.d.ts → index-BeuCXtiO.d.ts} +3 -4
- package/dist/index-BeuCXtiO.d.ts.map +1 -0
- package/dist/{index-D87kRcEs.d.ts → index-BtGFYfaK.d.ts} +2 -1
- package/dist/index-BtGFYfaK.d.ts.map +1 -0
- package/dist/{index-JuEVfmr-.d.ts → index-CoqtMSd9.d.ts} +6 -4
- package/dist/index-CoqtMSd9.d.ts.map +1 -0
- package/dist/{index-9fGVAg1d.d.ts → index-Cxwxtj6g.d.ts} +3 -3
- package/dist/index-Cxwxtj6g.d.ts.map +1 -0
- package/dist/index-D_ftz_IT.d.ts +184 -0
- package/dist/index-D_ftz_IT.d.ts.map +1 -0
- package/dist/{index-_RTQSKHi.d.ts → index-DfEkTGvT.d.ts} +11 -11
- package/dist/index-DfEkTGvT.d.ts.map +1 -0
- package/dist/index.d.ts +45 -30
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +304 -3075
- package/dist/index.js.map +1 -1
- package/dist/keyboard-B5xD7Fz-.js +36 -0
- package/dist/keyboard-B5xD7Fz-.js.map +1 -0
- package/dist/{labelled-input-base-Cz6qE6Dk.d.ts → labelled-input-base-DiTme1JO.d.ts} +2 -3
- package/dist/labelled-input-base-DiTme1JO.d.ts.map +1 -0
- package/dist/{labelled-input-base-9K_w3oLj.js → labelled-input-base-hoKGwyKT.js} +2 -2
- package/dist/{labelled-input-base-9K_w3oLj.js.map → labelled-input-base-hoKGwyKT.js.map} +1 -1
- package/dist/labelled-radial-input.d.ts +6 -5
- package/dist/labelled-radial-input.d.ts.map +1 -1
- package/dist/labelled-radial-input.js +7 -3
- package/dist/labelled-radial-input.js.map +1 -1
- package/dist/labelled-range-input.d.ts +1 -1
- package/dist/labelled-range-input.js +27 -3
- package/dist/labelled-range-input.js.map +1 -1
- package/dist/led.d.ts +1 -2
- package/dist/led.d.ts.map +1 -1
- package/dist/led.js +1 -1
- package/dist/led.js.map +1 -1
- package/dist/{menu-vjoiHZ13.js → menu-g6yd7ddN.js} +8 -9
- package/dist/menu-g6yd7ddN.js.map +1 -0
- package/dist/{menu-item-COx-Azgj.d.ts → menu-item-DSyf9f_L.d.ts} +4 -4
- package/dist/menu-item-DSyf9f_L.d.ts.map +1 -0
- package/dist/{menu-item-BrIuORYD.js → menu-item-NUKwJ4s5.js} +3 -4
- package/dist/{menu-item-BrIuORYD.js.map → menu-item-NUKwJ4s5.js.map} +1 -1
- package/dist/menu.d.ts +2 -2
- package/dist/menu.js +2 -2
- package/dist/miller.d.ts +8 -5
- package/dist/miller.d.ts.map +1 -1
- package/dist/miller.js +22 -24
- package/dist/miller.js.map +1 -1
- package/dist/narrowed-text.d.ts +7 -3
- package/dist/narrowed-text.d.ts.map +1 -1
- package/dist/narrowed-text.js +73 -47
- package/dist/narrowed-text.js.map +1 -1
- package/dist/panel.d.ts +1 -1
- package/dist/panel.d.ts.map +1 -1
- package/dist/panel.js +2 -2
- package/dist/panel.js.map +1 -1
- package/dist/plots.d.ts +2 -2
- package/dist/plots.js +1 -1
- package/dist/polar-pad.d.ts +15 -3
- package/dist/polar-pad.d.ts.map +1 -1
- package/dist/polar-pad.js +64 -11
- package/dist/polar-pad.js.map +1 -1
- package/dist/{radial-input-CpQPs1Mp.d.ts → radial-input-DXMN55Nz.d.ts} +6 -4
- package/dist/radial-input-DXMN55Nz.d.ts.map +1 -0
- package/dist/{radial-input-DZ7eQCcM.js → radial-input-DxCrt_NE.js} +41 -19
- package/dist/radial-input-DxCrt_NE.js.map +1 -0
- package/dist/radial-input.d.ts +1 -1
- package/dist/radial-input.js +1 -1
- package/dist/range-input.d.ts +15 -4
- package/dist/range-input.d.ts.map +1 -1
- package/dist/range-input.js +23 -2
- package/dist/range-input.js.map +1 -1
- package/dist/range.d.ts +15 -4
- package/dist/range.d.ts.map +1 -1
- package/dist/range.js +23 -2
- package/dist/range.js.map +1 -1
- package/dist/selecthorizontal.d.ts +1 -2
- package/dist/selecthorizontal.d.ts.map +1 -1
- package/dist/selecthorizontal.js +1 -1
- package/dist/selecthorizontal.js.map +1 -1
- package/dist/slider-input-DFpG23bS.js +1592 -0
- package/dist/slider-input-DFpG23bS.js.map +1 -0
- package/dist/slider-input-XppH3vcy.d.ts +160 -0
- package/dist/slider-input-XppH3vcy.d.ts.map +1 -0
- package/dist/slider-input.d.ts +2 -0
- package/dist/slider-input.js +2 -0
- package/dist/snap-container.d.ts +1 -2
- package/dist/snap-container.d.ts.map +1 -1
- package/dist/snap-container.js +6 -5
- package/dist/snap-container.js.map +1 -1
- package/dist/split-layout.d.ts +1 -2
- package/dist/split-layout.d.ts.map +1 -1
- package/dist/split-layout.js +6 -4
- package/dist/split-layout.js.map +1 -1
- package/dist/swipe.d.ts +12 -2
- package/dist/swipe.d.ts.map +1 -1
- package/dist/swipe.js +22 -3
- package/dist/swipe.js.map +1 -1
- package/dist/{tab-list-DLzb-m-I.d.ts → tab-list-BohmbvqF.d.ts} +14 -5
- package/dist/tab-list-BohmbvqF.d.ts.map +1 -0
- package/dist/tab-list-DzknpdSo.js +592 -0
- package/dist/tab-list-DzknpdSo.js.map +1 -0
- package/dist/tabs.d.ts +2 -2
- package/dist/tabs.js +1 -208
- package/dist/{tickled-controller-BjYCzGrU.d.ts → tickled-controller-BF2Ea0DE.d.ts} +2 -31
- package/dist/tickled-controller-BF2Ea0DE.d.ts.map +1 -0
- package/dist/tickled-styles-fNDdqf6l.js.map +1 -1
- package/dist/{timeline-2OFtN4Ta.js → timeline-B2fgDL4U.js} +37 -1438
- package/dist/timeline-B2fgDL4U.js.map +1 -0
- package/dist/timeline.d.ts +1 -1
- package/dist/timeline.js +1 -1
- package/dist/{tooltip-RGVIwHrZ.d.ts → tooltip-BlvBUQxx.d.ts} +3 -3
- package/dist/tooltip-BlvBUQxx.d.ts.map +1 -0
- package/dist/{tree-D84RUgFC.js → tree-BnvzhsAw.js} +8 -9
- package/dist/tree-BnvzhsAw.js.map +1 -0
- package/dist/{tree-component-BaCSPWg1.d.ts → tree-component-DCmmKZ4j.d.ts} +8 -124
- package/dist/tree-component-DCmmKZ4j.d.ts.map +1 -0
- package/dist/tree.d.ts +10 -4
- package/dist/tree.d.ts.map +1 -1
- package/dist/tree.js +1 -1
- package/dist/types-DO3gt5vg.d.ts +130 -0
- package/dist/types-DO3gt5vg.d.ts.map +1 -0
- package/dist/wheel-nudge-BlSCe_hD.js +86 -0
- package/dist/wheel-nudge-BlSCe_hD.js.map +1 -0
- package/dist/wheel-nudge-DGrNzWuE.d.ts +29 -0
- package/dist/wheel-nudge-DGrNzWuE.d.ts.map +1 -0
- package/dist/{xy-axis-CEI7ojks.d.ts → xy-axis-5KhVTNoX.d.ts} +75 -29
- package/dist/xy-axis-5KhVTNoX.d.ts.map +1 -0
- package/dist/xy-axis-CxHC8z5E.js +1849 -0
- package/dist/xy-axis-CxHC8z5E.js.map +1 -0
- package/dist/xy-pad.d.ts +13 -2
- package/dist/xy-pad.d.ts.map +1 -1
- package/dist/xy-pad.js +47 -6
- package/dist/xy-pad.js.map +1 -1
- package/docs-user/radial-input.md +2 -2
- package/package.json +22 -21
- package/dist/colour-C3MQIjFJ-vRCdr8W-.js +0 -3732
- package/dist/colour-C3MQIjFJ-vRCdr8W-.js.map +0 -1
- package/dist/colour-picker-0sgAha1T.js.map +0 -1
- package/dist/data-provider-DgI909FP.js.map +0 -1
- package/dist/dist-CA13FvMn.js +0 -980
- package/dist/dist-CA13FvMn.js.map +0 -1
- package/dist/hex-editor-CMIxtNgT.d.ts.map +0 -1
- package/dist/hex-editor-WZrjRtvL.js.map +0 -1
- package/dist/icon-epZd-JIO.d.ts.map +0 -1
- package/dist/incr-search-CeERfijK.js.map +0 -1
- package/dist/index-9fGVAg1d.d.ts.map +0 -1
- package/dist/index-CowKi2mo.d.ts.map +0 -1
- package/dist/index-D87kRcEs.d.ts.map +0 -1
- package/dist/index-DgXpCg_G.d.ts +0 -1244
- package/dist/index-DgXpCg_G.d.ts.map +0 -1
- package/dist/index-JuEVfmr-.d.ts.map +0 -1
- package/dist/index-_RTQSKHi.d.ts.map +0 -1
- package/dist/keyboard-CimiEskD.js +0 -20
- package/dist/keyboard-CimiEskD.js.map +0 -1
- package/dist/labelled-input-base-Cz6qE6Dk.d.ts.map +0 -1
- package/dist/menu-item-COx-Azgj.d.ts.map +0 -1
- package/dist/menu-vjoiHZ13.js.map +0 -1
- package/dist/radial-input-CpQPs1Mp.d.ts.map +0 -1
- package/dist/radial-input-DZ7eQCcM.js.map +0 -1
- package/dist/tab-list-DLzb-m-I.d.ts.map +0 -1
- package/dist/tabs.js.map +0 -1
- package/dist/tickled-controller-BjYCzGrU.d.ts.map +0 -1
- package/dist/timeline-2OFtN4Ta.js.map +0 -1
- package/dist/tooltip-RGVIwHrZ.d.ts.map +0 -1
- package/dist/tree-D84RUgFC.js.map +0 -1
- package/dist/tree-component-BaCSPWg1.d.ts.map +0 -1
- package/dist/types-DSfbtHs3.d.ts +0 -8
- package/dist/types-DSfbtHs3.d.ts.map +0 -1
- package/dist/xy-axis-CEI7ojks.d.ts.map +0 -1
- package/dist/xy-axis-DbPezP6A.js +0 -7849
- package/dist/xy-axis-DbPezP6A.js.map +0 -1
- /package/bundle/{chunk-D7D4PA-g.js → rolldown-runtime-D7D4PA-g.js} +0 -0
- /package/dist/{chunk-D7D4PA-g.js → rolldown-runtime-D7D4PA-g.js} +0 -0
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["#host","#opts","#provider","#items","#loading","#loaded","#total","#error","#abort","#consume","#applyBatch","#consumeStream","#handleError","#data","#scheduleSuggestionFetch","#addToken","#startEditingSelectedToken","#handleNavigationKey","#selectSuggestion","#removeToken","#cache","#emitChange","#buildStaticProvider","#debounceTimer","#lastSuggestions","#staticProvider","#closePopup","#scrollSuggestionIntoView","#buildCachedProvider","#filterUsed","#onChipPointerDown","#onSuggestionPointerDown","#renderSuggestion","#onWrapperClick","#renderChip","#onInput","#onKeyDown","#onFocus","#onBlur","#onPaste","#renderPopup","customElement","#updateComputedItems","#handleToggleChange","#handleRadioChange","customElement","customElement","#pathOpts","#root","#separator","#onQuery","#pathed","Trees","#element","#siblingLookup","#cleanupPending","#closeDropdown","#scrollDropdownActiveIntoView","#selectSibling","#uid","#getSegments","#anchorName","#pendingController","#pendingIndex","#getRootSegments","#onSiblingClick","#getCumulativePath","#onSegmentClick","#onLabelClick","#onCaretClick","#onRootSegmentClick","#dispatchChangeEvent","#makeCompletionProvider","#onAcChange","#onAcFocusOut","#onAcKeyDown","#onHostKeyDown","#renderRootSegment","#renderSegment","#onTrailingClick","#onPopoverToggle","#onDropdownKeyDown","#renderDropdownContent","customElement","#lastInputValue","#dragStartY","#dragStartValue","#dragCurrentValue","#dragging","#hasDragged","customElement","#clearingSelection","#subComponents","#data","#groupBy","#factory","#clearSubComponents","#onSelect","#syncSubComponents","#renderedGroups","#computeGroups","#syncUngrouped","#syncGrouped","customElement","#search","#selectionAnchor","#customWrappers","customElement","customElement","#scaleTo100","#userMin","#userMax","#scaleFrom100","#userClamp","#updateScale","customElement","customElement","customElement","#isSelected","#unselect","#select","customElement","#onLastCharOut","#renderCharSwap","#onOutgoingEnd","customElement","#renderIcon","customElement"],"sources":["../src/common/data-controller.ts","../src/ac-token/ac-token.ts","../src/button/radio-group.ts","../src/button/split-button.ts","../node_modules/.pnpm/@ixfx+collections@0.56.13/node_modules/@ixfx/collections/dist/StackMutable-B9Qm32K8.js","../node_modules/.pnpm/@ixfx+collections@0.56.13/node_modules/@ixfx/collections/dist/tree-C6jGRTgK.js","../src/crumbs/crumb-path-controller.ts","../src/crumbs/crumb-path.ts","../src/editable-label/editable-number.ts","../src/grouped-item-lister/grouped-item-lister.ts","../src/grouped-item-lister/tree-list-adapter.ts","../src/vertical-list/vertical-list.ts","../src/grouped-item-lister/vertical-list-adapter.ts","../src/panel/panel-group.ts","../src/util/drag.ts","../src/util/near.ts","../src/range/range-multi.ts","../src/tabs/tab-list-item.ts","../src/tabs/tab-panel.ts","../src/tabs/tab-panels.ts","../src/transitory-label/transitory-label.ts","../src/util/checkbox.ts","../src/util/is-numeric.ts","../src/util/tooltip.ts","../src/index.ts"],"sourcesContent":["import type { ReactiveController, ReactiveControllerHost } from 'lit';\nimport type { DataBatch, DataProviderResult, IDataProvider } from './data-provider.js';\n\nexport type DataControllerOptions = {\n /**\n * Clear accumulated items immediately when request() is called.\n * When false, stale items remain visible while the new request is in-flight\n * (useful for re-query-on-keystroke patterns — avoids a blank flash).\n * Default: true.\n */\n clearOnRequest?: boolean;\n /**\n * Called when the provider throws or rejects. Useful for logging without\n * coupling the error to render logic.\n */\n onError?: (err: unknown) => void;\n};\n\nfunction isAsyncIterable<T>(v: unknown): v is AsyncIterable<T> {\n return typeof v === `object` && v !== null && Symbol.asyncIterator in v;\n}\n\n/**\n * Lit ReactiveController that manages one active data provider request at a time.\n *\n * Handles all three provider return modes (sync, async one-shot, streaming),\n * tracks progress, and cancels in-flight requests when a new one starts.\n * Calls host.requestUpdate() on every state change so the component re-renders\n * automatically.\n *\n * @typeParam TQuery - The query/scope type passed to the provider.\n * @typeParam TItem - The item type produced by the provider.\n *\n * @example\n * ```ts\n * class MyList extends LitElement {\n * #data = new DataController<string, MyItem>(this, myProvider);\n *\n * protected override render() {\n * return html`\n * ${this.#data.loading ? html`<span>Loading…</span>` : nothing}\n * ${this.#data.items.map(item => html`<div>${item.label}</div>`)}\n * `;\n * }\n * }\n * ```\n */\nexport class DataController<TQuery, TItem> implements ReactiveController {\n readonly #host: ReactiveControllerHost;\n readonly #opts: Required<Omit<DataControllerOptions, `onError`>> & Pick<DataControllerOptions, `onError`>;\n\n #provider: IDataProvider<TQuery, TItem> | undefined;\n #abort: AbortController | undefined;\n\n #items: readonly TItem[] = [];\n #loading = false;\n #loaded = 0;\n #total: number | undefined;\n #error: unknown;\n\n constructor(\n host: ReactiveControllerHost,\n provider?: IDataProvider<TQuery, TItem>,\n options?: DataControllerOptions,\n ) {\n this.#host = host;\n this.#provider = provider;\n this.#opts = {\n clearOnRequest: options?.clearOnRequest ?? true,\n onError: options?.onError,\n };\n host.addController(this);\n }\n\n // ---- ReactiveController lifecycle ----\n\n hostConnected(): void {}\n\n hostDisconnected(): void {\n this.cancel();\n }\n\n // ---- Configuration ----\n\n get provider(): IDataProvider<TQuery, TItem> | undefined {\n return this.#provider;\n }\n\n set provider(value: IDataProvider<TQuery, TItem> | undefined) {\n this.#provider = value;\n }\n\n // ---- Reactive state (read-only) ----\n\n /** The currently accumulated items. */\n get items(): readonly TItem[] {\n return this.#items;\n }\n\n /** True while a provider call is pending or a stream is still open. */\n get loading(): boolean {\n return this.#loading;\n }\n\n /** Number of items accumulated so far in the current request. */\n get loaded(): number {\n return this.#loaded;\n }\n\n /**\n * Provider's latest estimate of the total number of items expected.\n * Undefined when the provider has not reported a total.\n */\n get total(): number | undefined {\n return this.#total;\n }\n\n /**\n * Progress as a 0–1 value, or undefined when total is unknown.\n * Derived from loaded / total.\n */\n get progress(): number | undefined {\n if (this.#total === undefined || this.#total === 0)\n return undefined;\n return Math.min(this.#loaded / this.#total, 1);\n }\n\n /** The last error thrown by the provider, or undefined if the last request succeeded. */\n get error(): unknown {\n return this.#error;\n }\n\n // ---- Control ----\n\n /**\n * Cancel any in-flight request and start a new one.\n * Clears items immediately unless clearOnRequest was set to false.\n */\n request(query: TQuery): void {\n this.cancel();\n\n if (!this.#provider)\n return;\n\n if (this.#opts.clearOnRequest) {\n this.#items = [];\n this.#loaded = 0;\n }\n this.#total = undefined;\n this.#error = undefined;\n this.#loading = true;\n this.#host.requestUpdate();\n\n this.#abort = new AbortController();\n const { signal } = this.#abort;\n\n this.#consume(this.#provider(query, signal), signal);\n }\n\n /** Abort any in-flight request without issuing a new one. */\n cancel(): void {\n this.#abort?.abort();\n this.#abort = undefined;\n if (this.#loading) {\n this.#loading = false;\n this.#host.requestUpdate();\n }\n }\n\n // ---- Internal ----\n\n #consume(result: DataProviderResult<TItem>, signal: AbortSignal): void {\n if (Array.isArray(result)) {\n this.#applyBatch({ items: result }, signal);\n this.#loading = false;\n this.#host.requestUpdate();\n } else if (isAsyncIterable<DataBatch<TItem>>(result)) {\n this.#consumeStream(result, signal);\n } else {\n // Promise (async one-shot)\n (result as Promise<readonly TItem[]>).then(\n (items) => {\n if (signal.aborted)\n return;\n this.#applyBatch({ items }, signal);\n this.#loading = false;\n this.#host.requestUpdate();\n },\n (err: unknown) => {\n if (signal.aborted)\n return;\n this.#handleError(err);\n },\n );\n }\n }\n\n async #consumeStream(stream: AsyncIterable<DataBatch<TItem>>, signal: AbortSignal): Promise<void> {\n try {\n for await (const batch of stream) {\n if (signal.aborted)\n return;\n this.#applyBatch(batch, signal);\n this.#host.requestUpdate();\n }\n } catch (err) {\n if (signal.aborted)\n return;\n this.#handleError(err);\n return;\n }\n if (!signal.aborted) {\n this.#loading = false;\n this.#host.requestUpdate();\n }\n }\n\n #applyBatch(batch: { items: readonly TItem[]; replace?: boolean; total?: number }, _signal: AbortSignal): void {\n if (batch.replace) {\n this.#items = [...batch.items];\n this.#loaded = batch.items.length;\n } else {\n this.#items = [...this.#items, ...batch.items];\n this.#loaded = this.#items.length;\n }\n if (batch.total !== undefined) {\n this.#total = batch.total;\n }\n }\n\n #handleError(err: unknown): void {\n this.#error = err;\n this.#loading = false;\n this.#opts.onError?.(err);\n this.#host.requestUpdate();\n }\n}\n","/* eslint-disable ts/no-unsafe-declaration-merging */\nimport type { PropertyValues } from 'lit';\nimport type { IDataProvider } from '../common/data-provider.js';\nimport type {\n AcTokenAddDetail,\n AcTokenElementEventMap,\n AcTokenItem,\n AcTokenizerFn,\n AcTokenRemoveDetail,\n AcTokensChangeDetail,\n} from './types.js';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { DataController } from '../common/data-controller.js';\nimport { createAcCompletionProvider } from '../incr-search/index.js';\nimport { TickledController } from '../interaction/tickled-controller.js';\nimport { tickledItemStyles, tickledStyles } from '../interaction/tickled-styles.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport '../icons/icon.js';\n\nexport type {\n AcTokenAddDetail,\n AcTokenAddEvent,\n AcTokenElementEventMap,\n AcTokenItem,\n AcTokenizerFn,\n AcTokenRemoveDetail,\n AcTokenRemoveEvent,\n AcTokensChangeDetail,\n AcTokensChangeEvent,\n} from './types.js';\n\n// ---- Helpers ----\n\nconst DEFAULT_TOKENIZER: AcTokenizerFn = (text: string) => text.split(/[\\s,;]+/);\n\ntype LruCache<K, V> = {\n get: (k: K) => V | undefined;\n set: (k: K, v: V) => void;\n has: (k: K) => boolean;\n clear: () => void;\n};\n\nfunction makeLruCache<K, V>(maxSize: number): LruCache<K, V> {\n const map = new Map<K, V>();\n return {\n get: k => map.get(k),\n set: (k, v) => {\n if (map.has(k))\n map.delete(k);\n map.set(k, v);\n if (map.size > maxSize)\n map.delete(map.keys().next().value!);\n },\n has: k => map.has(k),\n clear: () => map.clear(),\n };\n}\n\n// ---- Component ----\n\n/**\n * Token/tag input with per-token autocomplete suggestions.\n *\n * Users type tokens separated by space, comma or semicolon (default). Each\n * committed token appears as a chip inline with the text cursor. The\n * suggestion popup follows the input cursor position.\n *\n * @fires {AcTokensChangeEvent} ac-token-change — any time the token list changes\n * @fires {AcTokenAddEvent} ac-token-add — when a token is added\n * @fires {AcTokenRemoveEvent} ac-token-remove — when a token is removed\n *\n * @example\n * ```html\n * <ixfx-ac-token placeholder=\"Add tags…\" data-tokens=\"one two three\"></ixfx-ac-token>\n * ```\n */\n@customElement(`ixfx-ac-token`)\nexport class AcTokenElement extends LitElement {\n /** Provides completion results for the current draft token. */\n @property({ type: Object })\n completionProvider: IDataProvider<string, AcTokenItem> | undefined;\n\n /** Custom tokenizer — defaults to splitting on space, comma, semicolon. */\n @property({ type: Object })\n tokenizer: AcTokenizerFn | undefined;\n\n /** Placeholder text shown when no tokens or draft text are present. */\n @property({ type: String })\n placeholder = ``;\n\n /** Maximum number of query results to cache (LRU). */\n @property({ type: Number, attribute: `cache-size` })\n cacheSize = 20;\n\n /** Debounce delay in ms before invoking the provider after keystroke. */\n @property({ type: Number, attribute: `debounce-ms` })\n debounceMs = 150;\n\n /**\n * When true, only suggestions from the popup can be committed.\n * When false (default), typing text and pressing Enter commits it as-is.\n */\n @property({ type: Boolean })\n strict = false;\n\n /**\n * When false (default), tokens that have already been committed are\n * filtered out of the suggestion list. Set to true to show all\n * suggestions including duplicates.\n */\n @property({ type: Boolean, attribute: `allow-duplicates` })\n allowDuplicates = false;\n\n @state() private _tokens: AcTokenItem[] = [];\n @state() private _draft = ``;\n @state() private _selectedTokenIndex: number | undefined;\n @state() private _isOpen = false;\n\n private _tickled = new TickledController<number>(this, {\n getItems: () => this.#data.items.map((_, i) => ({ id: i, enabled: true })),\n });\n\n #data = new DataController<string, AcTokenItem>(this, undefined, {\n clearOnRequest: true,\n onError: err => console.error(`[ixfx-ac-token] completionProvider error:`, err),\n });\n\n #cache: LruCache<string, readonly AcTokenItem[]> = makeLruCache(20);\n #debounceTimer: ReturnType<typeof setTimeout> | undefined;\n #staticProvider: IDataProvider<string, AcTokenItem> | undefined;\n #lastSuggestions: readonly AcTokenItem[] = [];\n\n constructor() {\n super();\n this.#cache = makeLruCache<string, readonly AcTokenItem[]>(this.cacheSize);\n }\n\n // ---- Public API ----\n\n get tokens(): readonly AcTokenItem[] {\n return this._tokens;\n }\n\n set tokens(value: readonly AcTokenItem[]) {\n this._tokens = [...value];\n this.#emitChange();\n }\n\n /** All committed token labels joined with commas. */\n get value(): string {\n return this._tokens.map(t => t.label).join(`, `);\n }\n\n // ---- Lifecycle ----\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.#buildStaticProvider();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n if (this.#debounceTimer !== undefined) {\n clearTimeout(this.#debounceTimer);\n this.#debounceTimer = undefined;\n }\n // DataController.cancel() called automatically via hostDisconnected\n }\n\n protected override updated(changedProps: PropertyValues): void {\n if (changedProps.has(`completionProvider`) || changedProps.has(`cacheSize`)) {\n this.#cache = makeLruCache<string, readonly AcTokenItem[]>(this.cacheSize);\n }\n if (changedProps.has(`completionProvider`)) {\n this.#buildStaticProvider();\n }\n // Clear keyboard cursor when suggestion list is replaced\n if (this.#data.items !== this.#lastSuggestions) {\n this.#lastSuggestions = this.#data.items;\n this._tickled.clearTickled();\n }\n }\n\n #buildStaticProvider(): void {\n const raw = this.getAttribute(`data-tokens`);\n if (!raw || this.completionProvider) {\n this.#staticProvider = undefined;\n return;\n }\n const items: AcTokenItem[] = raw\n .trim()\n .split(/[\\s,;]+/)\n .filter(Boolean)\n .map(label => ({ label }));\n this.#staticProvider = createAcCompletionProvider(items);\n }\n\n // ---- Handlers ----\n\n #onWrapperClick = (e: MouseEvent): void => {\n const target = e.target as HTMLElement;\n if (!target.closest(`.token-chip`)) {\n this.shadowRoot?.querySelector<HTMLInputElement>(`input.draft`)?.focus();\n }\n };\n\n #onFocus = (): void => {\n this._selectedTokenIndex = undefined;\n this.#scheduleSuggestionFetch(this._draft);\n };\n\n #onBlur = (): void => {\n // Delay so pointerdown on popup items fires first\n setTimeout(() => {\n this._isOpen = false;\n this._tickled.clearTickled();\n this._selectedTokenIndex = undefined;\n }, 120);\n };\n\n #onInput = (e: Event): void => {\n const input = e.target as HTMLInputElement;\n const value = input.value;\n this._selectedTokenIndex = undefined;\n\n const tokenize = this.tokenizer ?? DEFAULT_TOKENIZER;\n const parts = tokenize(value);\n\n if (parts.length > 1) {\n for (let i = 0; i < parts.length - 1; i++) {\n const label = parts[i].trim();\n if (label)\n this.#addToken({ label });\n }\n this._draft = parts[parts.length - 1] ?? ``;\n } else {\n this._draft = value;\n }\n\n this.#scheduleSuggestionFetch(this._draft);\n };\n\n #onKeyDown = (e: KeyboardEvent): void => {\n const input = e.target as HTMLInputElement;\n\n if ((e.metaKey || e.ctrlKey) && e.key === `a`) {\n e.preventDefault();\n const parts = [...this._tokens.map(t => t.label), this._draft.trim()].filter(Boolean);\n navigator.clipboard.writeText(parts.join(` `)).catch(() => {});\n return;\n }\n\n // Printable key while a token chip is selected → edit that token\n if (\n this._selectedTokenIndex !== undefined\n && e.key.length === 1\n && !e.metaKey && !e.ctrlKey && !e.altKey\n ) {\n e.preventDefault();\n this.#startEditingSelectedToken(e.key);\n return;\n }\n\n this.#handleNavigationKey(e, input);\n };\n\n #handleNavigationKey(e: KeyboardEvent, input: HTMLInputElement): void {\n switch (e.key) {\n case `ArrowLeft`: {\n if (input.selectionStart === 0 && input.selectionEnd === 0) {\n e.preventDefault();\n if (this._selectedTokenIndex === undefined) {\n if (this._tokens.length > 0)\n this._selectedTokenIndex = this._tokens.length - 1;\n } else if (this._selectedTokenIndex > 0) {\n this._selectedTokenIndex--;\n }\n }\n break;\n }\n case `ArrowRight`: {\n if (this._selectedTokenIndex !== undefined) {\n e.preventDefault();\n if (this._selectedTokenIndex < this._tokens.length - 1) {\n this._selectedTokenIndex++;\n } else {\n this._selectedTokenIndex = undefined;\n }\n }\n break;\n }\n case `Backspace`: {\n if (input.selectionStart === 0 && input.selectionEnd === 0) {\n e.preventDefault();\n if (this._selectedTokenIndex !== undefined) {\n this.#removeToken(this._selectedTokenIndex);\n } else if (this._tokens.length > 0) {\n this.#removeToken(this._tokens.length - 1);\n }\n }\n break;\n }\n case `Enter`: {\n const tickledIdx = this._tickled.tickledId;\n if (this._isOpen && tickledIdx !== undefined && this.#data.items[tickledIdx]) {\n e.preventDefault();\n this.#selectSuggestion(this.#data.items[tickledIdx] as AcTokenItem);\n } else if (!this.strict && this._draft.trim()) {\n e.preventDefault();\n this.#addToken({ label: this._draft.trim() });\n this._draft = ``;\n this.#closePopup();\n }\n break;\n }\n case `ArrowDown`: {\n if (!this._isOpen)\n return;\n e.preventDefault();\n this._tickled.handleKeyboardNavigation(`next`);\n this.#scrollSuggestionIntoView();\n break;\n }\n case `ArrowUp`: {\n if (!this._isOpen)\n return;\n e.preventDefault();\n this._tickled.handleKeyboardNavigation(`previous`);\n this.#scrollSuggestionIntoView();\n break;\n }\n case `Escape`: {\n e.preventDefault();\n this.#closePopup();\n this._selectedTokenIndex = undefined;\n break;\n }\n }\n }\n\n #onPaste = (e: ClipboardEvent): void => {\n e.preventDefault();\n const text = e.clipboardData?.getData(`text/plain`) ?? ``;\n if (!text)\n return;\n\n const tokenize = this.tokenizer ?? DEFAULT_TOKENIZER;\n const parts = tokenize(this._draft + text).filter(Boolean);\n if (parts.length === 0)\n return;\n\n if (parts.length === 1) {\n this._draft = parts[0];\n } else {\n for (let i = 0; i < parts.length - 1; i++) {\n const label = parts[i].trim();\n if (label)\n this.#addToken({ label });\n }\n this._draft = parts[parts.length - 1] ?? ``;\n }\n\n this.updateComplete.then(() => {\n this.shadowRoot\n ?.querySelector<HTMLInputElement>(`input.draft`)\n ?.setSelectionRange(this._draft.length, this._draft.length);\n });\n this.#scheduleSuggestionFetch(this._draft);\n };\n\n #onSuggestionPointerDown = (e: PointerEvent, item: AcTokenItem): void => {\n e.preventDefault();\n this.#selectSuggestion(item);\n };\n\n #onChipPointerDown = (e: PointerEvent, index: number): void => {\n if (e.button !== 0)\n return;\n e.preventDefault();\n const el = e.currentTarget as HTMLElement;\n const startY = e.clientY;\n let dragged = false;\n\n el.setPointerCapture(e.pointerId);\n\n const cleanup = (): void => {\n // eslint-disable-next-line ts/no-use-before-define\n el.removeEventListener(`pointermove`, onMove);\n // eslint-disable-next-line ts/no-use-before-define\n el.removeEventListener(`pointerup`, onUp);\n };\n\n const onMove = (me: PointerEvent): void => {\n if (Math.abs(me.clientY - startY) > 28) {\n dragged = true;\n el.releasePointerCapture(me.pointerId);\n cleanup();\n this.#removeToken(index);\n this.shadowRoot?.querySelector<HTMLInputElement>(`input.draft`)?.focus();\n }\n };\n\n const onUp = (): void => {\n cleanup();\n if (!dragged) {\n this._selectedTokenIndex = this._selectedTokenIndex === index ? undefined : index;\n this.shadowRoot?.querySelector<HTMLInputElement>(`input.draft`)?.focus();\n }\n };\n\n el.addEventListener(`pointermove`, onMove);\n el.addEventListener(`pointerup`, onUp);\n };\n\n // ---- Internal logic ----\n\n #startEditingSelectedToken(key: string): void {\n const idx = this._selectedTokenIndex;\n if (idx === undefined)\n return;\n const token = this._tokens[idx];\n if (!token)\n return;\n\n const newDraft = token.label + key;\n this.#removeToken(idx);\n this._selectedTokenIndex = undefined;\n this._draft = newDraft;\n\n this.updateComplete.then(() => {\n const inp = this.shadowRoot?.querySelector<HTMLInputElement>(`input.draft`);\n if (!inp)\n return;\n inp.setSelectionRange(inp.value.length, inp.value.length);\n });\n this.#scheduleSuggestionFetch(newDraft);\n }\n\n #addToken(item: AcTokenItem): void {\n const index = this._tokens.length;\n this._tokens = [...this._tokens, item];\n this.dispatchEvent(new CustomEvent<AcTokenAddDetail>(`ac-token-add`, {\n detail: { item, index },\n bubbles: true,\n composed: true,\n }));\n this.#emitChange();\n }\n\n #removeToken(index: number): void {\n const item = this._tokens[index];\n if (!item)\n return;\n this._tokens = this._tokens.filter((_, i) => i !== index);\n\n if (this._selectedTokenIndex !== undefined) {\n if (this._selectedTokenIndex === index) {\n this._selectedTokenIndex = undefined;\n } else if (this._selectedTokenIndex > index) {\n this._selectedTokenIndex--;\n }\n }\n\n this.dispatchEvent(new CustomEvent<AcTokenRemoveDetail>(`ac-token-remove`, {\n detail: { item, index },\n bubbles: true,\n composed: true,\n }));\n this.#emitChange();\n }\n\n #selectSuggestion(item: AcTokenItem): void {\n this.#addToken(item);\n this._draft = ``;\n this.#closePopup();\n }\n\n #emitChange(): void {\n this.dispatchEvent(new CustomEvent<AcTokensChangeDetail>(`ac-token-change`, {\n detail: { tokens: this._tokens },\n bubbles: true,\n composed: true,\n }));\n }\n\n #filterUsed(items: readonly AcTokenItem[]): readonly AcTokenItem[] {\n if (this.allowDuplicates)\n return items;\n const used = new Set(this._tokens.map(t => t.label));\n return items.filter(item => !used.has(item.label));\n }\n\n #closePopup(): void {\n this._isOpen = false;\n this._tickled.clearTickled();\n }\n\n #cancelPending(): void {\n if (this.#debounceTimer !== undefined) {\n clearTimeout(this.#debounceTimer);\n this.#debounceTimer = undefined;\n }\n this.#data.cancel();\n }\n\n #scheduleSuggestionFetch(query: string): void {\n const cachedProvider = this.#buildCachedProvider();\n if (!cachedProvider) {\n this._isOpen = false;\n return;\n }\n\n if (this.#debounceTimer !== undefined)\n clearTimeout(this.#debounceTimer);\n this._isOpen = true;\n\n this.#debounceTimer = setTimeout(() => {\n this.#data.provider = cachedProvider;\n this.#data.request(query);\n }, this.debounceMs);\n }\n\n #buildCachedProvider(): IDataProvider<string, AcTokenItem> | undefined {\n const raw = this.completionProvider ?? this.#staticProvider;\n if (!raw)\n return undefined;\n\n return (query, signal) => {\n const hit = this.#cache.get(query);\n if (hit !== undefined)\n return this.#filterUsed(hit as AcTokenItem[]);\n\n const result = raw(query, signal);\n\n // Streaming providers pass through uncached\n if (Symbol.asyncIterator in new Object(result))\n return result;\n\n if (Array.isArray(result)) {\n this.#cache.set(query, result);\n return this.#filterUsed(result);\n }\n\n return (result as Promise<readonly AcTokenItem[]>).then((items) => {\n if (!signal.aborted)\n this.#cache.set(query, items);\n return this.#filterUsed(items);\n });\n };\n }\n\n #scrollSuggestionIntoView(): void {\n this.updateComplete.then(() => {\n this.shadowRoot?.querySelector(`.item.tickled`)?.scrollIntoView({ block: `nearest` });\n });\n }\n\n // ---- Render helpers ----\n\n #renderChip(item: AcTokenItem, index: number) {\n const isSelected = this._selectedTokenIndex === index;\n return html`\n <span\n class=\"token-chip ${isSelected ? `selected` : ``}\"\n title=${item.subLabel ?? nothing}\n @pointerdown=${(e: PointerEvent) => this.#onChipPointerDown(e, index)}\n >\n ${item.icon ? html`<ixfx-icon class=\"chip-icon\" name=${item.icon}></ixfx-icon>` : nothing}\n <span class=\"chip-label\">${item.label}</span>\n </span>\n `;\n }\n\n #renderSuggestion(item: AcTokenItem, index: number) {\n const isTickled = this._tickled.isTickled(index);\n return html`\n <div\n class=\"item ${isTickled ? `tickled` : ``}\"\n role=\"option\"\n id=\"ac-token-sugg-${index}\"\n aria-selected=${isTickled}\n @pointerenter=${() => this._tickled.handlePointerEnter(index)}\n @pointerdown=${(e: PointerEvent) => this.#onSuggestionPointerDown(e, item)}\n >\n ${item.icon ? html`<ixfx-icon class=\"sugg-icon\" name=${item.icon}></ixfx-icon>` : nothing}\n <span class=\"sugg-label\">${item.label}</span>\n ${item.subLabel ? html`<span class=\"sugg-sublabel\">${item.subLabel}</span>` : nothing}\n </div>\n `;\n }\n\n #renderPopup() {\n const showEmpty = !this.#data.loading && this.#data.items.length === 0;\n return html`\n <div\n class=\"popup\"\n role=\"listbox\"\n aria-label=\"Suggestions\"\n data-input-mode=${this._tickled.inputMode}\n @pointerleave=${(e: PointerEvent) => this._tickled.handlePointerLeave(e)}\n >\n ${showEmpty\n ? html`<div class=\"no-results\">No matching results</div>`\n : this.#data.items.map((item, i) => this.#renderSuggestion(item as AcTokenItem, i))\n }\n </div>\n `;\n }\n\n protected override render() {\n const tickledIdx = this._tickled.tickledId ?? -1;\n const activeDescendant = tickledIdx >= 0 ? `ac-token-sugg-${tickledIdx}` : undefined;\n const showPlaceholder = this._tokens.length === 0 ? (this.placeholder || nothing) : nothing;\n\n return html`\n <div class=\"wrapper\" @click=${this.#onWrapperClick}>\n ${this._tokens.map((t, i) => this.#renderChip(t, i))}\n <input\n type=\"text\"\n class=\"draft\"\n .value=${this._draft}\n placeholder=${showPlaceholder}\n autocomplete=\"off\"\n spellcheck=\"false\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-expanded=${this._isOpen}\n aria-activedescendant=${activeDescendant ?? nothing}\n @input=${this.#onInput}\n @keydown=${this.#onKeyDown}\n @focus=${this.#onFocus}\n @blur=${this.#onBlur}\n @paste=${this.#onPaste}\n >\n ${this.#data.loading ? html`<span class=\"spinner\" aria-hidden=\"true\"></span>` : nothing}\n </div>\n ${this._isOpen ? this.#renderPopup() : nothing}\n `;\n }\n\n static override styles = [\n themeFallbacks,\n tickledStyles,\n tickledItemStyles,\n css`\n :host {\n display: block;\n position: relative;\n font-family: var(--font-family, system-ui, sans-serif);\n font-size: var(--text-m, 12px);\n color: var(--surface-2-text);\n }\n\n /* ---- Wrapper (looks like a text input) ---- */\n\n .wrapper {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--ac-token-chip-gap, var(--space-xs, 3px));\n padding: var(--ac-token-input-padding, var(--space-xs, 3px) var(--space-m, 8px));\n background: var(--ac-token-input-background, var(--surface-3, var(--surface-2)));\n color: var(--surface-2-text);\n border: var(--ac-token-input-border, var(--border));\n border-radius: var(--ac-token-input-border-radius, var(--radius-m, 4px));\n cursor: text;\n min-height: 32px;\n box-sizing: border-box;\n transition: border-color var(--transition, 0.15s ease-out);\n }\n\n .wrapper:focus-within {\n border-color: var(--accent);\n }\n\n /* ---- Token chips ---- */\n\n .token-chip {\n display: inline-flex;\n align-items: center;\n gap: var(--space-xs, 3px);\n padding: 1px var(--space-m, 8px);\n background: var(--ac-token-chip-background, var(--surface-4));\n border: var(--ac-token-chip-border, var(--border));\n border-radius: var(--ac-token-chip-border-radius, var(--radius-s, 3px));\n user-select: none;\n cursor: default;\n font-size: var(--text-s, 11px);\n white-space: nowrap;\n touch-action: none;\n transition:\n background var(--transition, 0.1s ease-out),\n border-color var(--transition, 0.1s ease-out),\n color var(--transition, 0.1s ease-out);\n }\n\n .token-chip.selected {\n background: var(--ac-token-chip-selected-background, var(--accent));\n color: var(--ac-token-chip-selected-color, var(--accent-text, #fff));\n border-color: var(--accent);\n }\n\n .chip-icon {\n flex-shrink: 0;\n width: 1em;\n height: 1em;\n }\n\n /* ---- Draft input ---- */\n\n input.draft {\n flex: 1;\n min-width: 60px;\n border: none;\n background: transparent;\n color: inherit;\n font: inherit;\n outline: none;\n caret-color: var(--accent);\n padding: 1px 0;\n anchor-name: --ac-token-draft;\n }\n\n input.draft::placeholder {\n color: var(--surface-muted-text);\n }\n\n /* ---- Spinner ---- */\n\n .spinner {\n width: 12px;\n height: 12px;\n border: 2px solid var(--surface-5);\n border-top-color: var(--accent);\n border-radius: 50%;\n animation: ac-token-spin 0.7s linear infinite;\n flex-shrink: 0;\n pointer-events: none;\n margin-left: var(--space-xs, 3px);\n }\n\n @keyframes ac-token-spin {\n to { transform: rotate(360deg); }\n }\n\n /* ---- Popup ---- */\n\n .popup {\n position: fixed;\n position-anchor: --ac-token-draft;\n top: anchor(bottom);\n left: anchor(left);\n margin-top: 2px;\n position-try-fallbacks: --ac-token-popup-above;\n z-index: 200;\n background: var(--surface-3, var(--surface-2));\n border: var(--border);\n border-radius: var(--radius-m, 4px);\n box-shadow: var(--shadow-l, 0 4px 24px rgba(0, 0, 0, 0.5));\n padding: var(--space-xs, 3px) 0;\n max-height: 260px;\n min-width: 160px;\n overflow-y: auto;\n font-size: var(--ac-token-popup-font-size, var(--text-s, 11px));\n }\n\n @position-try --ac-token-popup-above {\n top: auto;\n bottom: anchor(top);\n left: anchor(left);\n margin-top: 0;\n margin-bottom: 2px;\n }\n\n /* ---- Suggestion items ---- */\n\n .item {\n /* tickledItemStyles provides base; override layout for popup context */\n display: flex;\n padding: var(--item-padding, var(--space-xs, 3px) var(--space-l, 12px));\n gap: var(--space-m, 8px);\n cursor: pointer;\n margin: 0 var(--space-xs, 3px);\n white-space: nowrap;\n min-height: 28px;\n user-select: none;\n }\n\n .sugg-icon {\n flex-shrink: 0;\n width: 1em;\n height: 1em;\n }\n\n .sugg-label {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .sugg-sublabel {\n flex-shrink: 0;\n margin-left: auto;\n color: var(--surface-muted-text);\n font-size: var(--text-s, 11px);\n }\n\n /* ---- Empty state ---- */\n\n .no-results {\n padding: var(--space-m, 8px) var(--space-l, 12px);\n color: var(--surface-muted-text);\n font-style: italic;\n }\n `,\n ];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-ac-token': AcTokenElement;\n }\n}\n\nexport interface AcTokenElement {\n addEventListener: (<K extends keyof AcTokenElementEventMap>(\n type: K,\n listener: (this: AcTokenElement, event: AcTokenElementEventMap[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 } from 'lit';\nimport { css, html, LitElement } from 'lit';\nimport { property, query, state } from 'lit/decorators.js';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { prominenceStyles } from '../styles/prominence.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport '../icons/icon.js';\n\nexport type RadioGroupMode = `compact` | `max`;\n\nexport type RadioItem = Readonly<{\n value: string;\n label: string;\n disabled?: boolean;\n iconName?: string;\n iconNameOff?: string;\n}>;\n\n@customElement(`ixfx-radio-group`)\nexport class RadioGroup extends LitElement {\n @property({ type: String }) value = ``;\n @property({ type: String }) orientation: `horizontal` | `vertical` = `horizontal`;\n @property({ type: Array }) items: RadioItem[] = [];\n @property({ type: String }) name = ``;\n @property({ type: String }) mode: RadioGroupMode = `compact`;\n @property({ type: Boolean }) checked = false;\n @property({ type: String, attribute: `value-off` }) valueOff = ``;\n @property({ type: String, attribute: `icon-name` }) iconName = ``;\n @property({ type: String, attribute: `icon-name-off` }) iconNameOff = ``;\n @property({ type: Boolean, attribute: `hide-labels` }) hideLabels = false;\n\n @state() private _computedItems: RadioItem[] = [];\n @state() private _icons: Map<string, string> = new Map();\n @query(`slot`) private _slot?: HTMLSlotElement;\n\n private get _isSingleToggle(): boolean {\n return this._computedItems.length === 0 && Boolean(this.textContent?.trim());\n }\n\n private get _singleToggleIconName(): string | null {\n if (!this.iconName && !this.iconNameOff)\n return null;\n return this.checked ? this.iconName : (this.iconNameOff || this.iconName);\n }\n\n protected override firstUpdated(): void {\n this.#updateComputedItems();\n }\n\n protected override updated(changedProperties: PropertyValues): void {\n if (changedProperties.has(`checked`)) {\n const input = this.shadowRoot?.querySelector(`.radio-toggle-input`) as HTMLInputElement | undefined;\n if (input && input.checked !== this.checked) {\n input.checked = this.checked;\n const newValue = this.checked\n ? (this.value || `on`)\n : (this.valueOff || undefined);\n\n this.dispatchEvent(new CustomEvent<RadioGroupChangeDetail>(`change`, {\n detail: { checked: this.checked, value: newValue },\n bubbles: true,\n composed: true,\n }));\n }\n }\n\n if (changedProperties.has(`value`) && !this._isSingleToggle) {\n const inputs = this.shadowRoot?.querySelectorAll(`.radio-input`) as NodeListOf<HTMLInputElement>;\n if (inputs) {\n for (const input of inputs) {\n if (input.checked !== (input.value === this.value)) {\n input.checked = input.value === this.value;\n }\n }\n }\n }\n }\n\n #updateComputedItems(): void {\n const options = this.querySelectorAll(`option`);\n const icons = new Map<string, string>();\n\n if (options.length > 0) {\n this._computedItems = Array.from(options, (el) => {\n const tempDiv = document.createElement(`div`);\n tempDiv.innerHTML = el.innerHTML;\n const iconEl = tempDiv.querySelector(`svg`);\n if (iconEl) {\n icons.set(el.getAttribute(`value`) || ``, iconEl.outerHTML);\n }\n return {\n value: el.getAttribute(`value`) || ``,\n label: el.textContent?.trim() || ``,\n disabled: el.hasAttribute(`disabled`),\n iconName: el.getAttribute(`icon-name`) || undefined,\n iconNameOff: el.getAttribute(`icon-name-off`) || undefined,\n };\n });\n this._icons = icons;\n } else {\n this._computedItems = [...this.items];\n }\n }\n\n // #handleItemClick(item: RadioItem): void {\n // if (item.disabled || item.value === this.value)\n // return;\n\n // this.value = item.value;\n // this.dispatchEvent(new CustomEvent<RadioGroupChangeDetail>(`change`, {\n // detail: { checked: true, value: item.value },\n // bubbles: true,\n // composed: true,\n // }));\n // }\n\n #handleRadioChange(e: Event): void {\n e.stopImmediatePropagation();\n const input = e.target as HTMLInputElement;\n this.value = input.value;\n this.dispatchEvent(new CustomEvent<RadioGroupChangeDetail>(`change`, {\n detail: { checked: true, value: input.value },\n bubbles: true,\n composed: true,\n }));\n }\n\n #handleToggleChange(e: Event): void {\n e.stopImmediatePropagation();\n const input = e.target as HTMLInputElement;\n this.checked = input.checked;\n const newValue = this.checked\n ? (this.value || `on`)\n : (this.valueOff || undefined);\n\n this.dispatchEvent(new CustomEvent<RadioGroupChangeDetail>(`change`, {\n detail: { checked: this.checked, value: newValue },\n bubbles: true,\n composed: true,\n }));\n }\n\n #renderIcon(item: RadioItem): ReturnType<typeof html> | null {\n const isSelected = item.value === this.value;\n const iconName = isSelected ? (item.iconName || null) : (item.iconNameOff || item.iconName || null);\n if (iconName) {\n return html`<ixfx-icon class=\"radio-icon\" name=\"${iconName}\"></ixfx-icon>`;\n }\n const iconHtml = this._icons.get(item.value);\n if (!iconHtml)\n return null;\n return html`<span class=\"radio-icon\">${unsafeHTML(iconHtml)}</span>`;\n }\n\n protected override render(): unknown {\n if (this._isSingleToggle) {\n const iconName = this._singleToggleIconName;\n const showIcon = iconName || this.hideLabels;\n const iconPart = showIcon\n ? html`<ixfx-icon class=\"radio-icon\" name=\"${iconName || `check`}\"></ixfx-icon>`\n : null;\n const labelPart = !this.hideLabels\n ? html`<span class=\"radio-label\" data-text=\"${this.textContent?.trim()}\">${this.textContent?.trim()}</span>`\n : null;\n return html`\n <label class=\"radio-item ${this.checked ? `selected` : ``}\">\n <input\n type=\"checkbox\"\n class=\"radio-toggle-input\"\n ?checked=${this.checked}\n @change=${this.#handleToggleChange}\n />\n ${iconPart}\n ${labelPart}\n </label>\n `;\n }\n\n return html`\n <slot @slotchange=${this.#updateComputedItems} style=\"display: none;\"></slot>\n <div class=\"radio-group ${this.orientation} ${this.mode}\" role=\"radiogroup\" aria-label=${this.name}>\n ${this._computedItems.map((item) => {\n const isSelected = item.value === this.value;\n const iconName = isSelected\n ? (item.iconName || null)\n : (item.iconNameOff || item.iconName || null);\n const showIcon = iconName || this.hideLabels;\n const iconPart = showIcon\n ? html`<ixfx-icon class=\"radio-icon\" name=\"${iconName || `check`}\"></ixfx-icon>`\n : null;\n const labelPart = !this.hideLabels\n ? html`<span class=\"radio-label\" data-text=\"${item.label}\">${item.label}</span>`\n : null;\n return html`\n <label class=\"radio-item ${item.value === this.value ? `selected` : ``}\" ?disabled=${item.disabled}>\n <input\n type=\"radio\"\n class=\"radio-input\"\n name=${this.name}\n value=${item.value}\n ?disabled=${item.disabled}\n ?checked=${item.value === this.value}\n @change=${this.#handleRadioChange}\n />\n ${iconPart}\n ${labelPart}\n </label>\n `;\n })}\n </div>\n `;\n }\n\n static override styles = [themeFallbacks, prominenceStyles, css`\n :host {\n display: inline-flex;\n min-width: min-content;\n box-sizing: border-box;\n /* Default to looking like a cohesive control group */\n background: var(--surface-3, transparent);\n border: var(--border, none);\n border-radius: var(--radius-m, 4px);\n }\n\n * {\n box-sizing: border-box;\n }\n\n .radio-toggle-input {\n position: absolute;\n opacity: 0;\n width: 0;\n height: 0;\n pointer-events: none;\n }\n\n .radio-input {\n position: absolute;\n opacity: 0;\n width: 0;\n height: 0;\n pointer-events: none;\n }\n\n .radio-group {\n display: flex;\n width: 100%;\n height: 100%;\n gap: var(--item-spacing, 0);\n overflow: hidden;\n border-radius: inherit;\n }\n\n .radio-group.horizontal {\n flex-direction: row;\n }\n\n .radio-group.vertical {\n flex-direction: column;\n }\n\n .radio-group.max.horizontal .radio-item {\n flex: 1;\n justify-content: center;\n }\n\n .radio-group.max.vertical .radio-item {\n flex: 1;\n justify-content: flex-start;\n }\n\n .radio-item {\n display: inline-flex;\n align-items: center;\n justify-content: flex-start;\n gap: var(--icon-label-spacing, 0.5rem);\n padding: var(--space-m, 0.5rem) var(--space-l, 1rem);\n border: none;\n background: transparent;\n color: var(--color-fg-fade, var(--surface-muted-text));\n font-family: inherit;\n font-size: var(--text-m, inherit);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n cursor: pointer;\n transition: all var(--transition, 0.1s) ease;\n user-select: none;\n white-space: nowrap;\n }\n\n .radio-item:hover:not([disabled]) {\n opacity: 0.9;\n background: var(--surface-4, rgba(255,255,255,0.05));\n }\n\n .radio-item.selected {\n font-weight: bold;\n color: var(--color-fg-accent, var(--surface-2-text));\n background: var(--surface-6, rgba(255,255,255,0.1));\n }\n\n .radio-item[disabled] {\n cursor: not-allowed;\n }\n\n .radio-item:has(input:focus-visible) {\n outline: 2px solid var(--accent, #666);\n outline-offset: -2px;\n }\n\n .radio-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--icon-size, 1.2rem);\n height: var(--icon-size, 1.2rem);\n flex-shrink: 0;\n }\n\n .radio-icon svg {\n width: 100%;\n height: 100%;\n }\n\n .radio-label {\n position: relative;\n display: inline-flex;\n flex-shrink: 0;\n flex-direction: column;\n align-items: center;\n justify-content: space-between;\n }\n\n .radio-label::after {\n content: attr(data-text);\n content: attr(data-text)/\"\";\n font-weight: bold;\n height: 0;\n visibility: hidden;\n overflow: hidden;\n user-select: none;\n pointer-events: none;\n @media speech {\n display: none;\n }\n }\n\n .radio-group.vertical .radio-item {\n width: 100%;\n }\n\n .radio-group.horizontal .radio-item {\n flex-shrink: 0;\n }\n\n .radio-group.compact .radio-label {\n display: var(--show-labels, inline-flex);\n }\n\n .radio-group.compact.horizontal .radio-item {\n padding: var(--compact-padding, 0.5rem);\n }\n `];\n}\n\nexport type RadioGroupChangeDetail = {\n readonly checked: boolean;\n readonly value: string | undefined;\n};\n\nexport type RadioGroupChangeEvent = CustomEvent<RadioGroupChangeDetail>;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-radio-group': RadioGroup;\n }\n}\n","import type { CommandRegistry, KeyboardManager } from '@clinth/ui-commands';\nimport type { MenuTrigger } from '../menu/menu-trigger.js';\nimport type { ItemsProvider, PopupItem, SwitcherItem } from './types.js';\nimport { css, html, nothing } from 'lit';\nimport { property, query, state } from 'lit/decorators.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { prominenceStyles } from '../styles/prominence.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport { buttonStyles } from './button-styles.js';\nimport { ButtonElement } from './button.js';\nimport '../menu/menu-trigger.js';\nimport '../menu/menu-container.js';\nimport '../menu/menu-item.js';\nimport '../icons/icon.js';\n\nexport type SplitButtonMode = `default` | `switcher`;\n\n@customElement(`ixfx-split-button`)\nexport class SplitButton extends ButtonElement {\n @property({ attribute: false }) registry?: CommandRegistry<unknown>;\n @property({ attribute: false }) keyboardManager?: KeyboardManager;\n @property({ type: String }) mode: SplitButtonMode = `default`;\n @property({ type: String, attribute: `default-value` }) defaultValue = ``;\n /** When set, called each time the popup is opened; its return value replaces declarative items. */\n @property({ attribute: false }) itemsProvider?: ItemsProvider;\n /** Directly set popup items. Ignored when itemsProvider is also set. */\n @property({ attribute: false }) items?: PopupItem[];\n\n @query(`ixfx-menu-trigger`) private _menuTrigger!: MenuTrigger;\n\n @state() private _compact = false;\n @state() private _selectedCommand = ``;\n @state() private _selectedLabel = ``;\n @state() private _selectedIcon = ``;\n @state() private _switcherItems: SwitcherItem[] = [];\n @state() private _dynamicItems: PopupItem[] = [];\n @state() private _loadingItems = false;\n @state() private _menuHasItems = false;\n\n private _resizeObserver?: ResizeObserver;\n private _widthNeeded = 0;\n\n // ── Lifecycle ──────────────────────────────────────────────────────────\n\n override connectedCallback(): void {\n super.connectedCallback();\n this._resizeObserver = new ResizeObserver(([entry]) => {\n if (this._compact) {\n if (this._widthNeeded > 0 && entry.contentRect.width >= this._widthNeeded) {\n this._compact = false;\n }\n } else {\n this._checkOverflow();\n }\n });\n this._resizeObserver.observe(this);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this._resizeObserver?.disconnect();\n this._resizeObserver = undefined;\n this._menuTrigger?.removeEventListener(`menu-command`, this._handleSwitcherMenuCommand as EventListener);\n }\n\n override firstUpdated(): void {\n this.updateComplete.then(() => {\n this._menuTrigger?.addEventListener(`menu-command`, this._handleSwitcherMenuCommand as EventListener);\n });\n }\n\n override updated(changedProperties: Map<string, unknown>): void {\n super.updated(changedProperties);\n this._checkOverflow();\n if ((changedProperties.has(`items`) || changedProperties.has(`mode`)) && this.items && !this.itemsProvider) {\n this._applyItems(this.items);\n }\n }\n\n // ── Responsive ─────────────────────────────────────────────────────────\n\n private _checkOverflow(): void {\n if (this._compact)\n return;\n const primary = this.shadowRoot?.querySelector(`button.primary`) as HTMLElement | null;\n if (!primary)\n return;\n if (primary.scrollWidth > primary.offsetWidth + 1) {\n const caret = this.shadowRoot?.querySelector(`button.caret`) as HTMLElement | null;\n this._widthNeeded = primary.scrollWidth + (caret?.offsetWidth ?? 32) + 4;\n this._compact = true;\n }\n }\n\n // ── Programmatic API ───────────────────────────────────────────────────\n\n private _applyItems(items: PopupItem[]): void {\n if (this.mode === `switcher`) {\n this._applySwitcherItems(items.map(i => ({ command: i.command, label: i.label, icon: i.icon ?? `` })));\n } else {\n this._dynamicItems = [...items];\n this._menuHasItems = items.length > 0;\n }\n }\n\n /** In switcher mode, programmatically select the active command. Returns false if not found. */\n selectCommand(command: string): boolean {\n const item = this._switcherItems.find(i => i.command === command);\n if (!item)\n return false;\n this._selectedCommand = item.command;\n this._selectedLabel = item.label;\n this._selectedIcon = item.icon;\n return true;\n }\n\n // ── Caret state ────────────────────────────────────────────────────────\n\n /** True when there is (or will be) popup content. Used to dim the caret visually. */\n private get _caretHasContent(): boolean {\n if (this.itemsProvider)\n return true;\n if (this.items && this.items.length > 0)\n return true;\n if (this.mode === `switcher`)\n return this._switcherItems.length > 1;\n return this._menuHasItems;\n }\n\n // ── Default-mode slot ──────────────────────────────────────────────────\n\n private _onDefaultMenuSlotChange = (e: Event): void => {\n const slot = e.target as HTMLSlotElement;\n this._menuHasItems = slot.assignedElements({ flatten: true }).length > 0;\n };\n\n // ── Switcher helpers ───────────────────────────────────────────────────\n\n private _onSwitcherSlotChange = (e: Event): void => {\n // When itemsProvider is set, declarative items are ignored\n if (this.itemsProvider)\n return;\n const slot = e.target as HTMLSlotElement;\n this._applySwitcherItems(\n slot.assignedElements({ flatten: true })\n .filter(el => el.tagName === `IXFX-MENU-ITEM`)\n .map(el => ({\n command: el.getAttribute(`command`) ?? ``,\n label: el.getAttribute(`label`) ?? el.textContent?.trim() ?? ``,\n icon: el.getAttribute(`icon-name`) ?? ``,\n })),\n );\n };\n\n private _applySwitcherItems(items: SwitcherItem[]): void {\n this._switcherItems = items;\n if (!this._selectedCommand && items.length > 0) {\n const picked = this.defaultValue\n ? (items.find(i => i.command === this.defaultValue) ?? items[0])\n : items[0];\n this._selectedCommand = picked.command;\n this._selectedLabel = picked.label;\n this._selectedIcon = picked.icon;\n }\n }\n\n private _handleSwitcherMenuCommand = (e: CustomEvent): void => {\n if (this.mode !== `switcher`)\n return;\n e.stopPropagation();\n\n const { command } = e.detail;\n const item = this._switcherItems.find(i => i.command === command);\n if (!item)\n return;\n\n this._selectedCommand = item.command;\n this._selectedLabel = item.label;\n this._selectedIcon = item.icon;\n\n // Fire immediately\n this.dispatchEvent(new CustomEvent(`menu-command`, {\n detail: e.detail,\n bubbles: true,\n composed: true,\n }));\n };\n\n private _handleSwitcherPrimaryClick = (): void => {\n if (!this._selectedCommand)\n return;\n this.dispatchEvent(new CustomEvent(`menu-command`, {\n detail: { command: this._selectedCommand },\n bubbles: true,\n composed: true,\n }));\n };\n\n // ── Caret / menu open ──────────────────────────────────────────────────\n\n private _handleCaretClick = async (e: Event): Promise<void> => {\n e.stopPropagation();\n if (this._menuTrigger?.isOpen) {\n this._menuTrigger.closeMenu();\n return;\n }\n\n if (this.itemsProvider) {\n this._loadingItems = true;\n try {\n const result = this.itemsProvider();\n const items = result instanceof Promise ? await result : result;\n\n if (this.mode === `switcher`) {\n this._applySwitcherItems(\n items.map(i => ({ command: i.command, label: i.label, icon: i.icon ?? `` })),\n );\n } else {\n this._dynamicItems = items;\n }\n } finally {\n this._loadingItems = false;\n }\n // Let Lit render the new items before the popup opens\n await this.updateComplete;\n }\n\n this._menuTrigger?.openMenu();\n };\n\n private _handlePrimaryKeyDown = (e: KeyboardEvent): void => {\n if (e.key === `ArrowDown`) {\n e.preventDefault();\n this._menuTrigger?.openMenu();\n }\n };\n\n private _handleCaretKeyDown = (e: KeyboardEvent): void => {\n if (e.key === `ArrowDown`) {\n e.preventDefault();\n this._menuTrigger?.openMenu();\n }\n };\n\n // ── Render ─────────────────────────────────────────────────────────────\n\n protected override render() {\n return this.mode === `switcher`\n ? this._renderSwitcher()\n : this._renderDefault();\n }\n\n private _renderCaret(iconName: string, ariaLabel: string) {\n const empty = !this._caretHasContent;\n return html`\n <button\n slot=\"trigger\"\n class=\"caret\"\n part=\"caret\"\n ?disabled=${this.disabled}\n ?data-empty=${empty}\n aria-haspopup=\"true\"\n aria-label=${ariaLabel}\n @click=${this._handleCaretClick}\n @keydown=${this._handleCaretKeyDown}\n >\n <ixfx-icon name=\"${iconName}\"></ixfx-icon>\n </button>\n `;\n }\n\n private _renderLoadingOrItems(items: PopupItem[]) {\n if (this._loadingItems) {\n return html`<ixfx-menu-item label=\"Loading…\" disabled></ixfx-menu-item>`;\n }\n return items.map(i => html`\n <ixfx-menu-item\n command=${i.command}\n label=${i.label}\n icon-name=${i.icon || nothing}\n ?disabled=${i.disabled ?? false}\n ></ixfx-menu-item>\n `);\n }\n\n private _renderDefault() {\n const showLabel = !this.hideLabel && !this._compact;\n const label = showLabel\n ? html`<span class=\"button-label\"><slot></slot></span>`\n : nothing;\n\n const menuContent = this.itemsProvider\n ? html`\n <ixfx-menu-container slot=\"menu\">\n ${this._renderLoadingOrItems(this._dynamicItems)}\n </ixfx-menu-container>\n `\n : html`<slot name=\"menu\" slot=\"menu\" @slotchange=${this._onDefaultMenuSlotChange}></slot>`;\n\n return html`\n <div class=\"split\">\n <button\n class=\"primary\"\n part=\"primary\"\n ?disabled=${this.disabled}\n @keydown=${this._handlePrimaryKeyDown}\n >\n ${this._renderIcon()}${label}\n </button>\n <ixfx-menu-trigger .registry=${this.registry} .keyboardManager=${this.keyboardManager}>\n ${this._renderCaret(`chevron-down`, `Open menu`)}\n ${menuContent}\n </ixfx-menu-trigger>\n </div>\n `;\n }\n\n private _renderSwitcher() {\n const showLabel = !this.hideLabel && !this._compact;\n\n const primaryIcon = this._selectedIcon\n ? html`<ixfx-icon class=\"button-icon\" name=\"${this._selectedIcon}\"></ixfx-icon>`\n : nothing;\n\n const primaryLabel = showLabel\n ? html`<span class=\"button-label\">${this._selectedLabel}</span>`\n : nothing;\n\n const popupItems = this.itemsProvider\n ? this._renderLoadingOrItems(this._dynamicItems)\n : this._switcherItems\n .filter(i => i.command !== this._selectedCommand)\n .map(i => html`\n <ixfx-menu-item\n command=${i.command}\n label=${i.label}\n icon-name=${i.icon || nothing}\n ></ixfx-menu-item>\n `);\n\n return html`\n <!-- Hidden data-capture slot reads light-DOM items as the data source -->\n <slot name=\"menu\" class=\"switcher-data\" @slotchange=${this._onSwitcherSlotChange}></slot>\n <div class=\"split switcher\">\n <button\n class=\"primary\"\n part=\"primary\"\n ?disabled=${this.disabled}\n @keydown=${this._handlePrimaryKeyDown}\n @click=${this._handleSwitcherPrimaryClick}\n >\n ${primaryIcon}${primaryLabel}\n </button>\n <ixfx-menu-trigger .registry=${this.registry} .keyboardManager=${this.keyboardManager}>\n ${this._renderCaret(`chevron-right`, `Choose action`)}\n <ixfx-menu-container slot=\"menu\">\n ${popupItems}\n </ixfx-menu-container>\n </ixfx-menu-trigger>\n </div>\n `;\n }\n\n // ── Styles ─────────────────────────────────────────────────────────────\n\n static override styles = [\n themeFallbacks,\n prominenceStyles,\n buttonStyles,\n css`\n :host {\n display: inline-flex;\n max-width: 100%;\n vertical-align: middle;\n }\n\n slot.switcher-data {\n display: none;\n }\n\n .split {\n display: inline-flex;\n width: 100%;\n background: var(--surface-3, #ccc);\n color: var(--surface-3-text, #000);\n border: var(--border, 1px solid #999);\n border-radius: var(--radius-xl, 8px);\n corner-shape: superellipse(1);\n box-shadow:\n inset 1px 1px 1px 1px color-mix(in oklch, var(--surface-4) 30%, transparent),\n inset -1px -1px 1px 1px color-mix(in oklch, var(--surface-2) 20%, transparent),\n 2px 2px 1px 0px color-mix(in oklch, var(--surface-2) 30%, transparent);\n overflow: hidden;\n transition: background var(--transition, 0.2s), border-color var(--transition, 0.2s);\n }\n\n /* Switcher: accent the caret separator to signal \"this changes the default\" */\n .split.switcher button.caret {\n border-inline-start-color: var(--accent, #666);\n opacity: 0.7;\n }\n\n .split.switcher button.caret:hover:not(:disabled) {\n opacity: 1;\n }\n\n /* Caret is dimmed when there is no popup content */\n button.caret[data-empty] {\n opacity: 0.3;\n pointer-events: none;\n }\n\n .split:has(button:hover:not(:disabled)) {\n border-color: var(--accent, #666);\n box-shadow:\n inset 1px 1px 1px 1px color-mix(in oklch, var(--surface-5) 70%, transparent),\n inset -1px -1px 1px 1px color-mix(in oklch, var(--surface-2) 60%, transparent),\n 2px 2px 1px 0px color-mix(in oklch, var(--surface-2) 90%, transparent);\n }\n\n .split:has(button:active:not(:disabled)) {\n transform: translateY(1px);\n box-shadow: inset 1px 1px 0px 0.5px color-mix(in oklch, var(--surface-1), transparent);\n }\n\n button.primary,\n button.caret {\n border: none;\n border-radius: 0;\n background: none;\n box-shadow: none;\n color: inherit;\n margin: 0;\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n transition: background var(--transition, 0.2s), opacity var(--transition, 0.2s);\n }\n\n button.primary {\n flex: 1;\n padding: var(--space-m, 8px) var(--space-l, 12px);\n gap: 0.5em;\n overflow: hidden;\n white-space: nowrap;\n }\n\n button.caret {\n padding: var(--space-m, 8px) var(--space-s, 6px);\n border-inline-start: var(--border, 1px solid #999);\n flex-shrink: 0;\n }\n\n button.primary:hover:not(:disabled),\n button.caret:hover:not(:disabled) {\n background: color-mix(in oklch, var(--surface-4) 80%, transparent);\n }\n\n button.primary:active:not(:disabled),\n button.caret:active:not(:disabled) {\n background: var(--surface-2, #aaa);\n transform: none;\n box-shadow: none;\n }\n\n button.primary:disabled,\n button.caret:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n button.primary:focus-visible,\n button.caret:focus-visible {\n outline: 2px solid var(--accent, #666);\n outline-offset: -2px;\n }\n\n ixfx-menu-trigger {\n display: inline-flex;\n align-items: stretch;\n }\n `,\n ];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-split-button': SplitButton;\n }\n}\n","//#region src/stack/StackFns.ts\nconst trimStack = (opts, stack, toAdd) => {\n\tconst potentialLength = stack.length + toAdd.length;\n\tconst policy = opts.discardPolicy ?? `additions`;\n\tconst capacity = opts.capacity ?? potentialLength;\n\tconst toRemove = potentialLength - capacity;\n\tif (opts.debug) console.log(`Stack.push: stackLen: ${stack.length} potentialLen: ${potentialLength} toRemove: ${toRemove} policy: ${policy}`);\n\tswitch (policy) {\n\t\tcase `additions`:\n\t\t\tif (opts.debug) console.log(`Stack.push:DiscardAdditions: stackLen: ${stack.length} slice: ${potentialLength - capacity} toAddLen: ${toAdd.length}`);\n\t\t\tif (stack.length === opts.capacity) return stack;\n\t\t\telse return [...stack, ...toAdd.slice(0, toAdd.length - toRemove)];\n\t\tcase `newer`: {\n\t\t\tif (toAdd.length >= capacity) return toAdd.slice(toAdd.length - capacity);\n\t\t\tconst keepFromOld = capacity - toAdd.length;\n\t\t\treturn [...stack.slice(0, keepFromOld), ...toAdd];\n\t\t}\n\t\tcase `older`: return [...stack, ...toAdd].slice(toRemove);\n\t\tdefault: throw new Error(`Unknown discard policy ${policy}`);\n\t}\n};\nconst push = (opts, stack, ...toAdd) => {\n\tconst potentialLength = stack.length + toAdd.length;\n\treturn opts.capacity && potentialLength > opts.capacity ? trimStack(opts, stack, toAdd) : [...stack, ...toAdd];\n};\nconst pop = (opts, stack) => {\n\tif (stack.length === 0) throw new Error(`Stack is empty`);\n\treturn stack.slice(0, -1);\n};\n/**\n* Peek at the top of the stack (end of array)\n*\n* @typeParam V - Type of stored items\n* @param {StackOpts} opts\n* @param {V[]} stack\n* @returns {(V | undefined)}\n*/\nconst peek = (opts, stack) => stack.at(-1);\nconst isEmpty = (opts, stack) => stack.length === 0;\nconst isFull = (opts, stack) => {\n\tif (opts.capacity) return stack.length >= opts.capacity;\n\treturn false;\n};\n//#endregion\n//#region src/stack/StackMutable.ts\n/**\n* Creates a stack. Mutable. Use {@link StackImmutable} for an immutable alternative.\n*\n* @example Basic usage\n* ```js\n* // Create\n* const s = new StackMutable();\n* // Add one or more items\n* s.push(1, 2, 3, 4);\n*\n* // See what's on top\n* s.peek; // 4\n*\n* // Remove the top-most, and return it\n* s.pop(); // 4\n*\n* // Now there's a new top-most element\n* s.peek; // 3\n* ```\n*/\nvar StackMutable = class {\n\topts;\n\tdata;\n\t/**\n\t* Create a new StackMutable.\n\t* \n\t* @param opts Options\n\t* @param data Initial data to use\n\t*/\n\tconstructor(opts = {}, data = []) {\n\t\tthis.opts = opts;\n\t\tthis.data = data;\n\t}\n\t/**\n\t* Push data onto the stack.\n\t* If `toAdd` is empty, nothing happens\n\t* @param toAdd Data to add\n\t* @returns Length of stack\n\t*/\n\tpush(...toAdd) {\n\t\tif (toAdd.length === 0) return this.data.length;\n\t\tthis.data = push(this.opts, this.data, ...toAdd);\n\t\treturn this.data.length;\n\t}\n\t/**\n\t* Iterate from bottom to top. Note that `forEachFromTop` iterates from top to bottom, so this is the reverse.\n\t* @param fn\n\t*/\n\tforEach(fn) {\n\t\tthis.data.forEach(fn);\n\t}\n\t/**\n\t* Iterate from top to bottom. Note that `forEach` iterates from bottom to top, so this is the reverse.\n\t* @param fn \n\t*/\n\tforEachFromTop(fn) {\n\t\t[...this.data].reverse().forEach(fn);\n\t}\n\t/**\n\t* Pop the top-most item from the stack, and return it. If the stack is empty, returns _undefined_.\n\t* @returns \n\t*/\n\tpop() {\n\t\tconst v = peek(this.opts, this.data);\n\t\tthis.data = pop(this.opts, this.data);\n\t\treturn v;\n\t}\n\t/**\n\t* Returns _true_ if the stack is empty, _false_ otherwise.\n\t*/\n\tget isEmpty() {\n\t\treturn isEmpty(this.opts, this.data);\n\t}\n\t/**\n\t* Returns _true_ if the stack is full, _false_ otherwise. Note that a stack is only full if a `maxSize` option was provided at construction time.\n\t*/\n\tget isFull() {\n\t\treturn isFull(this.opts, this.data);\n\t}\n\t/**\n\t* Returns the top-most item on the stack, without modifying the stack. If the stack is empty, returns _undefined_.\n\t*/\n\tget peek() {\n\t\treturn peek(this.opts, this.data);\n\t}\n\t/**\n\t* Returns the number of items currently on the stack.\n\t*/\n\tget length() {\n\t\treturn this.data.length;\n\t}\n};\n/**\n* Creates a stack. Mutable. Use {@link Stacks.immutable} for an immutable alternative.\n*\n* @example Basic usage\n* ```js\n* // Create\n* const s = Stacks.mutable();\n* // Add one or more items\n* s.push(1, 2, 3, 4);\n*\n* // See what's on top\n* s.peek; // 4\n*\n* // Remove the top-most, and return it\n* s.pop(); // 4\n*\n* // Now there's a new top-most element\n* s.peek; // 3\n* ```\n*/\nconst mutable = (opts = {}, ...startingItems) => new StackMutable({ ...opts }, [...startingItems]);\n//#endregion\nexport { peek as a, trimStack as c, isFull as i, mutable as n, pop as o, isEmpty as r, push as s, StackMutable as t };\n","import { t as __exportAll } from \"./chunk-ZRW5x4aP.js\";\nimport { t as StackMutable } from \"./StackMutable-B9Qm32K8.js\";\nimport { t as QueueMutable } from \"./queue-mutable-lrZyCqgq.js\";\nimport { defaultComparer, isEqualDefault, isEqualValueDefault, isEqualValueIgnoreOrder, isPrimitive } from \"@ixfx/core\";\nimport { nullUndefTest, resultThrow, throwIfFailed } from \"@ixfx/guards\";\nimport { last } from \"@ixfx/iterables/sync\";\nimport { containsDuplicateInstances, without } from \"@ixfx/arrays\";\nimport { toStringAbbreviate } from \"@ixfx/core/text\";\n//#region src/tree/compare.ts\nconst compare$1 = (a, b, eq = isEqualValueIgnoreOrder, parent) => {\n\tconst valueEqual = valueOrIdentityEqual(a, b, eq);\n\tconst childrenCompare = compareChildren(a, b, eq);\n\tconst diff = {\n\t\tvalueChanged: !valueEqual,\n\t\ta,\n\t\tb,\n\t\tadded: childrenCompare.added,\n\t\tremoved: childrenCompare.removed,\n\t\tchildChanged: false\n\t};\n\tconst diffNode = {\n\t\tvalue: diff,\n\t\tchildrenStore: [],\n\t\tparent\n\t};\n\tconst childrenDiff = childrenCompare.identical.map((c) => compare$1(c[0], c[1], eq, diffNode));\n\tconst someChildChange = hasChange(diff) || childrenDiff.some((v) => hasChange(v.value));\n\tsetChildren(diffNode, childrenDiff);\n\tdiffNode.toString = () => toString$1(diffNode, 0);\n\tdiffNode.value.childChanged = someChildChange;\n\tthrowTreeTest(diffNode);\n\treturn diffNode;\n};\nconst hasChange = (vv) => {\n\tif (vv === void 0) return false;\n\tif (vv.valueChanged) return true;\n\tif (vv.childChanged) return true;\n\tif (vv.added.length > 0) return true;\n\tif (vv.removed.length > 0) return true;\n\treturn false;\n};\nconst compareChildren = (a, b, eq = isEqualValueIgnoreOrder) => {\n\tconst childrenOfA = [...a.children()];\n\tconst childrenOfB = [...b.children()];\n\tconst identical = [];\n\tconst removed = [];\n\tfor (const childA of childrenOfA) {\n\t\tlet foundIndex = -1;\n\t\tfor (const [index, childOfB] of childrenOfB.entries()) if (valueOrIdentityEqual(childA, childOfB, eq)) {\n\t\t\tidentical.push([childA, childOfB]);\n\t\t\tfoundIndex = index;\n\t\t\tbreak;\n\t\t}\n\t\tif (foundIndex === -1) removed.push(childA);\n\t\telse childrenOfB.splice(foundIndex, 1);\n\t}\n\treturn {\n\t\tadded: [...childrenOfB],\n\t\tidentical,\n\t\tremoved\n\t};\n};\nconst valueOrIdentityEqual = (a, b, eq) => {\n\tif (a.getIdentity() === b.getIdentity()) return true;\n\tif (eq(a.getValue(), b.getValue())) return true;\n\treturn false;\n};\nconst toStringSingle = (n) => {\n\treturn JSON.stringify(n.getValue());\n};\nconst toString$1 = (n, indent = 0) => {\n\tif (n === void 0) return `(undefined)`;\n\tlet t = toStringDiff(n.value, indent);\n\tfor (const c of n.childrenStore) t += toString$1(c, indent + 2);\n\treturn t;\n};\nconst toStringDiff = (n, indent) => {\n\tconst spaces = ` `.repeat(indent);\n\tif (n === void 0) return `${spaces}(undefined)`;\n\tconst t = [];\n\tt.push(`a: ${toStringSingle(n.a)} b: ${toStringSingle(n.b)}`);\n\tif (n.valueChanged) t.push(`Value changed. Child changed: ${n.childChanged}`);\n\telse t.push(`Value unchanged. Child changed: ${n.childChanged}`);\n\tif (n.added.length > 0) {\n\t\tt.push(`Added:`);\n\t\tfor (const c of n.added) t.push(` - ` + toStringSingle(c));\n\t}\n\tif (n.removed.length > 0) {\n\t\tt.push(`Removed: ${n.removed.length}`);\n\t\tfor (const c of n.removed) t.push(` - ` + toStringSingle(c));\n\t}\n\tt.push(`----\\n`);\n\treturn t.map((line) => spaces + line).join(`\\n`);\n};\n//#endregion\n//#region src/tree/tree-mutable.ts\nvar tree_mutable_exports = /* @__PURE__ */ __exportAll({\n\tadd: () => add,\n\taddValue: () => addValue,\n\tasDynamicTraversable: () => asDynamicTraversable$1,\n\tbreadthFirst: () => breadthFirst$2,\n\tchildren: () => children$2,\n\tchildrenLength: () => childrenLength$1,\n\tchildrenValues: () => childrenValues,\n\tcompare: () => compare,\n\tcomputeMaxDepth: () => computeMaxDepth,\n\tcreateNode: () => createNode$1,\n\tdepthFirst: () => depthFirst$3,\n\tfindAnyChildByValue: () => findAnyChildByValue$2,\n\tfindChildByValue: () => findChildByValue$1,\n\tfindParentsValue: () => findParentsValue,\n\tfollowValue: () => followValue$1,\n\tfromPlainObject: () => fromPlainObject,\n\tgetRoot: () => getRoot,\n\thasAnyChild: () => hasAnyChild$1,\n\thasAnyParent: () => hasAnyParent$1,\n\thasChild: () => hasChild$1,\n\thasParent: () => hasParent$1,\n\tnodeDepth: () => nodeDepth,\n\tparents: () => parents$1,\n\tparentsValues: () => parentsValues,\n\tqueryByValue: () => queryByValue,\n\tqueryParentsValue: () => queryParentsValue,\n\tremove: () => remove$1,\n\tremoveValuelessNodesFromChild: () => removeValuelessNodesFromChild,\n\troot: () => root$2,\n\trootWrapped: () => rootWrapped$1,\n\tsetChildren: () => setChildren,\n\tsiblings: () => siblings$2,\n\tstripParentage: () => stripParentage,\n\tthrowTreeTest: () => throwTreeTest,\n\ttoStringDeep: () => toStringDeep$4,\n\ttreeTest: () => treeTest,\n\tvalue: () => value,\n\twrap: () => wrap$1\n});\n/**\n* Compares two nodes.\n*\n* By default uses `isEqualValueIgnoreOrder` to compare nodes. This means\n* values of nodes will be compared, ignoring the order of fields.\n* @param a\n* @param b\n* @param eq Comparison function. Uses `isEqualValueIgnoreOrder` by default.\n* @returns Compare results\n*/\nfunction compare(a, b, eq) {\n\treturn compare$1(asDynamicTraversable$1(a), asDynamicTraversable$1(b), eq);\n}\n/**\n* Converts {@link Trees.TreeNode} to {@link Trees.SimplifiedNode}, removing the 'parent' fields.\n* This can be useful because if you have the whole tree, the parent field\n* is redundant and because it makes circular references can make dumping to console etc more troublesome.\n*\n* Recursive: strips parentage of all children and so on too.\n* @param node\n*/\nfunction stripParentage(node) {\n\treturn {\n\t\tvalue: node.value,\n\t\tchildrenStore: node.childrenStore.map((c) => stripParentage(c))\n\t};\n}\nconst unwrapped = (node) => `wraps` in node ? node.wraps : node;\nconst wrapped = (node) => `wraps` in node ? node : wrap$1(node);\n/**\n* Wraps node `n` for a more object-oriented means of access.\n* It will wrap child nodes on demand. For this reason, WrappedNode object\n* identity is not stable\n* @param n Node to wrap\n*/\nfunction wrap$1(n) {\n\treturn {\n\t\t*children() {\n\t\t\tfor (const c of n.childrenStore) yield wrap$1(c);\n\t\t},\n\t\tgetValue: () => n.value,\n\t\tgetIdentity: () => n,\n\t\t*queryValue(value) {\n\t\t\tfor (const v of queryByValue(value, unwrapped(n))) yield wrap$1(v);\n\t\t},\n\t\t*queryParentsValue(child, value, eq) {\n\t\t\tfor (const v of queryParentsValue(unwrapped(child), value, eq)) yield wrap$1(v);\n\t\t},\n\t\t*parentsValues(child) {\n\t\t\tyield* parentsValues(unwrapped(child));\n\t\t},\n\t\tfindParentsValue(child, value, eq) {\n\t\t\tconst n = findParentsValue(child, value, eq);\n\t\t\tif (n !== void 0) return wrap$1(n);\n\t\t},\n\t\tgetParent: () => n.parent === void 0 ? void 0 : wrap$1(n.parent),\n\t\thasParent: (parent) => {\n\t\t\treturn hasParent$1(n, unwrapped(parent));\n\t\t},\n\t\thasAnyParent: (parent) => {\n\t\t\treturn hasAnyParent$1(n, unwrapped(parent));\n\t\t},\n\t\thasChild: (child) => {\n\t\t\treturn hasChild$1(unwrapped(child), n);\n\t\t},\n\t\thasAnyChild: (child) => {\n\t\t\treturn hasAnyChild$1(unwrapped(child), n);\n\t\t},\n\t\tremove: () => {\n\t\t\tremove$1(n);\n\t\t},\n\t\taddValue: (value) => {\n\t\t\treturn wrap$1(addValue(value, n));\n\t\t},\n\t\tadd: (child) => {\n\t\t\tadd(unwrapped(child), n);\n\t\t\treturn wrapped(child);\n\t\t},\n\t\twraps: n\n\t};\n}\n/**\n* Removes `child` from the tree structure it is in.\n* It removes `child` from its parent. Any sub-children of `child` still remain connected.\n* @param child\n*/\nfunction remove$1(child) {\n\tconst p = child.parent;\n\tif (p === void 0) return false;\n\tchild.parent = void 0;\n\tconst count = p.childrenStore.length;\n\tp.childrenStore = without(p.childrenStore, child);\n\treturn count !== p.childrenStore.length;\n}\n/**\n* Starting from a child node, work backwards, removing it and ancestors that have no value\n*\n* If `child` is an only child, it will recursively call the same function on the parent.\n* @param child Child to start from\n*/\nfunction removeValuelessNodesFromChild(child) {\n\tif (typeof child.value !== `undefined`) return false;\n\tconst parent = child.parent;\n\tif (!parent) return false;\n\tconst sibs = [...siblings$2(child)];\n\tremove$1(child);\n\tif (sibs.length === 0) return removeValuelessNodesFromChild(parent);\n\treturn true;\n}\n/**\n* Enumeate all siblings of `child`. This won't include `child` itself.\n* If `child` is not part of a tree (ie has no parent) no values are yielded.\n*/\nfunction* siblings$2(child, eq = isEqualDefault) {\n\tconst parent = child.parent;\n\tif (typeof parent === `undefined`) return;\n\tfor (const c of parent.childrenStore) {\n\t\tif (eq(c, child)) continue;\n\t\tyield c;\n\t}\n}\n/**\n* Depth-first iteration of the children of `node`\n* @param node\n*/\nfunction* depthFirst$3(node) {\n\tif (!root$2) return;\n\tconst stack = new StackMutable();\n\tstack.push(...node.childrenStore);\n\tlet entry = stack.pop();\n\twhile (entry) {\n\t\tyield entry;\n\t\tif (entry) stack.push(...entry.childrenStore);\n\t\tif (stack.isEmpty) break;\n\t\tentry = stack.pop();\n\t}\n}\n/**\n* Breadth-first iteration of the children of `node`\n* @param node\n*/\nfunction* breadthFirst$2(node) {\n\tif (!node) return;\n\tconst queue = new QueueMutable();\n\tqueue.enqueue(...node.childrenStore);\n\tlet entry = queue.dequeue();\n\twhile (entry) {\n\t\tyield entry;\n\t\tif (entry) queue.enqueue(...entry.childrenStore);\n\t\tif (queue.isEmpty) break;\n\t\tentry = queue.dequeue();\n\t}\n}\n/**\n* Validates the tree from `root` downwards.\n* @param root\n* @param seen\n*/\nfunction treeTest(root, seen = []) {\n\tif (root.parent === root) return [\n\t\tfalse,\n\t\t`Root has itself as parent`,\n\t\troot\n\t];\n\tif (seen.includes(root)) return [\n\t\tfalse,\n\t\t`Same node instance is appearing further in tree`,\n\t\troot\n\t];\n\tseen.push(root);\n\tif (containsDuplicateInstances(root.childrenStore)) return [\n\t\tfalse,\n\t\t`Children list contains duplicates`,\n\t\troot\n\t];\n\tfor (const c of root.childrenStore) {\n\t\tif (c.parent !== root) return [\n\t\t\tfalse,\n\t\t\t`Member of childrenStore does not have .parent set`,\n\t\t\tc\n\t\t];\n\t\tif (hasAnyChild$1(root, c)) return [\n\t\t\tfalse,\n\t\t\t`Child has parent as its own child`,\n\t\t\tc\n\t\t];\n\t\tconst v = treeTest(c, seen);\n\t\tif (!v[0]) return v;\n\t}\n\treturn [\n\t\ttrue,\n\t\t``,\n\t\troot\n\t];\n}\n/**\n* Throws an exception if `root` fails tree validation\n* @param root\n*/\nfunction throwTreeTest(root) {\n\tconst v = treeTest(root);\n\tif (v[0]) return;\n\tthrow new Error(`${v[1]} Node: ${toStringAbbreviate(v[2].value, 30)}`, { cause: v[2] });\n}\n/**\n* Iterate over direct children of `root`, yielding {@link TreeNode} instances.\n* Use {@link childrenValues} to iterate over child values\n* @param root\n*/\nfunction* children$2(root) {\n\tfor (const c of root.childrenStore) yield c;\n}\n/**\n* Iterate over the value of direct children of `root`.\n* Use {@link children} if you want to iterate over {@link TreeNode} instances instead.\n* @param root\n*/\nfunction* childrenValues(root) {\n\tfor (const c of root.childrenStore) if (typeof c.value !== `undefined`) yield c.value;\n}\n/**\n* Iterate over all parents of `child`. First result is the immediate parent.\n* @param child\n*/\nfunction* parents$1(child) {\n\tlet p = child.parent;\n\twhile (p) {\n\t\tyield p;\n\t\tp = p.parent;\n\t}\n}\n/**\n* Returns the depth of `node`. A root node (ie. with no parents) has a depth of 0.\n* @param node\n*/\nfunction nodeDepth(node) {\n\treturn [...parents$1(node)].length;\n}\n/**\n* Returns _true_ if `child` is an immediate child of `parent`.\n* @param child\n* @param parent\n* @param eq Equality function to compare nodes. Uses `isEqualDefault` by default, which compares by reference.\n*/\nfunction hasChild$1(child, parent, eq = isEqualDefault) {\n\tfor (const c of parent.childrenStore) if (eq(c, child)) return true;\n\treturn false;\n}\n/**\n* Returns the first immediate child of `parent` that matches `value`.\n*\n* Use {@link queryByValue} if you want all matching children.\n* @param value\n* @param parent\n* @param eq\n*/\nfunction findChildByValue$1(value, parent, eq = isEqualDefault) {\n\tfor (const c of parent.childrenStore) if (eq(value, c.value)) return c;\n}\n/**\n* Yield all immediate children of `parent` that match `value`.\n*\n* Use {@link findChildByValue} if you only want the first matching child.\n* @param value\n* @param parent\n* @param eq\n*/\nfunction* queryByValue(value, parent, eq = isEqualDefault) {\n\tfor (const c of parent.childrenStore) if (eq(value, c.value)) yield c;\n}\n/**\n* Returns _true_ if `prospectiveChild` is some child node of `parent`,\n* anywhere in the tree structure.\n*\n* Use {@link hasChild} to only check immediate children.\n* @param prospectiveChild\n* @param parent\n*/\nfunction hasAnyChild$1(prospectiveChild, parent) {\n\tfor (const c of breadthFirst$2(parent)) if (c === prospectiveChild) return true;\n\treturn false;\n}\n/**\n* Using a breadth-first search, return the first child of `parent` that has `value`.\n* @param value Value being sought\n* @param parent Parent node\n* @param eq Equality function to compare values. Uses `isEqualDefault` by default, which compares by reference.\n*/\nfunction findAnyChildByValue$2(value, parent, eq = isEqualDefault) {\n\tfor (const c of breadthFirst$2(parent)) if (eq(c.value, value)) return c;\n}\n/**\n* Traverses up a node to find the root.\n* @param node\n*/\nfunction getRoot(node) {\n\tif (node.parent) return getRoot(node.parent);\n\treturn node;\n}\n/**\n* Returns _true_ if `prospectiveParent` is any ancestor\n* parent of `child`.\n*\n* Use {@link hasParent} to only check immediate parent.\n* @param child\n* @param prospectiveParent\n*/\nfunction hasAnyParent$1(child, prospectiveParent) {\n\tfor (const p of parents$1(child)) if (p === prospectiveParent) return true;\n\treturn false;\n}\n/**\n* Yields the node value of each parent of `child`.\n* _undefined_ values are not returned.\n*\n* Use {@link queryParentsValue} to search for a particular value\n* @param child\n*/\nfunction* parentsValues(child) {\n\tfor (const p of parents$1(child)) if (typeof p.value !== `undefined`) yield p.value;\n\treturn false;\n}\n/**\n* Yields all parents of `child` that have a given value.\n* Use {@link findParentsValue} to find the first match only.\n* @param child\n* @param value\n* @param eq\n*/\nfunction* queryParentsValue(child, value, eq = isEqualDefault) {\n\tfor (const p of parents$1(child)) if (typeof p.value !== `undefined`) {\n\t\tif (eq(p.value, value)) yield p;\n\t}\n\treturn false;\n}\n/**\n* Returns the first parent that has a given value.\n* @param child\n* @param value\n* @param eq\n*/\nfunction findParentsValue(child, value, eq = isEqualDefault) {\n\treturn [...queryParentsValue(child, value, eq)][0];\n}\n/**\n* Returns _true_ if `prospectiveParent` is the immediate\n* parent of `child`.\n*\n* Use {@link hasAnyParent} to check for any ancestor parent.\n* @param child\n* @param prospectiveParent\n*/\nfunction hasParent$1(child, prospectiveParent) {\n\treturn child.parent === prospectiveParent;\n}\n/**\n* Computes the maximum depth of the tree.\n* That is, how many steps down from `node` it can go.\n* If a tree is: root -> childA -> subChildB\n* ```js\n* // Yields 2, since there are at max two steps down from root\n* computeMaxDepth(root);\n* ```\n* @param node\n*/\nfunction computeMaxDepth(node) {\n\treturn computeMaxDepthImpl(node, 0);\n}\nfunction computeMaxDepthImpl(node, startingDepth = 0) {\n\tlet depth = startingDepth;\n\tfor (const c of node.childrenStore) depth = Math.max(depth, computeMaxDepthImpl(c, startingDepth + 1));\n\treturn depth;\n}\n/**\n* Adds a child node to `parent`.\n* If `child` already has a parent, it is removed from that parent.\n* @param child\n* @param parent\n* @throws Error if adding a child would break tree structure\n*/\nfunction add(child, parent) {\n\tthrowAttemptedChild(child, parent);\n\tconst p = child.parent;\n\tparent.childrenStore = [...parent.childrenStore, child];\n\tchild.parent = parent;\n\tif (p) p.childrenStore = without(p.childrenStore, child);\n}\n/**\n* Adds a new child node based on a value\n*/\nfunction addValue(value, parent) {\n\treturn createNode$1(value, parent);\n}\n/**\n* Creates the root for a tree, with an optional `value`.\n* Use {@link rootWrapped} if you want a more object-oriented mode of access.\n* @param value\n*/\nfunction root$2(value) {\n\treturn createNode$1(value);\n}\nfunction fromPlainObject(value, label = ``, parent, seen = []) {\n\tconst entries = Object.entries(value);\n\tparent = parent === void 0 ? root$2() : addValue({\n\t\tlabel,\n\t\tvalue\n\t}, parent);\n\tfor (const entry of entries) {\n\t\tconst value = entry[1];\n\t\tif (seen.includes(value)) continue;\n\t\tseen.push(value);\n\t\tif (typeof entry[1] === `object`) fromPlainObject(value, entry[0], parent, seen);\n\t\telse addValue({\n\t\t\tlabel: entry[0],\n\t\t\tvalue\n\t\t}, parent);\n\t}\n\treturn parent;\n}\n/**\n* Creates a tree, returning it as a {@link WrappedNode} for object-oriented access.\n* Use {@link Trees.Mutable.root} alternatively.\n* @param value\n*/\nfunction rootWrapped$1(value) {\n\treturn wrap$1(createNode$1(value));\n}\n/**\n* Creates a `TreeNode` instance with a given value and parent.\n* Parent node, if specified, has its `childrenStore` property changed to include new child.\n* @param value\n* @param parent\n*/\nfunction createNode$1(value, parent) {\n\tconst n = {\n\t\tchildrenStore: [],\n\t\tparent,\n\t\tvalue\n\t};\n\tif (parent !== void 0) parent.childrenStore = [...parent.childrenStore, n];\n\treturn n;\n}\nfunction childrenLength$1(node) {\n\treturn node.childrenStore.length;\n}\nfunction value(node) {\n\treturn node.value;\n}\n/**\n* Projects `node` as a dynamic traversable.\n* Dynamic in the sense that it creates the traversable project for nodes on demand.\n* A consequence is that node identities are not stable.\n* @param node\n*/\nfunction asDynamicTraversable$1(node) {\n\treturn {\n\t\t*children() {\n\t\t\tfor (const c of node.childrenStore) yield asDynamicTraversable$1(c);\n\t\t},\n\t\tgetParent() {\n\t\t\tif (node.parent === void 0) return;\n\t\t\treturn asDynamicTraversable$1(node.parent);\n\t\t},\n\t\tgetValue() {\n\t\t\treturn node.value;\n\t\t},\n\t\tgetIdentity() {\n\t\t\treturn node;\n\t\t}\n\t};\n}\n/**\n* Throws an error if:\n* 1. `child` is the same node as `parent`\n* 2. `child` is already an immediate child of `parent`\n* 3. `child` is an ancestor parent of `parent`\n* 4. `child` has `parent` as its own child\n* @param c\n* @param parent\n*/\nfunction throwAttemptedChild(c, parent) {\n\tif (parent === c) throw new Error(`Cannot add self as child`);\n\tif (c.parent === parent) return;\n\tif (hasAnyParent$1(parent, c)) throw new Error(`Child contains parent (1)`, { cause: c });\n\tif (hasAnyParent$1(c, parent)) throw new Error(`Parent already contains child`, { cause: c });\n\tif (hasAnyChild$1(parent, c)) throw new Error(`Child contains parent (2)`, { cause: c });\n}\n/**\n* Sets the children of `parent` to a list of `children`.\n*\n* Any previous children are disconnected from this parent.\n* All new children have their parent set to `parent`.\n*\n* There is some validation to ensure that adding the children doesn't break the tree.\n*/\nfunction setChildren(parent, children) {\n\tfor (const c of children) throwAttemptedChild(c, parent);\n\tparent.childrenStore = [...children];\n\tfor (const c of children) c.parent = parent;\n}\nfunction toStringDeep$4(node, indent = 0) {\n\tconst t = `${` `.repeat(indent)} + ${node.value ? JSON.stringify(node.value) : `-`}`;\n\treturn node.childrenStore.length > 0 ? `${t}\\n${node.childrenStore.map((d) => toStringDeep$4(d, indent + 1)).join(`\\n`)}` : t;\n}\nfunction* followValue$1(root, continuePredicate, depth = 1) {\n\tfor (const c of root.childrenStore) {\n\t\tconst value = c.value;\n\t\tif (value === void 0) continue;\n\t\tif (continuePredicate(value, depth)) {\n\t\t\tyield c.value;\n\t\t\tyield* followValue$1(c, continuePredicate, depth + 1);\n\t\t}\n\t}\n}\n//#endregion\n//#region src/tree/traverse-object.ts\nvar traverse_object_exports = /* @__PURE__ */ __exportAll({\n\tasDynamicTraversable: () => asDynamicTraversable,\n\tchildren: () => children$1,\n\tcreate: () => create$1,\n\tcreateSimplified: () => createSimplified,\n\tcreateWrapped: () => createWrapped,\n\tdepthFirst: () => depthFirst$2,\n\tgetByPath: () => getByPath,\n\tprettyPrint: () => prettyPrint,\n\tprettyPrintEntries: () => prettyPrintEntries,\n\ttoStringDeep: () => toStringDeep$3,\n\ttraceByPath: () => traceByPath\n});\n/**\n* Helper function to get a 'friendly' string representation of an array of {@link TraverseObjectEntry}.\n* @param entries \n* @returns \n*/\nfunction prettyPrintEntries(entries) {\n\tif (entries.length === 0) return `(empty)`;\n\tlet t = ``;\n\tfor (const [index, entry] of entries.entries()) {\n\t\tt += ` `.repeat(index);\n\t\tt += entry.name + ` = ` + JSON.stringify(entry.leafValue) + `\\n`;\n\t}\n\treturn t;\n}\n/**\n* Returns a human-friendly debug string for a tree-like structure\n* ```js\n* console.log(Trees.prettyPrint(obj));\n* ```\n* @param indent\n* @param node\n* @param options\n* @returns\n*/\nconst prettyPrint = (node, indent = 0, options = {}) => {\n\tresultThrow(nullUndefTest(node, `node`));\n\tconst entry = getNamedEntry(node, options.name ?? `node`);\n\tconst t = `${` `.repeat(indent)} + name: ${entry.name} value: ${JSON.stringify(entry.leafValue)}`;\n\tconst childrenAsArray = [...children$1(node, options)];\n\treturn childrenAsArray.length > 0 ? t + `\\n` + childrenAsArray.map((d) => prettyPrint(d.leafValue, indent + 1, {\n\t\t...options,\n\t\tname: d.name\n\t})).join(`\\n`) : t;\n};\n/**\n* Returns a debug string representation of the node (recursive)\n* @param node \n* @param indent \n* @returns \n*/\nconst toStringDeep$3 = (node, indent = 0) => {\n\tlet t = ` `.repeat(indent) + ` ${node.value?.name}`;\n\tif (node.value !== void 0) {\n\t\tif (`sourceValue` in node.value && `leafValue` in node.value) {\n\t\t\tlet sourceValue = toStringAbbreviate(node.value.sourceValue, 20);\n\t\t\tconst leafValue = toStringAbbreviate(node.value.leafValue, 20);\n\t\t\tsourceValue = sourceValue === leafValue ? `` : `source: ` + sourceValue;\n\t\t\tt += ` = ${leafValue} ${sourceValue}`;\n\t\t} else if (`sourceValue` in node.value && node.value.sourceValue !== void 0) t += ` = ${node.value.sourceValue}`;\n\t\tif (`ancestors` in node.value) t += ` (ancestors: ${node.value.ancestors.join(`, `)})`;\n\t}\n\tt += `\\n`;\n\tfor (const c of node.childrenStore) t += toStringDeep$3(c, indent + 1);\n\treturn t;\n};\n/**\n* Yields the direct (ie. non-recursive) children of a tree-like object as a pairing\n* of node name and value. Supports basic objects, Maps and arrays.\n* \n* To iterate recursively, consider {@link depthFirst}\n* \n* Each child is returned in an {@link TraverseObjectEntry} structure:\n* ```typescript\n* type Entry = Readonly<{\n* // Property name\n* name: string, \n* // Value of property, as if you called `object[propertyName]`\n* sourceValue: any,\n* // Branch nodes will have _undefined_, leaf nodes will contain the value\n* leafValue: any \n* }>;\n* ```\n* \n* For example, iterating over a flat object:\n* ```js\n* const verySimpleObject = { field: `hello`, flag: true }\n* const kids = [ ...children(verySimpleObject) ];\n* // Yields:\n* // [ { name: \"field\", sourceValue: `hello`, leafValue: `hello` },\n* // { name: \"flag\", sourceValue: true, leafValue: true } ]\n* ```\n* \n* For objects containing objects:\n* ```js\n* const lessSimpleObject = { field: `hello`, flag: true, colour: { `red`, opacity: 0.5 } }\n* const kids = [ ...children(verySimpleObject) ];\n* // Yields as before, plus:\n* // { name: \"colour\", sourceValue: { name: 'red', opacity: 0.5 }, leafValue: undefined }\n* ```\n* \n* Note that 'sourceValue' always contains the property value, as if you \n* access it via `object[propName]`. 'leafValue' only contains the value if it's a leaf\n* node.\n* \n* Arrays are assigned a name based on index.\n* @example Arrays\n* ```js\n* const colours = [ { r: 1, g: 0, b: 0 }, { r: 0, g: 1, b: 0 }, { r: 0, g: 0, b: 1 } ];\n* // Children: \n* // [\n* // { name: \"array[0]\", value: {r:1,g:0,b:0} },\n* // { name: \"array[1]\", value: {r:0,g:1,b:0} },\n* // { name: \"array[2]\", value: {r:0,g:0,b:1} },\n* // ]\n* ```\n* \n* Pass in `options.name` (eg 'colours') to have names generated as 'colours[0]', etc.\n* Options can also be used to filter children. By default all direct children are returned.\n* @param node \n* @param options \n*/\nfunction* children$1(node, options = {}) {\n\tresultThrow(nullUndefTest(node, `node`));\n\tconst filteringOption = options.filter ?? `none`;\n\tconst filterByValue = (v) => {\n\t\tif (filteringOption === `none`) return [true, isPrimitive(v)];\n\t\telse if (filteringOption === `leaves` && isPrimitive(v)) return [true, true];\n\t\telse if (filteringOption === `branches` && !isPrimitive(v)) return [true, false];\n\t\treturn [false, isPrimitive(v)];\n\t};\n\tif (Array.isArray(node)) for (const [index, element] of node.entries()) {\n\t\tconst f = filterByValue(element);\n\t\tif (f[0]) yield {\n\t\t\tname: index.toString(),\n\t\t\t_kind: `entry`,\n\t\t\tsourceValue: element,\n\t\t\tleafValue: f[1] ? element : void 0\n\t\t};\n\t}\n\telse if (typeof node === `object`) {\n\t\tconst entriesIter = `entries` in node ? node.entries() : Object.entries(node);\n\t\tfor (const [name, value] of entriesIter) {\n\t\t\tconst [filter, isPrimitive] = filterByValue(value);\n\t\t\tif (filter) yield {\n\t\t\t\tname,\n\t\t\t\t_kind: `entry`,\n\t\t\t\tsourceValue: value,\n\t\t\t\tleafValue: isPrimitive ? value : void 0\n\t\t\t};\n\t\t}\n\t}\n}\nfunction* depthFirst$2(node, options = {}, ancestors = []) {\n\tfor (const c of children$1(node, options)) {\n\t\tyield {\n\t\t\t...c,\n\t\t\tancestors: [...ancestors],\n\t\t\t_kind: `entry-ancestors`\n\t\t};\n\t\tyield* depthFirst$2(c.sourceValue, options, [...ancestors, c.name]);\n\t}\n}\n/**\n* Finds a given direct child by name\n* @param name\n* @param node\n* @returns\n*/\nfunction childByName(name, node) {\n\tfor (const d of children$1(node)) if (d.name === name) return d;\n}\n/**\n* Returns the closest matching entry, tracing `path` in an array, Map or simple object.\n* Returns an entry with _undefined_ value at the point where tracing stopped.\n* Use {@link traceByPath} to step through all the segments.\n*\n* ```js\n* const people = {\n* jane: {\n* address: {\n* postcode: 1000,\n* street: 'West St',\n* city: 'Blahville'\n* },\n* colour: 'red'\n* }\n* }\n* Trees.getByPath('jane.address.postcode', people); // '.' default separator\n* // ['postcode', 1000]\n* Trees.getByPath('jane.address.country.state', people);\n* // ['country', undefined] - since full path could not be resolved.\n* ```\n* @param path Path, eg `jane.address.postcode`\n* @param node Node to look within\n* @param options Options for parsing path. By default '.' is used as a separator\n* @returns\n*/\nfunction getByPath(path, node, options = {}) {\n\tconst v = last(traceByPath(path, node, options));\n\tif (!v) throw new Error(`Could not trace path: ${path} `);\n\treturn v;\n}\n/**\n* Enumerates over children of `node` towards the node named in `path`.\n* This is useful if you want to get the interim steps to the target node.\n* \n* Use {@link getByPath} if you don't care about interim steps.\n*\n* ```js\n* const people = {\n* jane: {\n* address: {\n* postcode: 1000,\n* street: 'West St',\n* city: 'Blahville'\n* },\n* colour: 'red'\n* }\n* }\n* for (const p of Trees.traceByPath('jane.address.street', people)) {\n* // { name: \"jane\", value: { address: { postcode: 1000,street: 'West St', city: 'Blahville' }, colour: 'red'} },\n* // { name: \"address\", value: { postcode: 1000, street: 'West St', city: 'Blahville' } },\n* // { name: \"street\", value: \"West St\" } }\n* }\n* ```\n*\n* Results stop when the path can't be followed any further.\n* The last entry will have a name of the last sought path segment, and _undefined_ as its value.\n* \n* @param path Path to traverse\n* @param node Starting node\n* @param options Options for path traversal logic\n* @returns\n*/\nfunction* traceByPath(path, node, options = {}) {\n\tresultThrow(nullUndefTest(path, `path`), nullUndefTest(node, `node`));\n\tconst separator = options.separator ?? `.`;\n\tconst pathSplit = path.split(separator);\n\tconst ancestors = [];\n\tfor (const p of pathSplit) {\n\t\tconst entry = childByName(p, node);\n\t\tif (!entry) {\n\t\t\tyield {\n\t\t\t\tname: p,\n\t\t\t\tsourceValue: void 0,\n\t\t\t\tleafValue: void 0,\n\t\t\t\tancestors,\n\t\t\t\t_kind: `entry-ancestors`\n\t\t\t};\n\t\t\treturn;\n\t\t}\n\t\tnode = entry.sourceValue;\n\t\tyield {\n\t\t\t...entry,\n\t\t\tancestors: [...ancestors],\n\t\t\t_kind: `entry-ancestors`\n\t\t};\n\t\tancestors.push(p);\n\t}\n}\n/**\n* Returns a projection of `node` as a dynamic traversable.\n* This means that the tree structure is dynamically created as last-minute as possible.\n* \n* The type when calling `getValue()` is {@link TraverseObjectEntryStatic}:\n* ```typescript\n* type EntryStatic = Readonly<{ \n* name: string,\n* value: any\n* ancestors: string[] \n* }>\n* ```\n* \n* Note that the object identity of TraversableTree return results is not stable.\n* This is because they are created on-the-fly by reading fields of `node`.\n* \n* ```js\n* const c1 = [ ...asDynamicTraversable(someObject).children() ];\n* const c2 = [ ...asDynamicTraversable(someObject).children() ];\n* \n* // Object identity is not the same\n* c1[ 0 ] === c1[ 0 ]; // false\n* \n* // ...even though its referring to the same value\n* c1[ 0 ].getValue() === c1[ 0 ].getValue(); // true\n* ```\n* \n* Instead .getIdentity() to get a stable identity:\n* ```js\n* c1[ 0 ].getIdentity() === c2[ 0 ].getIdentity(); // true\n* ```\n* \n* @example\n* ```js\n* const myObj = { name: `Pedro`, size: 45, colour: `orange` };\n* const root = Trees.FromObject.asDynamicTraversable(myObj);\n* for (const v of Trees.Traverse.breadthFirst(root)) {\n* // v.getValue() yields:\n* // { name: 'name', sourceValue: 'Pedro' ...}, \n* // { name: 'size', sourceValue: 45 ... }\n* // ...\n* }\n* ```\n* @param node Object to read\n* @param options Options when creating traversable\n* @param ancestors Do not use\n* @param parent Do not use\n* @returns \n*/\nconst asDynamicTraversable = (node, options = {}, ancestors = [], parent) => {\n\tconst name = options.name ?? `object`;\n\tconst t = {\n\t\t*children() {\n\t\t\tfor (const { name: childName, sourceValue, leafValue } of children$1(node, options)) yield asDynamicTraversable(sourceValue, {\n\t\t\t\t...options,\n\t\t\t\tname: childName\n\t\t\t}, [...ancestors, name], t);\n\t\t},\n\t\tgetParent() {\n\t\t\treturn parent;\n\t\t},\n\t\tgetValue() {\n\t\t\treturn {\n\t\t\t\tname,\n\t\t\t\tsourceValue: node,\n\t\t\t\tancestors,\n\t\t\t\t_kind: `entry-static`\n\t\t\t};\n\t\t},\n\t\tgetIdentity() {\n\t\t\treturn node;\n\t\t}\n\t};\n\treturn t;\n};\n/**\n* Reads all fields and sub-fields of `node`, returning as a 'wrapped' tree structure.\n* Is a snapshot of `node`, and won't update if it mutates.\n* @param node \n* @param options \n* @returns \n*/\nconst createWrapped = (node, options) => {\n\treturn wrap$1(create$1(node, options));\n};\n/**\n* Reads all fields and sub-fields of `node`, returning as a basic tree structure.\n* The structure is a snapshot of the object. If the object changes afterwards, the tree will\n* remain the same.\n* \n* Alternatively, consider {@link asDynamicTraversable} which reads the object dynamically.\n* @example\n* ```js\n* const myObj = { name: `Pedro`, size: 45, colour: `orange` };\n* const root = Trees.FromObject.create(myObj);\n* for (const v of Trees.Traverse.breadthFirst(root)) {\n* // v.getValue() yields:\n* // { name: 'name', sourceValue: 'Pedro' ...}, \n* // { name: 'size', sourceValue: 45 ... }\n* // ...\n* }\n* ```\n* @param node \n* @param options \n* @returns \n*/\nconst create$1 = (node, options = {}) => {\n\treturn createImpl(node, (options.valuesAtLeaves ?? false ? (v) => {\n\t\tif (isPrimitive(v)) return v;\n\t} : (v) => v)(node), options, []);\n};\nconst createImpl = (sourceValue, leafValue, options = {}, ancestors) => {\n\tconst defaultName = options.name ?? `object_ci`;\n\tconst r = root$2({\n\t\tname: defaultName,\n\t\tsourceValue: leafValue,\n\t\tancestors: [...ancestors],\n\t\t_kind: `entry-static`\n\t});\n\tancestors = [...ancestors, defaultName];\n\tfor (const c of children$1(sourceValue, options)) {\n\t\tconst v = options.valuesAtLeaves ? c.leafValue : c.sourceValue;\n\t\tadd(createImpl(c.sourceValue, v, {\n\t\t\t...options,\n\t\t\tname: c.name\n\t\t}, ancestors), r);\n\t}\n\treturn r;\n};\n/**\n* Returns a copy of `node` with its (and all its childrens') parent information removed.\n* \n* Under the hood:\n* ```js\n* TreeArrayBacked.stripParentage(create(node, options));\n* ```\n* @param node \n* @param options \n* @returns \n*/\nconst createSimplified = (node, options = {}) => {\n\treturn stripParentage(create$1(node, options));\n};\n/**\n* Generates a name for a node.\n* Uses the 'name' property if it exists, otherwise uses `defaultName`\n* @param node\n* @param defaultName\n* @returns\n*/\nfunction getNamedEntry(node, defaultName = ``) {\n\tif (`name` in node && `leafValue` in node && `sourceValue` in node) return {\n\t\tname: node.name,\n\t\t_kind: `entry`,\n\t\tleafValue: node.leafValue,\n\t\tsourceValue: node.sourceValue\n\t};\n\tif (`name` in node) return {\n\t\tname: node.name,\n\t\tleafValue: node,\n\t\tsourceValue: node,\n\t\t_kind: `entry`\n\t};\n\treturn {\n\t\tname: defaultName,\n\t\tleafValue: node,\n\t\tsourceValue: node,\n\t\t_kind: `entry`\n\t};\n}\n//#endregion\n//#region src/tree/labelled.ts\nfunction isSingleValue(v) {\n\tif (`value` in v) return true;\n\treturn false;\n}\nfunction isMultiValue(v) {\n\tif (`values` in v) return Array.isArray(v.values);\n\treturn false;\n}\n//#endregion\n//#region src/tree/pathed.ts\nvar pathed_exports = /* @__PURE__ */ __exportAll({\n\tPathed: () => Pathed,\n\taddValueByPath: () => addValueByPath,\n\tchildren: () => children,\n\tchildrenLengthByPath: () => childrenLengthByPath,\n\tclearValuesByPath: () => clearValuesByPath,\n\tfindAnyChildByValue: () => findAnyChildByValue$1,\n\thasValue: () => hasValue,\n\tparent: () => parent,\n\tparentValues: () => parentValues,\n\tremoveValueByPath: () => removeValueByPath,\n\tsiblings: () => siblings$1,\n\tsiblingsValues: () => siblingsValues,\n\ttoStringDeep: () => toStringDeep$2,\n\tvalueByPath: () => valueByPath,\n\tvaluesByPath: () => valuesByPath\n});\n/**\n* Creates a wrapper for working with 'pathed' trees.\n* An example is a filesystem.\n*\n* ```js\n* const t = new Pathed();\n* // Store a value. Path implies a structure of\n* // c -> users -> admin\n* // ...which is automatically created\n* t.add({x:10}, `c.users.admin`);\n*\n* t.add({x:20}, `c.users.guest`);\n* // Tree will now be:\n* // c-> users -> admin\n* // -> guest\n*\n* t.getValue(`c.users.guest`); // { x:20 }\n* ```\n*\n* By default only a single value can be stored at a path.\n* Set options to allow this:\n* ```js\n* const t = new Pathed({ duplicates: `allow` });\n* t.add({x:10}, `c.users.admin`);\n* t.add({x:20}, `c.users.admin`);\n* t.getValue(`c.users.admin`); // Throws an error because there are multiple values\n* t.getValues(`c.users.admin`); // [ {x:10}, {x:20 } ]\n* ```\n* @param pathOpts\n* @returns\n*/\nvar Pathed = class {\n\t#root;\n\t#pathOpts;\n\t/**\n\t* Create, using default options\n\t* @param pathOpts\n\t*/\n\tconstructor(pathOpts = {}) {\n\t\tthis.#pathOpts = {\n\t\t\tseparator: `.`,\n\t\t\tstartsWithSeparator: false,\n\t\t\tduplicates: `overwrite`,\n\t\t\t...pathOpts\n\t\t};\n\t}\n\t/**\n\t* Adds a value at the string path, automatically creating intermediate nodes as needed.\n\t* By default, if a value already exists at the path, it will be overwritten. Set options to change this.\n\t* @param value Value to associate with path\n\t* @param path Path\n\t*/\n\tadd(value, path) {\n\t\tthrowIfFailed(this.validate(path));\n\t\tconst n = addValueByPath(value, path, this.#pathOpts, this.#root);\n\t\tif (this.#root === void 0) this.#root = getRoot(n);\n\t}\n\tvalidate(path) {\n\t\tif (this.#pathOpts.startsWithSeparator && !path.startsWith(this.#pathOpts.separator)) return {\n\t\t\tsuccess: false,\n\t\t\terror: `Path must start with separator when 'startsWithSeparator' is enabled. Got: ${path}`\n\t\t};\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tvalue: path\n\t\t};\n\t}\n\t/**\n\t* Returns a string representation of tree\n\t* @returns Returns a string representation of tree\n\t*/\n\tprettyPrint() {\n\t\tif (this.#root === void 0) return `(empty)`;\n\t\treturn toStringDeep$4(this.#root);\n\t}\n\t/**\n\t* Removes the value at the given path, returning _true_\n\t* if there was a value. This will delete tree nodes if they become empty\n\t* @param path\n\t* @returns _true_ if value was removed\n\t*/\n\tremove(path) {\n\t\tthrowIfFailed(this.validate(path));\n\t\tif (this.#root === void 0) return false;\n\t\treturn removeValueByPath(path, this.#root, this.#pathOpts);\n\t}\n\t/**\n\t* Returns _true_ if we have a value at `path`\n\t* @param path\n\t* @returns _true_ if value exists at path\n\t*/\n\thasPath(path) {\n\t\tthrowIfFailed(this.validate(path));\n\t\tif (this.#root === void 0) return false;\n\t\treturn findChildByPath(path, this.#root, this.#pathOpts) !== void 0;\n\t}\n\t/**\n\t* Returns a tree node for a given path, or _undefined_\n\t* if path does not exist.\n\t*\n\t* Use {@link getValue} to get the value at a node instead.\n\t* @param path\n\t* @returns The tree node for the given path, or _undefined_ if not found\n\t*/\n\tgetNode(path) {\n\t\tthrowIfFailed(this.validate(path));\n\t\tif (this.#root === void 0) return;\n\t\treturn findChildByPath(path, this.#root, this.#pathOpts);\n\t}\n\t/**\n\t* Returns the value at the path, or _undefined_ if path is not found.\n\t* Use {@link getNode} to get the tree node instead.\n\t* @param path\n\t* @returns The value at the path, or _undefined_ if path is not found\n\t*/\n\tgetValue(path) {\n\t\tthrowIfFailed(this.validate(path));\n\t\tif (this.#root === void 0) return;\n\t\treturn valueByPath(path, this.#root, this.#pathOpts);\n\t}\n\t/**\n\t* Gets the containing path to `node`. If _includeNode_ is true, we also include the\n\t* node's own label.\n\t*/\n\tgetPath(node, includeNode) {\n\t\tif (this.#root === void 0) return ``;\n\t\tconst segments = [];\n\t\tif (includeNode && node.value) segments.push(node.value?.label);\n\t\tfor (const p of parentValues(node)) segments.unshift(p.label);\n\t\tlet path = segments.join(this.#pathOpts.separator);\n\t\tif (this.#pathOpts.startsWithSeparator) {\n\t\t\tif (!path.startsWith(this.#pathOpts.separator)) path = this.#pathOpts.separator + path;\n\t\t\tif (!path.endsWith(this.#pathOpts.separator) && (node.childrenStore.length > 0 || !includeNode)) path += this.#pathOpts.separator;\n\t\t}\n\t\treturn path;\n\t}\n\t/**\n\t* Gets the number of children at a given path.\n\t* Returns NaN if path does not exist or has no children.\n\t* @param path\n\t* @returns The number of children at the path, or NaN if path is not found\n\t*/\n\tchildrenLength(path) {\n\t\tthrowIfFailed(this.validate(path));\n\t\tif (this.#root === void 0) return NaN;\n\t\tconst c = findChildByPath(path, this.#root, this.#pathOpts);\n\t\tif (c === void 0) return NaN;\n\t\treturn c.childrenStore.length;\n\t}\n\t/**\n\t* Get all the values stored at a path, if multiple values are allowed. Returns an empty array if path does not exist or has no value.\n\t* @param path\n\t* @returns An array of values at the path, or an empty array if path is not found\n\t*/\n\tgetValues(path) {\n\t\tthrowIfFailed(this.validate(path));\n\t\tif (this.#root === void 0) return void 0;\n\t\treturn valuesByPath(path, this.#root, this.#pathOpts);\n\t}\n\t/**\n\t* Removes all values at the given path, but leaves the structure of the tree intact. Returns _true_ if there was a value to clear.\n\t* @param path\n\t* @returns _true_ if there was a value to clear at the path\n\t*/\n\tclearValues(path) {\n\t\tthrowIfFailed(this.validate(path));\n\t\tif (this.#root === void 0) return false;\n\t\treturn clearValuesByPath(path, this.#root, this.#pathOpts);\n\t}\n\t/**\n\t* Iterate all children of this path\n\t*/\n\t*children(path) {\n\t\tthrowIfFailed(this.validate(path));\n\t\tif (this.#root === void 0) return;\n\t\tyield* children(path, this.#root, this.#pathOpts);\n\t}\n\t/**\n\t* Iterate all siblings of this path\n\t*/\n\t*siblings(path) {\n\t\tthrowIfFailed(this.validate(path));\n\t\tif (this.#root === void 0) return;\n\t\tyield* siblings$1(path, this.#root, this.#pathOpts);\n\t}\n\t/**\n\t* Iterate all siblings of this path\n\t*/\n\t*siblingsValues(path) {\n\t\tthrowIfFailed(this.validate(path));\n\t\tif (this.#root === void 0) return;\n\t\tyield* siblingsValues(path, this.#root, this.#pathOpts);\n\t}\n\t/**\n\t* Returns the parent node of `path`, or _undefined_ if not found or at root.\n\t*/\n\tparent(path) {\n\t\tthrowIfFailed(this.validate(path));\n\t\tif (this.#root === void 0) return;\n\t\treturn parent(path, this.#root, this.#pathOpts);\n\t}\n\tget separator() {\n\t\treturn this.#pathOpts.separator;\n\t}\n\t/**\n\t* Returns the root tree node.\n\t* @returns The root tree node, or _undefined_ if tree is empty\n\t*/\n\tget root() {\n\t\treturn this.#root;\n\t}\n};\n/**\n* Adds a value by a string path, with '.' as a the default delimiter\n* Automatically generates intermediate nodes.\n*\n* ```js\n* const root = addValueByPath({}, 'c');\n* addValueByPath({x:'blah'}, 'c.users.admin', root);\n* ```\n*\n* Creates the structure:\n* ```\n* c value: { } label: c\n* + users value: undefined label: users\n* + admin value: { x: 'blah' } label: admin\n* ```\n*\n* By default, multiple values under same key are overwritten, with the most recent winning.\n* @param value Value to add\n* @param path Path to add at\n* @param node Node to insert\n* @param pathOpts Options\n*/\nfunction addValueByPath(value, path, pathOpts, node) {\n\tconst separator = pathOpts.separator;\n\tconst duplicatePath = pathOpts.duplicates;\n\tconst split = path.split(separator);\n\tlet count = 0;\n\tfor (const p of split) {\n\t\tconst lastEntry = count === split.length - 1;\n\t\tconst found = findChildByLabel(p, node);\n\t\tif (found === void 0) node = createNode$1({\n\t\t\tvalue: lastEntry ? value : void 0,\n\t\t\tlabel: p\n\t\t}, node);\n\t\telse {\n\t\t\tnode = found;\n\t\t\tif (lastEntry) switch (duplicatePath) {\n\t\t\t\tcase `ignore`: break;\n\t\t\t\tcase `allow`: {\n\t\t\t\t\tconst existing = getValuesFromNode(node);\n\t\t\t\t\tnode.value = {\n\t\t\t\t\t\tvalues: [...existing, value],\n\t\t\t\t\t\tlabel: p\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase `overwrite`:\n\t\t\t\t\tnode.value = {\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t\tlabel: p\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse node = found;\n\t\t}\n\t\tcount++;\n\t}\n\tif (node === void 0) throw new Error(`Could not create tree`);\n\treturn node;\n}\n/**\n* Removes the value at the given path, returning _true_ if there was something to remove.\n* @param node\n* @returns _true_ if something removed\n*/\nfunction isLabelledNodeEmpty(node) {\n\tif (node.value === void 0) return true;\n\tif (`values` in node.value) return node.value.values.length === 0;\n\tif (`value` in node.value) return node.value.value === void 0;\n\treturn true;\n}\nfunction pruneLabelledBranch(node) {\n\tif (node.childrenStore.length > 0) return;\n\tif (!isLabelledNodeEmpty(node)) return;\n\tconst parent = node.parent;\n\tif (!parent) return;\n\tremove$1(node);\n\tpruneLabelledBranch(parent);\n}\nfunction removeValueByPath(path, root, pathOpts) {\n\tif (root === void 0) return false;\n\tconst c = findChildByPath(path, root, pathOpts);\n\tif (c === void 0) return false;\n\tc.value = void 0;\n\tpruneLabelledBranch(c);\n\treturn true;\n}\nfunction clearValuesByPath(path, root, pathOpts) {\n\tif (root === void 0) return false;\n\tconst c = findChildByPath(path, root, pathOpts);\n\tif (c === void 0) return false;\n\tc.value = {\n\t\tlabel: c.value?.label ?? ``,\n\t\tvalue: void 0\n\t};\n\treturn true;\n}\n/**\n* Return the length of children of `path`, or NaN if path not found.\n*/\nfunction childrenLengthByPath(path, searchStart, pathOpts) {\n\tif (searchStart === void 0) return NaN;\n\tconst c = findChildByPath(path, searchStart, pathOpts);\n\tif (c === void 0) return NaN;\n\treturn c.childrenStore.length;\n}\n/**\n* Iterate over all the children of `path`\n*/\nfunction* children(path, searchStart, pathOpts) {\n\tif (searchStart === void 0) return;\n\tconst c = findChildByPath(path, searchStart, pathOpts);\n\tif (c === void 0) return;\n\tfor (const ch of c.childrenStore) yield ch;\n}\n/**\n* Iterate over all the siblings of `path`, excluding the node at `path` itself.\n* Yields LabelledNode instances, which allow you to traverse tree. If all you care about is the values, use {@link siblingsValues} instead.\n*/\nfunction* siblings$1(path, searchStart, pathOpts) {\n\tif (searchStart === void 0) return;\n\tconst c = findChildByPath(path, searchStart, pathOpts);\n\tif (c === void 0) return;\n\tconst parent = c.parent;\n\tif (parent === void 0) return;\n\tfor (const ch of parent.childrenStore) {\n\t\tif (ch === c) continue;\n\t\tif (typeof ch === `undefined`) throw new TypeError(`Unexpected undefined child node`);\n\t\tyield ch;\n\t}\n}\n/**\n* Iterate over the values of all the siblings of `path`, excluding the node at `path` itself. If you need to traverse tree, use {@link siblings} instead.\n* @param path\n* @param searchStart\n* @param pathOpts\n*/\nfunction* siblingsValues(path, searchStart, pathOpts) {\n\tfor (const s of siblings$1(path, searchStart, pathOpts)) {\n\t\tif (s.value === void 0) continue;\n\t\tyield s.value;\n\t}\n}\n/**\n* Return the parent node of `path`, or undefined if not found or at root.\n*/\nfunction parent(path, searchStart, pathOpts) {\n\tif (searchStart === void 0) return;\n\tconst c = findChildByPath(path, searchStart, pathOpts);\n\tif (c === void 0) return;\n\treturn c.parent;\n}\nfunction* parentValues(start) {\n\tfor (const p of parents$1(start)) {\n\t\tif (p.value === void 0) continue;\n\t\tyield p.value;\n\t}\n}\n/**\n* Searches direct children, returning the node that has the given `label`\n* @param label\n* @param node\n* @returns Child node, or _undefined_\n*/\nfunction findChildByLabel(label, node) {\n\tif (node === void 0) return void 0;\n\tif (label === void 0) throw new Error(`Parameter 'label' cannot be undefined`);\n\tif (node.value?.label === label) return node;\n\tfor (const c of node.childrenStore) if (c.value?.label === label) return c;\n}\n/**\n* Searches children, returning the node that has the given `value`.\n* @param value Value\n* @param node Node to start search from\n* @param maxDepth Maximum depth, defaults to full recursion\n* @param eq Equality function\n* @returns Child, or _undefined_ if not found\n*/\nfunction findAnyChildByValue$1(value, node, maxDepth = Number.MAX_SAFE_INTEGER, eq = isEqualValueDefault) {\n\tif (typeof node === `undefined`) throw new TypeError(`Param 'node' is undefined`);\n\tif (maxDepth <= 0) return;\n\tif (typeof value === `undefined`) throw new Error(`Param 'value' cannot be undefined`);\n\tfor (const c of node.childrenStore) if (hasValue(value, c, eq)) return c;\n\tfor (const c of node.childrenStore) {\n\t\tconst result = findAnyChildByValue$1(value, c, maxDepth - 1, eq);\n\t\tif (typeof result !== `undefined`) return result;\n\t}\n}\nfunction hasValue(value, node, eq = isEqualDefault) {\n\tif (typeof node.value === `undefined`) return false;\n\tif (isSingleValue(node.value)) {\n\t\tif (eq(node.value.value, value)) return true;\n\t} else if (isMultiValue(node.value)) {\n\t\tfor (const v of node.value.values) if (eq(v, value)) return true;\n\t}\n\treturn false;\n}\nfunction valueByPath(path, node, pathOpts = {}) {\n\tconst values = valuesByPath(path, node, pathOpts);\n\tif (typeof values === `undefined`) return;\n\tif (values.length === 0) return void 0;\n\tif (values.length > 1) throw new Error(`Multiple values at path. Use getValues instead`);\n\treturn values[0];\n}\nfunction getValuesFromNode(node) {\n\tif (node.value === void 0) return [];\n\tif (`values` in node.value) return node.value.values;\n\tif (`value` in node.value) {\n\t\tif (node.value.value === void 0) return [];\n\t\treturn [node.value.value];\n\t}\n\treturn [];\n}\nfunction findChildByPath(path, searchStart, pathOpts) {\n\tif (path.endsWith(pathOpts.separator) && pathOpts.startsWithSeparator) path = path.slice(0, -pathOpts.separator.length);\n\tconst split = path.split(pathOpts.separator);\n\tlet c = searchStart;\n\tfor (const p of split) {\n\t\tc = findChildByLabel(p, c);\n\t\tif (c === void 0) return;\n\t}\n\treturn c;\n}\nfunction valuesByPath(path, searchStart, pathOpts = {}) {\n\tconst separator = pathOpts.separator ?? `.`;\n\tconst split = path.split(separator);\n\tlet c = searchStart;\n\tfor (const p of split) {\n\t\tc = findChildByLabel(p, c);\n\t\tif (c === void 0) return;\n\t}\n\treturn getValuesFromNode(c);\n}\nfunction formatInspectValue(v) {\n\tif (v === void 0) return `undefined`;\n\tif (v === null) return `null`;\n\tif (typeof v === `string`) return `\"${v}\"`;\n\tif (typeof v === `number` || typeof v === `boolean`) return String(v);\n\tif (Array.isArray(v)) {\n\t\tif (v.length === 0) return `[]`;\n\t\treturn `[ ${v.map(formatInspectValue).join(`, `)} ]`;\n\t}\n\tif (typeof v === `object`) return `{ ${Object.entries(v).map(([k, val]) => `${k}: ${formatInspectValue(val)}`).join(`, `)} }`;\n\treturn String(v);\n}\n/**\n* Returns a string representation of a LabelledNode tree.\n* Format: `{ label: \"x\", value: ..., children: [...] }`\n*/\nfunction toStringDeep$2(node) {\n\tconst label = node.value?.label ?? `?`;\n\tconst innerValue = node.value === void 0 ? void 0 : `values` in node.value ? node.value.values : `value` in node.value ? node.value.value : void 0;\n\tconst children = node.childrenStore.map((c) => toStringDeep$2(c));\n\tconst childrenStr = children.length === 0 ? `[]` : `[ ${children.join(`, `)} ]`;\n\treturn `{ label: \"${label}\", value: ${formatInspectValue(innerValue)}, children: ${childrenStr} }`;\n}\n//#endregion\n//#region src/tree/traversable-tree.ts\nvar traversable_tree_exports = /* @__PURE__ */ __exportAll({\n\tbreadthFirst: () => breadthFirst$1,\n\tchildrenLength: () => childrenLength,\n\tcouldAddChild: () => couldAddChild,\n\tdepthFirst: () => depthFirst$1,\n\tfind: () => find$2,\n\tfindAnyChildByValue: () => findAnyChildByValue,\n\tfindAnyParentByValue: () => findAnyParentByValue,\n\tfindByValue: () => findByValue,\n\tfindChildByValue: () => findChildByValue,\n\tfindParentByValue: () => findParentByValue,\n\tfollowValue: () => followValue,\n\thasAnyChild: () => hasAnyChild,\n\thasAnyChildValue: () => hasAnyChildValue,\n\thasAnyParent: () => hasAnyParent,\n\thasAnyParentValue: () => hasAnyParentValue,\n\thasChild: () => hasChild,\n\thasChildValue: () => hasChildValue,\n\thasParent: () => hasParent,\n\thasParentValue: () => hasParentValue,\n\tparents: () => parents,\n\tsiblings: () => siblings,\n\ttoString: () => toString,\n\ttoStringDeep: () => toStringDeep$1\n});\n/**\n* Returns the number of children of `tree`.\n* Under the hood is just `[ ...tree.children() ].length`\n* @param tree \n* @returns \n*/\nconst childrenLength = (tree) => {\n\treturn [...tree.children()].length;\n};\n/**\n* Returns _true_ if `child` is parented at any level (grand-parented etc) by `possibleParent`\n* @param child Child being sought\n* @param possibleParent Possible parent of child\n* @param eq Equality comparison function {@link isEqualDefault} used by default\n* @returns\n*/\nconst hasAnyParent = (child, possibleParent, eq) => {\n\treturn hasParent(child, possibleParent, eq, Number.MAX_SAFE_INTEGER);\n};\n/**\n* Returns _true_ if `child` is parented at any level (grand-parented etc) by a parent with value `possibleParentValue`\n* @param child Child being sought\n* @param possibleParentValue Value of possible parent of child\n* @param eq Equality comparison function {@link isEqualDefault} used by default\n* @throws TypeError if `child` is undefined\n* @returns\n*/\nconst hasAnyParentValue = (child, possibleParentValue, eq) => {\n\tif (typeof child === `undefined`) throw new TypeError(`Param 'child' is undefined`);\n\treturn hasParentValue(child, possibleParentValue, eq, Number.MAX_SAFE_INTEGER);\n};\n/**\n* Returns any parent of `child` that has value `possibleParentValue`. Returns _undefined_ if not found.\n* @param child Child being sought\n* @param possibleParentValue Value of possible parent of child\n* @param eq Equality comparison function {@link isEqualDefault} used by default\n* @returns\n*/\nconst findAnyParentByValue = (child, possibleParentValue, eq) => {\n\treturn findParentByValue(child, possibleParentValue, eq, Number.MAX_SAFE_INTEGER);\n};\n/**\n* Returns _true_ if `child` exists within `possibleParent`. By default it only looks at the immediate\n* parent (maxDepth: 0). Use Number.MAX_SAFE_INTEGER for searching recursively upwards (or {@link hasAnyParent})\n* @param child Child being sought\n* @param possibleParent Possible parent of child\n* @param maxDepth Max depth of traversal. Default of 0 only looks for immediate parent.\n* @param eq Equality comparison function. {@link isEqualDefault} used by default.\n* @returns\n*/\nconst hasParent = (child, possibleParent, eq = isEqualDefault, maxDepth = 0) => {\n\tif (maxDepth < 0) return false;\n\tconst isChildTrav = isTraversable(child);\n\tconst isParentTrav = isTraversable(possibleParent);\n\tconst p = isChildTrav ? child.getParent() : child.parent;\n\tif (typeof p === `undefined`) return false;\n\tif (eq(p, possibleParent)) return true;\n\tif (eq(isChildTrav ? p.getIdentity() : p.value, isParentTrav ? possibleParent.getIdentity() : possibleParent.value)) return true;\n\treturn hasParent(p, possibleParent, eq, maxDepth - 1);\n};\n/**\n* Checks if a child node has a parent with a certain value\n* Note: by default only checks immediate parent. Set maxDepth to a large value to recurse\n* \n* Uses `getValue()` on the parent if that function exists.\n* @param child Node to start looking from\n* @param possibleParentValue Value to seek\n* @param eq Equality checker\n* @param maxDepth Defaults to 0, so it only checks immediate parent\n* @returns \n*/\nconst hasParentValue = (child, possibleParentValue, eq = isEqualDefault, maxDepth = 0) => {\n\tif (child === void 0) throw new Error(`Param 'child' is undefined`);\n\tif (maxDepth < 0) return false;\n\tconst p = `getParent` in child ? child.getParent() : child.parent;\n\tif (p === void 0) return false;\n\tif (eq(`getValue` in p ? p.getValue() : p.value, possibleParentValue)) return true;\n\treturn hasParentValue(p, possibleParentValue, eq, maxDepth - 1);\n};\n/**\n* Returns any parent of `child` that has value `possibleParentValue`. Returns _undefined_ if not found.\n* @param child Child being sought\n* @param possibleParentValue Value of possible parent of child\n* @param eq Equality comparison function {@link isEqualDefault} used by default\n* @param maxDepth Maximum depth of traversal. Default of 0 only looks for immediate parent.\n* @returns \n*/\nconst findParentByValue = (child, possibleParentValue, eq = isEqualDefault, maxDepth = 0) => {\n\tif (maxDepth < 0) return;\n\tconst p = `getParent` in child ? child.getParent() : child.parent;\n\tif (p === void 0) return;\n\tif (eq(`getValue` in p ? p.getValue() : p.value, possibleParentValue)) return p;\n\treturn findParentByValue(p, possibleParentValue, eq, maxDepth - 1);\n};\n/**\n* Returns _true_ if `prospectiveChild` can be legally added to `parent`.\n* _False_ is returned if:\n* * `parent` and `prospectiveChild` are equal\n* * `parent` already contains `prospectiveChild`\n* * `prospectiveChild` has `parent` as its own child\n*\n* Throws an error if `parent` or `prospectiveChild` is null/undefined.\n* @param parent Parent to add to\n* @param prospectiveChild Prospective child\n* @param eq Equality function\n*/\nconst couldAddChild = (parent, prospectiveChild, eq = isEqualDefault) => {\n\tif (eq(parent, prospectiveChild)) throw new Error(`Child equals parent`);\n\tif (hasAnyChild(parent, prospectiveChild, eq)) throw new Error(`Circular. Parent already has child`);\n\tif (hasAnyChild(prospectiveChild, parent, eq)) throw new Error(`Prospective child has parent as child relation`);\n};\n/**\n* Returns _true_ if _possibleChild_ is contained within _parent_ tree.\n* That is, it is any sub-child.\n* @param parent Parent tree\n* @param possibleChild Sought child\n* @param eq Equality function, or {@link isEqualDefault} if undefined.\n* @returns\n*/\nconst hasAnyChild = (parent, possibleChild, eq = isEqualDefault) => {\n\treturn hasChild(parent, possibleChild, eq, Number.MAX_SAFE_INTEGER);\n};\n/**\n* Returns _true_ if `parent` has any child with value `possibleChildValue`. It explores\n* at children at any depth from `parent`.\n* @param parent \n* @param possibleChildValue \n* @param eq \n* @returns \n*/\nconst hasAnyChildValue = (parent, possibleChildValue, eq = isEqualDefault) => {\n\treturn hasChildValue(parent, possibleChildValue, eq, Number.MAX_SAFE_INTEGER);\n};\n/**\n* Returns _true_ if _possibleChild_ is contained within _maxDepth_ children\n* of _parent_ node. By default only looks at immediate children (maxDepth = 0).\n*\n* ```js\n* // Just check parentNode for childNode\n* Trees.hasChild(parentNode, childNode);\n* // See if parentNode or parentNode's parents have childNode\n* Trees.hasChild(parentNode, childNode, 1);\n* // Use custom equality function, in this case comparing on name field\n* Trees.hasChild(parentNode, childNode, 0, (a, b) => a.name === b.name);\n* ```\n* @param parent Parent tree\n* @param possibleChild Sought child\n* @param maxDepth Maximum depth. 0 for immediate children, Number.MAX_SAFE_INTEGER for boundless\n* @param eq Equality function, or {@link isEqualDefault} if undefined.\n* @returns\n*/\nconst hasChild = (parent, possibleChild, eq = isEqualDefault, maxDepth = 0) => {\n\tif (maxDepth < 0) return false;\n\tif (eq(parent, possibleChild)) return true;\n\tconst pId = `getIdentity` in parent ? parent.getIdentity() : parent.value;\n\tconst pcId = `getIdentity` in possibleChild ? possibleChild.getIdentity() : possibleChild.value;\n\tif (eq(pId, pcId)) return true;\n\tfor (const c of breadthFirst$1(parent, maxDepth)) {\n\t\tconst cId = `getIdentity` in c ? c.getIdentity() : c.value;\n\t\tif (eq(c, possibleChild)) return true;\n\t\tif (eq(cId, pcId)) return true;\n\t}\n\treturn false;\n};\n/**\n* Returns _true_ if `parent` has any child with value `possibleChildValue`. It explores\n* at children up to `maxDepth` from `parent`. By default only looks at immediate children (maxDepth = 0).\n* @param parent \n* @param possibleValue \n* @param eq \n* @param maxDepth \n* @returns \n*/\nconst hasChildValue = (parent, possibleValue, eq = isEqualDefault, maxDepth = 0) => {\n\tif (maxDepth < 0) return false;\n\tif (eq(parent.getValue(), possibleValue)) return true;\n\tfor (const c of breadthFirst$1(parent, maxDepth)) if (eq(c.getValue(), possibleValue)) return true;\n\treturn false;\n};\n/**\n* Iterates over siblings of `node`.\n* \n* Other iteration options:\n* * {@link breadthFirst}: Children, breadth-first\n* * {@link depthFirst}: Children, depth-first\n* * {@link parents}: Chain of parents, starting with immediate parent\n* * {@link siblings}: Nodes with same parent\n* @param node Node to begin from\n* @returns \n*/\nfunction* siblings(node) {\n\tconst p = node.getParent();\n\tif (p === void 0) return;\n\tfor (const s of p.children()) {\n\t\tif (s === node) continue;\n\t\tyield s;\n\t}\n}\n/**\n* Iterates over parents of `node`, starting with immediate parent\n* \n* Other iteration options:\n* * {@link breadthFirst}: Children, breadth-first\n* * {@link depthFirst}: Children, depth-first\n* * {@link parents}: Chain of parents, starting with immediate parent\n* * {@link siblings}: Nodes with same parent\n* @param node Node to begin from\n* @returns \n*/\nfunction* parents(node) {\n\tif (isTraversable(node)) {\n\t\tlet p = node.getParent();\n\t\twhile (p !== void 0) {\n\t\t\tyield p;\n\t\t\tp = p.getParent();\n\t\t}\n\t} else {\n\t\tlet p = node.parent;\n\t\twhile (p !== void 0) {\n\t\t\tyield p;\n\t\t\tp = p.parent;\n\t\t}\n\t}\n}\n/**\n* Descends `parent`, breadth-first, looking for a particular value.\n* Returns _undefined_ if not found.\n* @param parent \n* @param possibleValue \n* @param eq \n* @returns \n*/\nfunction findAnyChildByValue(parent, possibleValue, eq = isEqualDefault) {\n\treturn findChildByValue(parent, possibleValue, eq, Number.MAX_SAFE_INTEGER);\n}\n/**\n* Searches breadth-first for `possibleValue` under and including `parent`.\n* `maxDepth` sets he maximum level to which the tree is searched.\n* @param parent \n* @param possibleValue \n* @param eq \n* @param maxDepth \n* @returns \n*/\nfunction findChildByValue(parent, possibleValue, eq = isEqualDefault, maxDepth = 0) {\n\tif (maxDepth < 0) return;\n\tconst isTraver = isTraversable(parent);\n\tif (isTraver) {\n\t\tif (eq(parent.getValue(), possibleValue)) return parent;\n\t} else if (eq(parent.value, possibleValue)) return parent;\n\tfor (const d of breadthFirst$1(parent, maxDepth)) if (isTraver) {\n\t\tif (eq(d.getValue(), possibleValue)) return d;\n\t} else if (eq(d.value, possibleValue)) return d;\n}\n/**\n* Iterates over children of `root`, depth-first.\n* \n* Other iteration options:\n* * {@link breadthFirst}: Children, breadth-first\n* * {@link depthFirst}: Children, depth-first\n* * {@link parents}: Chain of parents, starting with immediate parent\n* * {@link siblings}: Nodes with same parent\n* @param root Root node \n* @returns \n*/\nfunction* depthFirst$1(root) {\n\tif (!root) return;\n\tconst stack = new StackMutable();\n\tlet entry = root;\n\twhile (entry) {\n\t\tconst entries = isTraversable(entry) ? [...entry.children()] : [...entry.childrenStore];\n\t\tstack.push(...entries);\n\t\tif (stack.isEmpty) break;\n\t\tentry = stack.pop();\n\t\tif (entry) yield entry;\n\t}\n}\n/**\n* Iterates over the children of `root`, breadth-first\n* \n* Other iteration options:\n* * {@link breadthFirst}: Children, breadth-first\n* * {@link depthFirst}: Children, depth-first\n* * {@link parents}: Chain of parents, starting with immediate parent\n* * {@link siblings}: Nodes with same parent\n* \n* @example Traversing over a simple object\n* ```js\n* const myObj = { name: `Pedro`, size: 45, colour: `orange` };\n* const root = Trees.FromObject.asDynamicTraversable(myObj);\n* for (const v of Trees.Traverse.breadthFirst(root)) {\n* // v.getValue() yields:\n* // { name: 'name', sourceValue: 'Pedro' ...}, \n* // { name: 'size', sourceValue: 45 ... }\n* // ...\n* }\n* ```\n* @param root Root node\n* @param depth How many levels to traverse \n* @returns \n*/\nfunction* breadthFirst$1(root, depth = Number.MAX_SAFE_INTEGER) {\n\tif (!root) return;\n\tconst queue = isTraversable(root) ? new QueueMutable() : new QueueMutable();\n\tlet entry = root;\n\twhile (entry) {\n\t\tif (depth < 0) return;\n\t\tif (entry !== void 0) {\n\t\t\tconst kids = `childrenStore` in entry ? entry.childrenStore : entry.children();\n\t\t\tfor (const c of kids) {\n\t\t\t\tyield c;\n\t\t\t\tqueue.enqueue(c);\n\t\t\t}\n\t\t}\n\t\tentry = queue.dequeue();\n\t\tdepth--;\n\t}\n}\n/**\n* Applies `predicate` to `root` and all its child nodes, returning the node where\n* `predicate` yields _true_.\n* Use {@link findByValue} to find a node by its value\n* @param root \n* @param predicate \n* @param order Iterate children by breadth or depth. Default 'breadth'\n* @returns \n*/\nfunction find$2(root, predicate, order = `breadth`) {\n\tif (predicate(root)) return root;\n\tconst iter = order === `breadth` ? breadthFirst$1 : depthFirst$1;\n\tfor (const c of iter(root)) if (predicate(c)) return c;\n}\n/**\n* Applies `predicate` to `root` and all its child nodes, returning the node value for\n* `predicate` yields _true_.\n* Use {@link find} to filter by nodes rather than values\n* \n* ```js\n* const n = findByValue(root, (v) => v.name === 'Bob');\n* ```\n* @param root \n* @param predicate \n* @param order Iterate children by breadth or depth. Default 'breadth'\n* @returns \n*/\nfunction findByValue(root, predicate, order = `breadth`) {\n\tif (predicate(root.getValue())) return root;\n\tconst iter = order === `breadth` ? breadthFirst$1 : depthFirst$1;\n\tfor (const c of iter(root)) if (predicate(c.getValue())) return c;\n}\n/**\n* Search through children in a path-like manner.\n* \n* It finds the first child of `root` that matches `continuePredicate`. \n* The function gets passed a depth of 1 to begin with. It recurses, looking for the next sub-child, etc.\n* \n* If it can't find a child, it stops.\n* \n* This is different to 'find' functions, which exhaustively search all possible child nodes, regardless of position in tree.\n* \n* ```js\n* const path = 'a.aa.aaa'.split('.');\n* const pred = (nodeValue, depth) => {\n* if (nodeValue === path[0]) {\n* path.shift(); // Remove first element\n* return true;\n* }\n* return false;\n* }\n* \n* // Assuming we have a tree of string values:\n* // a\n* // - aa\n* // - aaa\n* // - ab\n* // b\n* // - ba\n* for (const c of follow(tree, pred)) {\n* // Returns nodes: a, aa and then aaa\n* }\n* ```\n* @param root \n* @param continuePredicate \n* @param depth \n*/\nfunction* followValue(root, continuePredicate, depth = 1) {\n\tfor (const c of root.children()) if (continuePredicate(c.getValue(), depth)) {\n\t\tyield c.getValue();\n\t\tyield* followValue(c, continuePredicate, depth + 1);\n\t}\n}\nfunction toStringDeep$1(node, depth = 0) {\n\tif (node === void 0) return `(undefined)`;\n\tif (node === null) return `(null)`;\n\tconst v = node.getValue();\n\tlet type = typeof v;\n\tif (Array.isArray(v)) type = `array`;\n\tlet t = ` `.repeat(depth) + `value: ${JSON.stringify(v)} (${type})\\n`;\n\tfor (const n of node.children()) t += toStringDeep$1(n, depth + 1);\n\treturn t;\n}\nfunction toString(...nodes) {\n\tlet t = ``;\n\tfor (const node of nodes) {\n\t\tconst v = node.getValue();\n\t\tconst vString = toStringAbbreviate(v);\n\t\tconst children = [...node.children()];\n\t\tconst parent = node.getParent();\n\t\tlet type = typeof v;\n\t\tif (Array.isArray(v)) type = `array`;\n\t\tt += `value: ${vString} (${type}) kids: ${children.length} parented: ${parent ? `y` : `n`}\\n`;\n\t}\n\treturn t;\n}\n//#endregion\n//#region src/tree/binary-tree.ts\nvar binary_tree_exports = /* @__PURE__ */ __exportAll({\n\taddLeft: () => addLeft,\n\taddRight: () => addRight,\n\tbalanceFactor: () => balanceFactor,\n\tbreadthFirst: () => breadthFirst,\n\tcreateNode: () => createNode,\n\tdepthFirst: () => depthFirst,\n\tfind: () => find$1,\n\tfromArray: () => fromArray$1,\n\tgetLeft: () => getLeft,\n\tgetRight: () => getRight,\n\tgrandparent: () => grandparent,\n\thasLeft: () => hasLeft,\n\thasRight: () => hasRight,\n\theight: () => height,\n\tinOrder: () => inOrder$1,\n\tisLeaf: () => isLeaf,\n\tisParentLeftChild: () => isParentLeftChild,\n\tisParentRightChild: () => isParentRightChild,\n\tleftSubtreeHeightFn: () => leftSubtreeHeightFn,\n\tparentChildSide: () => parentChildSide,\n\tpostOrder: () => postOrder$1,\n\tpreOrder: () => preOrder$1,\n\tremoveNode: () => removeNode,\n\trightSubtreeHeightFn: () => rightSubtreeHeightFn,\n\troot: () => root$1,\n\trootWrapped: () => rootWrapped,\n\tsetLeft: () => setLeft,\n\tsetRight: () => setRight,\n\tsibling: () => sibling,\n\ttoArray: () => toArray,\n\ttoStringDeep: () => toStringDeep,\n\tuncle: () => uncle,\n\twrap: () => wrap\n});\nconst getLeftChild = (node) => {\n\treturn node.childrenStore[0];\n};\nconst getRightChild = (node) => {\n\treturn node.childrenStore[1];\n};\nconst getLeft = (node) => {\n\treturn getLeftChild(node);\n};\nconst getRight = (node) => {\n\treturn getRightChild(node);\n};\nconst hasLeft = (node) => {\n\treturn getLeftChild(node) !== void 0;\n};\nconst hasRight = (node) => {\n\treturn getRightChild(node) !== void 0;\n};\nconst isLeaf = (node) => {\n\treturn !hasLeft(node) && !hasRight(node);\n};\nconst setLeft = (parent, child) => {\n\tconst existingLeft = getLeftChild(parent);\n\tif (existingLeft) existingLeft.parent = void 0;\n\tconst children = [...parent.childrenStore];\n\tif (child === void 0 && children.length <= 1) {\n\t\tparent.childrenStore = [];\n\t\treturn;\n\t} else if (child === void 0) {\n\t\tchildren[0] = void 0;\n\t\tparent.childrenStore = children;\n\t\treturn;\n\t}\n\tif (children.length === 0) children.push(child);\n\telse children[0] = child;\n\tparent.childrenStore = children;\n\tchild.parent = parent;\n};\nconst setRight = (parent, child) => {\n\tconst existingRight = getRightChild(parent);\n\tif (existingRight) existingRight.parent = void 0;\n\tconst children = [...parent.childrenStore];\n\tif (child === void 0) {\n\t\tif (children.length >= 2) {\n\t\t\tchildren[1] = void 0;\n\t\t\tif (children[0] === void 0) parent.childrenStore = [];\n\t\t\telse parent.childrenStore = children;\n\t\t}\n\t\treturn;\n\t}\n\tif (children.length === 0) children.push(void 0, child);\n\telse if (children.length === 1) children.push(child);\n\telse children[1] = child;\n\tparent.childrenStore = children;\n\tchild.parent = parent;\n};\nconst removeNode = (node) => {\n\tconst p = node.parent;\n\tif (!p) return;\n\tif (p.childrenStore[0] === node) setLeft(p, void 0);\n\telse if (p.childrenStore[1] === node) setRight(p, void 0);\n};\nconst sibling = (node) => {\n\tconst parent = node.parent;\n\tif (!parent) return void 0;\n\tconst left = getLeftChild(parent);\n\tconst right = getRightChild(parent);\n\tif (left === node) return right;\n\tif (right === node) return left;\n};\nconst uncle = (node) => {\n\tconst parent = node.parent;\n\tif (!parent) return void 0;\n\treturn sibling(parent);\n};\nconst grandparent = (node) => {\n\tconst parent = node.parent;\n\tif (!parent) return void 0;\n\treturn parent.parent;\n};\nconst isParentLeftChild = (node) => {\n\tconst parent = node.parent;\n\tif (!parent) return false;\n\treturn getLeftChild(parent) === node;\n};\nconst isParentRightChild = (node) => {\n\tconst parent = node.parent;\n\tif (!parent) return false;\n\treturn getRightChild(parent) === node;\n};\nconst parentChildSide = (node) => {\n\tif (!node.parent) return `neutral`;\n\treturn isParentLeftChild(node) ? `left` : `right`;\n};\nconst leftSubtreeHeight = (node) => {\n\tconst left = getLeftChild(node);\n\treturn left ? subtreeHeight(left) + 1 : 0;\n};\nconst rightSubtreeHeight = (node) => {\n\tconst right = getRightChild(node);\n\treturn right ? subtreeHeight(right) + 1 : 0;\n};\nconst subtreeHeight = (node) => {\n\treturn Math.max(leftSubtreeHeight(node), rightSubtreeHeight(node));\n};\nconst height = (node) => {\n\treturn subtreeHeight(node);\n};\nconst balanceFactor = (node) => {\n\treturn leftSubtreeHeight(node) - rightSubtreeHeight(node);\n};\nconst leftSubtreeHeightFn = leftSubtreeHeight;\nconst rightSubtreeHeightFn = rightSubtreeHeight;\nconst addLeft = (value, parent) => {\n\tconst existingLeft = getLeftChild(parent);\n\tif (existingLeft) existingLeft.parent = void 0;\n\tconst child = {\n\t\tvalue,\n\t\tparent,\n\t\tchildrenStore: []\n\t};\n\tconst children = [...parent.childrenStore];\n\tif (children.length === 0) children.push(child);\n\telse if (children.length === 1) children[0] = child;\n\telse children[0] = child;\n\tparent.childrenStore = children;\n\treturn child;\n};\nconst addRight = (value, parent) => {\n\tconst existingRight = getRightChild(parent);\n\tif (existingRight) existingRight.parent = void 0;\n\tconst child = {\n\t\tvalue,\n\t\tparent,\n\t\tchildrenStore: []\n\t};\n\tconst children = [...parent.childrenStore];\n\tif (children.length === 0) {\n\t\tchildren.push(void 0);\n\t\tchildren.push(child);\n\t} else if (children.length === 1) children.push(child);\n\telse children[1] = child;\n\tparent.childrenStore = children;\n\treturn child;\n};\nconst root$1 = (value) => {\n\treturn root$2(value);\n};\nconst createNode = (value, parent) => {\n\treturn createNode$1(value, parent);\n};\nconst unwrapNode = (node) => {\n\treturn `node` in node ? node.node : node;\n};\nconst wrapNode = (node) => {\n\treturn wrap(node);\n};\nconst wrap = (node) => {\n\treturn {\n\t\tnode,\n\t\tget left() {\n\t\t\tconst left = getLeftChild(node);\n\t\t\treturn left ? wrapNode(left) : void 0;\n\t\t},\n\t\tget right() {\n\t\t\tconst right = getRightChild(node);\n\t\t\treturn right ? wrapNode(right) : void 0;\n\t\t},\n\t\tset left(value) {\n\t\t\tsetLeft(node, value ? unwrapNode(value) : void 0);\n\t\t},\n\t\tset right(value) {\n\t\t\tsetRight(node, value ? unwrapNode(value) : void 0);\n\t\t},\n\t\tget parentChildSide() {\n\t\t\treturn parentChildSide(node);\n\t\t},\n\t\tget isParentLeftChild() {\n\t\t\treturn isParentLeftChild(node);\n\t\t},\n\t\tget isParentRightChild() {\n\t\t\treturn isParentRightChild(node);\n\t\t},\n\t\tget isLeaf() {\n\t\t\treturn isLeaf(node);\n\t\t},\n\t\tget sibling() {\n\t\t\tconst sib = sibling(node);\n\t\t\treturn sib ? wrapNode(sib) : void 0;\n\t\t},\n\t\tget uncle() {\n\t\t\tconst unc = uncle(node);\n\t\t\treturn unc ? wrapNode(unc) : void 0;\n\t\t},\n\t\tget grandparent() {\n\t\t\tconst gp = grandparent(node);\n\t\t\treturn gp ? wrapNode(gp) : void 0;\n\t\t},\n\t\tget leftSubtreeHeight() {\n\t\t\treturn leftSubtreeHeight(node);\n\t\t},\n\t\tget rightSubtreeHeight() {\n\t\t\treturn rightSubtreeHeight(node);\n\t\t},\n\t\tget height() {\n\t\t\treturn height(node);\n\t\t},\n\t\tget balanceFactor() {\n\t\t\treturn balanceFactor(node);\n\t\t},\n\t\thas(value) {\n\t\t\treturn find$1(node, value) !== void 0;\n\t\t},\n\t\taddLeft(value) {\n\t\t\treturn wrapNode(addLeft(value, node));\n\t\t},\n\t\taddRight(value) {\n\t\t\treturn wrapNode(addRight(value, node));\n\t\t},\n\t\tsetLeft(nodeOrWrapped) {\n\t\t\tsetLeft(node, unwrapNode(nodeOrWrapped));\n\t\t},\n\t\tsetRight(nodeOrWrapped) {\n\t\t\tsetRight(node, unwrapNode(nodeOrWrapped));\n\t\t},\n\t\tremove() {\n\t\t\tremoveNode(node);\n\t\t}\n\t};\n};\nconst rootWrapped = (value) => {\n\treturn wrap(root$2(value));\n};\nconst find$1 = (root, value) => {\n\tfor (const n of breadthFirst(root)) if (n.value === value) return n;\n};\nfunction* inOrder$1(node) {\n\tconst left = getLeftChild(node);\n\tif (left) yield* inOrder$1(left);\n\tyield node;\n\tconst right = getRightChild(node);\n\tif (right) yield* inOrder$1(right);\n}\nfunction* preOrder$1(node) {\n\tyield node;\n\tconst left = getLeftChild(node);\n\tif (left) yield* preOrder$1(left);\n\tconst right = getRightChild(node);\n\tif (right) yield* preOrder$1(right);\n}\nfunction* postOrder$1(node) {\n\tconst left = getLeftChild(node);\n\tif (left) yield* postOrder$1(left);\n\tconst right = getRightChild(node);\n\tif (right) yield* postOrder$1(right);\n\tyield node;\n}\nfunction* depthFirst(node) {\n\tconst left = getLeftChild(node);\n\tconst right = getRightChild(node);\n\tif (left) yield* depthFirst(left);\n\tif (right) yield* depthFirst(right);\n\tyield node;\n}\nfunction* breadthFirst(node) {\n\tyield node;\n\tconst queue = [];\n\tqueue.push(...node.childrenStore.filter((c) => c !== void 0 && c.value !== void 0));\n\twhile (queue.length > 0) {\n\t\tconst current = queue.shift();\n\t\tyield current;\n\t\tqueue.push(...current.childrenStore.filter((c) => c !== void 0 && c.value !== void 0));\n\t}\n}\nconst fromArray$1 = (array) => {\n\tif (array.length === 0) return void 0;\n\tconst rootNode = root$2(array[0]);\n\tconst insert = (index, parent) => {\n\t\tconst leftIdx = 2 * index + 1;\n\t\tconst rightIdx = 2 * index + 2;\n\t\tif (leftIdx < array.length) {\n\t\t\taddLeft(array[leftIdx], parent);\n\t\t\tinsert(leftIdx, getLeftChild(parent));\n\t\t}\n\t\tif (rightIdx < array.length) {\n\t\t\taddRight(array[rightIdx], parent);\n\t\t\tinsert(rightIdx, getRightChild(parent));\n\t\t}\n\t};\n\tinsert(0, rootNode);\n\treturn rootNode;\n};\nconst toArray = (root) => {\n\tconst result = [];\n\tfor (const node of breadthFirst(root)) if (node.value !== void 0) result.push(node.value);\n\treturn result;\n};\nconst toStringDeep = (node, indent = 0) => {\n\tconst v = node.value !== void 0 ? JSON.stringify(node.value) : `-`;\n\tconst prefix = ` `.repeat(indent);\n\tconst left = getLeftChild(node);\n\tconst right = getRightChild(node);\n\tlet result = `${prefix}${v}`;\n\tif (left || right) {\n\t\tresult += `\\n`;\n\t\tif (left) {\n\t\t\tresult += `${prefix} L: ${toStringDeep(left, indent + 1)}`;\n\t\t\tif (right) result += `\\n`;\n\t\t}\n\t\tif (right) result += `${prefix} R: ${toStringDeep(right, indent + 1)}`;\n\t}\n\treturn result;\n};\n//#endregion\n//#region src/tree/binary-search-tree.ts\nvar binary_search_tree_exports = /* @__PURE__ */ __exportAll({\n\tBst: () => Bst,\n\tcreate: () => create,\n\tfind: () => find,\n\tfromArray: () => fromArray,\n\thas: () => has,\n\tinOrder: () => inOrder,\n\tinsert: () => insert,\n\tmax: () => max,\n\tmin: () => min,\n\tpostOrder: () => postOrder,\n\tpreOrder: () => preOrder,\n\tremove: () => remove,\n\troot: () => root,\n\tvaluesInOrder: () => valuesInOrder\n});\nvar Bst = class {\n\troot;\n\tcomparer;\n\tconstructor(comparer = defaultComparer) {\n\t\tthis.comparer = comparer;\n\t\tthis.root = root$1();\n\t}\n\tinsert(value) {\n\t\tthis.root = insert(this.root, value, this.comparer);\n\t\treturn this.root;\n\t}\n\thas(value) {\n\t\treturn has(this.root, value, this.comparer);\n\t}\n\tfind(value) {\n\t\treturn find(this.root, value, this.comparer);\n\t}\n\tremove(value) {\n\t\tconst result = remove(this.root, value, this.comparer);\n\t\tif (result) this.root = result;\n\t\treturn result !== void 0;\n\t}\n\tmin() {\n\t\treturn min(this.root);\n\t}\n\tmax() {\n\t\treturn max(this.root);\n\t}\n\tinOrder() {\n\t\treturn inOrder(this.root);\n\t}\n\tpreOrder() {\n\t\treturn preOrder(this.root);\n\t}\n\tpostOrder() {\n\t\treturn postOrder(this.root);\n\t}\n\tvaluesInOrder() {\n\t\treturn valuesInOrder(this.root);\n\t}\n\ttoArrayInOrder() {\n\t\treturn Array.from(this.valuesInOrder());\n\t}\n};\nconst insert = (root, value, compare = defaultComparer) => {\n\tif (root.value === void 0) {\n\t\troot.value = value;\n\t\treturn root;\n\t}\n\tlet current = root;\n\twhile (true) {\n\t\tconst cmp = compare(value, current.value);\n\t\tif (cmp < 0) {\n\t\t\tconst left = getLeft(current);\n\t\t\tif (left) current = left;\n\t\t\telse {\n\t\t\t\taddLeft(value, current);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t} else if (cmp > 0) {\n\t\t\tconst right = getRight(current);\n\t\t\tif (right) current = right;\n\t\t\telse {\n\t\t\t\taddRight(value, current);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t} else break;\n\t}\n\treturn root;\n};\nconst has = (root, value, compare = defaultComparer) => {\n\treturn find(root, value, compare) !== void 0;\n};\nconst find = (root, value, compare = defaultComparer) => {\n\tif (!root || root.value === void 0) return void 0;\n\tconst cmp = compare(value, root.value);\n\tif (cmp === 0) return root;\n\telse if (cmp < 0) {\n\t\tconst left = getLeft(root);\n\t\treturn left ? find(left, value, compare) : void 0;\n\t} else {\n\t\tconst right = getRight(root);\n\t\treturn right ? find(right, value, compare) : void 0;\n\t}\n};\nconst min = (root) => {\n\tif (!root || root.value === void 0) return void 0;\n\tlet current = root;\n\twhile (getLeft(current)) current = getLeft(current);\n\treturn current;\n};\nconst max = (root) => {\n\tif (!root || root.value === void 0) return void 0;\n\tlet current = root;\n\twhile (getRight(current)) current = getRight(current);\n\treturn current;\n};\nconst remove = (root, value, compare = defaultComparer) => {\n\tif (!root || root.value === void 0) return void 0;\n\tconst nodeToRemove = find(root, value, compare);\n\tif (!nodeToRemove) return;\n\tconst left = getLeft(nodeToRemove);\n\tconst right = getRight(nodeToRemove);\n\tif (!left && !right) if (nodeToRemove === root) {\n\t\troot.value = void 0;\n\t\troot.childrenStore = [];\n\t} else removeNode(nodeToRemove);\n\telse if (!left) if (nodeToRemove === root) {\n\t\troot.value = right.value;\n\t\troot.childrenStore = right.childrenStore;\n\t\tfor (const child of root.childrenStore) if (child) child.parent = root;\n\t} else {\n\t\tconst parent = nodeToRemove.parent;\n\t\tif (getLeft(parent) === nodeToRemove) setLeft(parent, right);\n\t\telse setRight(parent, right);\n\t}\n\telse if (!right) if (nodeToRemove === root) {\n\t\troot.value = left.value;\n\t\troot.childrenStore = left.childrenStore;\n\t\tfor (const child of root.childrenStore) if (child) child.parent = root;\n\t} else {\n\t\tconst parent = nodeToRemove.parent;\n\t\tif (getLeft(parent) === nodeToRemove) setLeft(parent, left);\n\t\telse setRight(parent, left);\n\t}\n\telse {\n\t\tconst successor = min(right);\n\t\tnodeToRemove.value = successor.value;\n\t\tconst succParent = successor.parent;\n\t\tconst succRight = getRight(successor);\n\t\tif (getLeft(succParent) === successor) setLeft(succParent, succRight);\n\t\telse setRight(succParent, succRight);\n\t}\n\treturn root;\n};\nfunction* inOrder(node) {\n\tif (!node) return;\n\tconst left = getLeft(node);\n\tif (left) yield* inOrder(left);\n\tyield node;\n\tconst right = getRight(node);\n\tif (right) yield* inOrder(right);\n}\nfunction* preOrder(node) {\n\tif (!node) return;\n\tyield node;\n\tconst left = getLeft(node);\n\tif (left) yield* preOrder(left);\n\tconst right = getRight(node);\n\tif (right) yield* preOrder(right);\n}\nfunction* postOrder(node) {\n\tif (!node) return;\n\tconst left = getLeft(node);\n\tif (left) yield* postOrder(left);\n\tconst right = getRight(node);\n\tif (right) yield* postOrder(right);\n\tyield node;\n}\nfunction* valuesInOrder(node) {\n\tfor (const n of inOrder(node)) if (n.value !== void 0) yield n.value;\n}\nconst create = (comparer) => {\n\treturn new Bst(comparer);\n};\nconst fromArray = (array, comparer = defaultComparer) => {\n\tconst bst = new Bst(comparer);\n\tfor (const value of array) bst.insert(value);\n\treturn bst;\n};\nconst root = () => {\n\treturn root$1();\n};\n//#endregion\n//#region src/tree/index.ts\nvar tree_exports = /* @__PURE__ */ __exportAll({\n\tBinarySearchTree: () => binary_search_tree_exports,\n\tBinaryTree: () => binary_tree_exports,\n\tFromObject: () => traverse_object_exports,\n\tMutable: () => tree_mutable_exports,\n\tPathed: () => pathed_exports,\n\tTraverse: () => traversable_tree_exports,\n\tcompare: () => compare$1,\n\tisMultiValue: () => isMultiValue,\n\tisSingleValue: () => isSingleValue,\n\tisTraversable: () => isTraversable,\n\tisTreeNode: () => isTreeNode,\n\ttoTraversable: () => toTraversable\n});\n/**\n* Makes a 'traversable' to move around a {@link TreeNode}, \n* an existing {@link TraversableTree} or a plain object.\n* \n* @param node \n* @returns \n*/\nconst toTraversable = (node) => {\n\tif (isTraversable(node)) return node;\n\tif (isTreeNode(node)) return asDynamicTraversable$1(node);\n\tif (typeof node === `object`) return asDynamicTraversable(node);\n\tthrow new Error(`Parameter 'node' not convertible`);\n};\n/**\n* Checks whether `node` is of type {@link TreeNode}.\n* \n* Checks for: parent, childrenStore and value defined on `node`.\n* @param node \n* @returns \n*/\nconst isTreeNode = (node) => {\n\tif (`parent` in node && `childrenStore` in node && `value` in node) {\n\t\tif (Array.isArray(node.childrenStore)) return true;\n\t}\n\treturn false;\n};\n/**\n* Checks if `node` is of type {@link TraversableTree}.\n* \n* Checks by looking for: children, getParent, getValue and getIdentity defined on `node`.\n* @param node \n* @returns \n*/\nconst isTraversable = (node) => {\n\treturn `children` in node && `getParent` in node && `getValue` in node && `getIdentity` in node;\n};\n//#endregion\nexport { binary_search_tree_exports as a, pathed_exports as c, traverse_object_exports as d, tree_mutable_exports as f, tree_exports as i, isMultiValue as l, isTreeNode as n, binary_tree_exports as o, compare$1 as p, toTraversable as r, traversable_tree_exports as s, isTraversable as t, isSingleValue as u };\n","import type { CrumbPathElement, CrumbSegment } from './crumb-path.js';\n\nimport { Trees } from '@ixfx/collections';\n\nexport type CrumbPathControllerOptions = {\n separator?: string;\n paths?: string[];\n onQuery?: (pathSegments: string[]) => Promise<CrumbSegment[]>;\n};\n\nexport class CrumbPathController {\n #element: CrumbPathElement | null = null;\n #pathed: Trees.Pathed.Pathed<CrumbSegment>;\n #separator: string;\n #onQuery: ((pathSegments: string[]) => Promise<CrumbSegment[]>) | undefined;\n\n constructor(options: CrumbPathControllerOptions = {}) {\n this.#separator = options.separator ?? `/`;\n this.#onQuery = options.onQuery;\n this.#pathed = new Trees.Pathed.Pathed<CrumbSegment>({ separator: this.#separator });\n\n if (options.paths) {\n this.addPaths(options.paths);\n // console.log(this.#pathed.prettyPrint());\n }\n }\n\n get separator(): string {\n return this.#separator;\n }\n\n addPath(path: string): void {\n const segments = path.split(this.#separator).filter(s => s.length > 0);\n for (let i = 0; i < segments.length; i++) {\n const segmentPath = segments.slice(0, i + 1).join(this.#separator);\n const label = segments[i];\n const segment: CrumbSegment = { label };\n this.#pathed.add(segment, segmentPath);\n }\n }\n\n addPaths(paths: string[]): void {\n for (const path of paths) {\n this.addPath(path);\n }\n }\n\n getPath(): string {\n return this.#element?.getPath() ?? ``;\n }\n\n setPath(path: string): void {\n this.#element?.setPath(path);\n }\n\n connect(element: CrumbPathElement): void {\n this.#element = element;\n element.separator = this.#separator;\n element.siblingLookup = this.#siblingLookup.bind(this);\n }\n\n disconnect(): void {\n if (this.#element) {\n this.#element.siblingLookup = undefined;\n this.#element = null;\n }\n }\n\n async #siblingLookup(\n pathSegments: string[],\n _index: number,\n signal: AbortSignal,\n ): Promise<CrumbSegment[]> {\n const currentPath = pathSegments.join(this.#separator);\n\n const cachedChildren = this.#pathed.children(currentPath);\n const children = [...cachedChildren];\n\n if (children.length > 0) {\n return children\n .map(node => node.value)\n .filter((v): v is NonNullable<typeof v> => v !== undefined)\n .map((v) => {\n if (`value` in v) {\n return v.value ?? { label: v.label };\n }\n return { label: v.label };\n });\n }\n\n if (this.#onQuery) {\n const newChildren = await this.#onQuery(pathSegments);\n\n for (const child of newChildren) {\n const childPath = currentPath.length > 0\n ? `${currentPath}${this.#separator}${child.label}`\n : child.label;\n this.#pathed.add(child, childPath);\n }\n\n if (signal.aborted) {\n return [];\n }\n\n return newChildren;\n }\n\n return [];\n }\n}\n","/* eslint-disable ts/no-unsafe-declaration-merging */\nimport type { PropertyValues } from 'lit';\nimport type { AcTextChangeEvent, AcTextItem } from '../ac-text/ac-text.js';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { popupSurfaceStyles } from '../styles/popup.js';\nimport { prominenceStyles } from '../styles/prominence.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport '../ac-text/ac-text.js';\n\nconst INVALID_ANCHOR_CHARS_RE = /[^\\w-]/g;\n\nexport type CrumbSegment = {\n label: string;\n icon?: string;\n isLeaf?: boolean;\n};\n\nexport type CrumbSiblingLookupFn = (\n pathSegments: string[],\n index: number,\n signal: AbortSignal,\n) => Promise<CrumbSegment[]>;\n\nexport type CrumbNavNavigateDetail = { index: number; label: string; parentPath: string; fullPath: string };\nexport type CrumbNavNavigateEvent = CustomEvent<CrumbNavNavigateDetail>;\nexport type CrumbNavChangeDetail = { label: string; parentPath: string; fullPath: string };\nexport type CrumbNavChangeEvent = CustomEvent<CrumbNavChangeDetail>;\nexport type CrumbNavExpandDetail = { index: number; segments: string[]; path: string; signal: AbortSignal };\nexport type CrumbNavExpandEvent = CustomEvent<CrumbNavExpandDetail>;\n\n@customElement(`ixfx-crumb-path`)\nexport class CrumbPathElement extends LitElement {\n @property({ type: String })\n path = ``;\n\n @property({ type: String })\n separator = `/`;\n\n @property({ type: String, attribute: `path-root` })\n pathRoot = ``;\n\n @property({ type: Object })\n siblingLookup: CrumbSiblingLookupFn | undefined;\n\n @state()\n private _openIdx: number | null = null;\n\n @state()\n private _editing = false;\n\n @state()\n private _cachedSiblings: Map<string, CrumbSegment[]> = new Map();\n\n @state()\n private _leafSegmentIndex: number | null = null;\n\n @state()\n private _confirmedLeafIndices: Set<string> = new Set();\n\n @state()\n private _dropdownActiveIndex = -1;\n\n @state()\n private _editingCancelled = false;\n\n @state()\n private _editStartIndex: number | null = null;\n\n @state()\n private _openCumPath: string | null = null;\n\n #pendingController: AbortController | undefined;\n #pendingIndex: number | undefined;\n readonly #uid = Math.random().toString(36).slice(2, 8);\n\n #anchorName(cumPath: string): string {\n return `--cp-${this.#uid}-${cumPath\n .replaceAll(this.separator, `-`)\n .replaceAll(` `, `-`)\n .replace(INVALID_ANCHOR_CHARS_RE, `-`)}`;\n }\n\n #closeDropdown() {\n if (this._openIdx !== null) {\n this._openIdx = null;\n this._openCumPath = null;\n this._dropdownActiveIndex = -1;\n this.#cleanupPending();\n const popup = this.shadowRoot?.querySelector(`.crumb-dropdown`) as HTMLElement | null;\n try {\n (popup as any)?.hidePopover();\n } catch { /* unsupported */ }\n }\n }\n\n #onPopoverToggle = (e: Event): void => {\n if ((e as ToggleEvent).newState === `closed` && this._openIdx !== null) {\n this._openIdx = null;\n this._dropdownActiveIndex = -1;\n this.#cleanupPending();\n }\n };\n\n protected override updated(changedProperties: PropertyValues): void {\n if (this._editing) {\n const el = this.shadowRoot?.querySelector(`ixfx-ac-text`);\n if (el instanceof LitElement) {\n const editValue = this.path;\n if (this._editStartIndex !== null) {\n const segments = this.#getSegments();\n const segmentLabel = segments[this._editStartIndex];\n const startPos = this.path.indexOf(segmentLabel);\n (el as any).focusWithValue(editValue, startPos);\n } else {\n (el as any).focusWithValue(editValue);\n }\n }\n }\n if (changedProperties.has(`_openIdx`) && this._openIdx !== null) {\n this.updateComplete.then(() => {\n const popup = this.shadowRoot?.querySelector(`.crumb-dropdown`) as HTMLElement | null;\n if (popup) {\n popup.style.setProperty(`position-anchor`, this.#anchorName(this._openCumPath ?? String(this._openIdx)));\n try {\n (popup as any).showPopover();\n } catch { /* unsupported */ }\n popup.focus();\n }\n });\n }\n }\n\n #cleanupPending() {\n if (this.#pendingController) {\n this.#pendingController.abort();\n this.#pendingController = undefined;\n this.#pendingIndex = undefined;\n }\n }\n\n #getSegments(): string[] {\n const fullPath = this.path;\n if (this.pathRoot.length > 0 && fullPath.startsWith(this.pathRoot)) {\n const relativePath = fullPath.slice(this.pathRoot.length);\n return relativePath.split(this.separator).filter(p => p.length > 0);\n }\n return this.path.split(this.separator).filter(p => p.length > 0);\n }\n\n #getRootSegments(): string[] {\n if (this.pathRoot.length === 0)\n return [];\n return this.pathRoot.split(this.separator).filter(p => p.length > 0);\n }\n\n #getCumulativePath(index: number, isRoot: boolean): string {\n const segments = this.#getSegments();\n const rootSegments = this.#getRootSegments();\n\n if (isRoot) {\n return rootSegments.slice(0, index + 1).join(this.separator);\n }\n\n return [...rootSegments, ...segments.slice(0, index + 1)].join(this.separator);\n }\n\n public setPath(newPath: string): void {\n this.#cleanupPending();\n if (this.pathRoot.length > 0 && !newPath.startsWith(this.pathRoot)) {\n newPath = this.pathRoot;\n }\n this.path = newPath;\n this._cachedSiblings = new Map();\n this._openIdx = null;\n this._leafSegmentIndex = null;\n this._confirmedLeafIndices = new Set();\n }\n\n public getPath(): string {\n return this.path;\n }\n\n #onCaretClick(index: number, event: MouseEvent) {\n event.preventDefault();\n event.stopPropagation();\n\n if (this._openIdx === index) {\n this.#closeDropdown();\n return;\n }\n\n const target = event.currentTarget as HTMLElement;\n const cumPath = target.dataset.cumulative;\n\n this._openIdx = index;\n this._openCumPath = cumPath ?? null;\n this._dropdownActiveIndex = -1;\n const segments = this.#getSegments();\n const rootSegments = this.#getRootSegments();\n\n const pathSegments = cumPath\n ? cumPath.split(this.separator).filter(p => p.length > 0)\n : (index === -1 ? rootSegments : segments.slice(0, index + 1));\n\n const cacheKey = cumPath ?? String(index);\n if (!this._cachedSiblings.has(cacheKey) && this.siblingLookup) {\n this.#cleanupPending();\n const controller = new AbortController();\n this.#pendingController = controller;\n this.#pendingIndex = index;\n\n this.siblingLookup(pathSegments, index, controller.signal)\n .then((siblings) => {\n if (!controller.signal.aborted) {\n this._cachedSiblings.set(cacheKey, siblings);\n if (siblings.length === 0) {\n this._confirmedLeafIndices.add(cumPath ?? ``);\n }\n this.#pendingController = undefined;\n this.#pendingIndex = undefined;\n this.requestUpdate();\n }\n })\n .catch((err) => {\n if (err.name !== `AbortError`) {\n console.error(`Sibling lookup failed:`, err);\n }\n this.#pendingController = undefined;\n this.#pendingIndex = undefined;\n });\n\n this.dispatchEvent(new CustomEvent<CrumbNavExpandDetail>(`expand`, {\n detail: { index, segments: pathSegments, path: pathSegments.join(this.separator), signal: controller.signal },\n bubbles: true,\n composed: true,\n }));\n }\n\n this.requestUpdate();\n }\n\n #onLabelClick(index: number, event: MouseEvent) {\n event.preventDefault();\n event.stopPropagation();\n this.#closeDropdown();\n\n const segments = this.#getSegments();\n const truncatedSegments = segments.slice(0, index + 1);\n const hadLeading = this.path.startsWith(this.separator);\n const newPath = truncatedSegments.join(this.separator);\n this.path = hadLeading ? this.separator + newPath : newPath;\n this._cachedSiblings = new Map();\n this._leafSegmentIndex = null;\n\n const parentPath = truncatedSegments.slice(0, -1).join(this.separator);\n this.dispatchEvent(new CustomEvent<CrumbNavNavigateDetail>(`navigate`, {\n detail: { index, label: truncatedSegments[index], parentPath, fullPath: newPath },\n bubbles: true,\n composed: true,\n }));\n }\n\n #selectSibling(index: number, segment: CrumbSegment): void {\n const cumPath = this._openCumPath;\n this.#closeDropdown();\n const segments = this.#getSegments();\n const rootSegments = this.#getRootSegments();\n let newSegments: string[];\n\n if (cumPath) {\n newSegments = [...cumPath.split(this.separator).filter(p => p.length > 0), segment.label];\n } else if (this.pathRoot.length > 0 && index < rootSegments.length) {\n newSegments = [...rootSegments.slice(0, index + 1), segment.label];\n } else {\n newSegments = [...rootSegments, ...segments.slice(0, index + 1 - rootSegments.length), segment.label];\n }\n\n const hadLeading = this.path.startsWith(this.separator);\n const newPath = newSegments.join(this.separator);\n this.path = hadLeading ? this.separator + newPath : newPath;\n this._cachedSiblings = new Map();\n const leafIndex = segment.isLeaf ? newSegments.length - 1 : null;\n this._leafSegmentIndex = leafIndex;\n if (segment.isLeaf) {\n this._confirmedLeafIndices.add(cumPath ?? ``);\n }\n const parentPath = newSegments.slice(0, -1).join(this.separator);\n this.dispatchEvent(new CustomEvent<CrumbNavNavigateDetail>(`navigate`, {\n detail: { index, label: segment.label, parentPath, fullPath: newPath },\n bubbles: true,\n composed: true,\n }));\n }\n\n #onSiblingClick(index: number, segment: CrumbSegment, event: MouseEvent) {\n event.preventDefault();\n event.stopPropagation();\n this.#selectSibling(index, segment);\n }\n\n #onDropdownKeyDown = (e: KeyboardEvent): void => {\n if (this._openIdx === null)\n return;\n const siblings = this._cachedSiblings.get(this._openCumPath ?? String(this._openIdx)) ?? [];\n if (!siblings.length) {\n if (e.key === `Escape`) {\n e.preventDefault(); this.#closeDropdown();\n }\n return;\n }\n switch (e.key) {\n case `ArrowDown`:\n e.preventDefault();\n this._dropdownActiveIndex = (this._dropdownActiveIndex + 1) % siblings.length;\n this.#scrollDropdownActiveIntoView();\n break;\n case `ArrowUp`:\n e.preventDefault();\n this._dropdownActiveIndex = this._dropdownActiveIndex <= 0\n ? siblings.length - 1\n : this._dropdownActiveIndex - 1;\n this.#scrollDropdownActiveIntoView();\n break;\n case `Enter`:\n if (this._dropdownActiveIndex >= 0) {\n e.preventDefault();\n this.#selectSibling(this._openIdx, siblings[this._dropdownActiveIndex]);\n }\n break;\n case `Escape`:\n e.preventDefault();\n this.#closeDropdown();\n break;\n }\n };\n\n #scrollDropdownActiveIntoView(): void {\n this.updateComplete.then(() => {\n this.shadowRoot?.querySelector(`.crumb-option.active`)\n ?.scrollIntoView({ block: `nearest` });\n });\n }\n\n #renderDropdownContent(index: number) {\n const siblings = this._cachedSiblings.get(this._openCumPath ?? String(index)) ?? [];\n const isPending = this.#pendingIndex === index;\n\n return html`\n ${isPending ? html`<span class=\"loading-spinner\"></span>` : nothing}\n ${siblings.length === 0 && !isPending\n ? html`<span class=\"crumb-option crumb-option-label\">No items</span>`\n : siblings.map((segment, i) => html`\n <div class=\"crumb-option ${i === this._dropdownActiveIndex ? `active` : ``}\"\n @click=${(e: MouseEvent) => this.#onSiblingClick(index, segment, e)}>\n ${segment.icon\n ? html`<ixfx-icon class=\"crumb-icon\" name=\"${segment.icon}\"></ixfx-icon>`\n : nothing}\n <span class=\"option-label\">${segment.label}</span>\n </div>\n `)}\n `;\n }\n\n #renderSegment(label: string, index: number, isLast: boolean) {\n const isOpen = this._openIdx === index;\n const cumPath = this.#getCumulativePath(index, false);\n\n return html`\n <div class=\"seg\" data-cumulative=${cumPath} @click=${(e: MouseEvent) => this.#onSegmentClick(index, e)}>\n <label title=${label} @click=${(e: MouseEvent) => this.#onLabelClick(index, e)}>\n ${label}\n </label>\n ${(!isLast || this.siblingLookup) && this._leafSegmentIndex !== index\n ? html`\n <div class=\"caret ${isOpen ? `open` : ``} ${this._confirmedLeafIndices.has(cumPath) ? `disabled` : ``}\"\n style=\"anchor-name: ${this.#anchorName(cumPath)}\"\n data-cumulative=${cumPath}\n @click=${(e: MouseEvent) => this.#onCaretClick(index, e)}>\n ${this.separator}\n </div>\n `\n : nothing}\n </div>\n `;\n }\n\n #renderRootSegment(label: string, index: number) {\n const rootSegments = this.#getRootSegments();\n const isLast = index === rootSegments.length - 1;\n const isOpen = this._openIdx === index;\n const cumPath = this.#getCumulativePath(index, true);\n\n return html`\n <div class=\"seg seg-root\" data-cumulative=${cumPath} @click=${(e: MouseEvent) => this.#onRootSegmentClick(index, e)}>\n <label title=${label}>${label}</label>\n ${isLast && this.siblingLookup\n ? html`\n <div class=\"caret ${isOpen ? `open` : ``} ${this._confirmedLeafIndices.has(cumPath) ? `disabled` : ``}\"\n style=\"anchor-name: ${this.#anchorName(cumPath)}\"\n data-cumulative=${cumPath}\n @click=${(e: MouseEvent) => this.#onCaretClick(index, e)}>\n ${this.separator}\n </div>\n `\n : nothing}\n </div>\n `;\n }\n\n #onRootSegmentClick(index: number, event: MouseEvent): void {\n event.preventDefault();\n event.stopPropagation();\n const rootSegments = this.#getRootSegments();\n const newPath = rootSegments.slice(0, index + 1).join(this.separator);\n this.setPath(newPath);\n }\n\n #onSegmentClick(index: number, event: MouseEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.#closeDropdown();\n this._editing = true;\n this._editStartIndex = index;\n }\n\n #onTrailingClick() {\n this.#closeDropdown();\n this._editing = true;\n this._editStartIndex = null;\n }\n\n #makeCompletionProvider() {\n return async (query: string, signal: AbortSignal): Promise<AcTextItem[]> => {\n if (!this.siblingLookup)\n return [];\n const endsWithSep = query.endsWith(this.separator);\n const parts = query.split(this.separator).filter(p => p.length > 0);\n const parentSegments = endsWithSep ? parts : parts.slice(0, -1);\n const lastSegment = endsWithSep ? `` : (parts.at(-1) ?? ``);\n const hadLeading = query.startsWith(this.separator);\n const children = await this.siblingLookup(\n parentSegments,\n parentSegments.length - 1,\n signal,\n );\n return children\n .filter(c => c.label.toLowerCase().startsWith(lastSegment.toLowerCase()))\n .map((c) => {\n const joined = [...parentSegments, c.label].join(this.separator);\n return { label: hadLeading ? this.separator + joined : joined, icon: c.icon, isLeaf: c.isLeaf };\n });\n };\n }\n\n #onAcChange(e: AcTextChangeEvent) {\n e.stopPropagation();\n const newPath = e.detail.value;\n this.path = newPath;\n this._cachedSiblings = new Map();\n this._leafSegmentIndex = newPath.endsWith(this.separator) ? null : newPath.split(this.separator).filter((p: string) => p.length > 0).length - 1;\n this._editing = false;\n this._editingCancelled = false;\n this._editStartIndex = null;\n this.#dispatchChangeEvent(newPath);\n }\n\n #onAcFocusOut() {\n if (this._editing) {\n this._editing = false;\n if (!this._editingCancelled) {\n const el = this.shadowRoot?.querySelector(`ixfx-ac-text`) as any;\n const newPath = el?.value ?? this.path;\n if (newPath !== this.path) {\n this.path = newPath;\n this._cachedSiblings = new Map();\n this._leafSegmentIndex = newPath.endsWith(this.separator) ? null : newPath.split(this.separator).filter((p: string) => p.length > 0).length - 1;\n this.#dispatchChangeEvent(newPath);\n }\n }\n this._editingCancelled = false;\n this._editStartIndex = null;\n }\n }\n\n #dispatchChangeEvent(newPath: string): void {\n const segments = newPath.split(this.separator).filter(p => p.length > 0);\n const label = segments.at(-1) ?? ``;\n const parentPath = segments.slice(0, -1).join(this.separator);\n this.dispatchEvent(new CustomEvent<CrumbNavChangeDetail>(`change`, {\n detail: { label, parentPath, fullPath: newPath },\n bubbles: true,\n composed: true,\n }));\n }\n\n #onAcKeyDown(e: KeyboardEvent) {\n if (e.key === `Escape`) {\n this._editingCancelled = true;\n this._editing = false;\n this._editStartIndex = null;\n }\n }\n\n #onHostKeyDown = (e: KeyboardEvent): void => {\n if (this._editing)\n return;\n const nonEditKeys = [`ArrowUp`, `ArrowDown`, `ArrowLeft`, `ArrowRight`, `Enter`];\n if (!nonEditKeys.includes(e.key)) {\n this._editing = true;\n }\n };\n\n protected override render() {\n const segments = this.#getSegments();\n\n if (this._editing) {\n const editValue = this.path;\n return html`\n <ixfx-ac-text\n .value=${editValue}\n .tabSuffix=${this.separator}\n .completionProvider=${this.#makeCompletionProvider()}\n @change=${this.#onAcChange}\n @focusout=${this.#onAcFocusOut}\n @keydown=${this.#onAcKeyDown}\n ></ixfx-ac-text>\n `;\n }\n\n const rootSegments = this.#getRootSegments();\n const leadingCaret = this.siblingLookup && rootSegments.length === 0\n ? html`\n <div class=\"caret ${this._openIdx === -1 ? `open` : ``} ${this._confirmedLeafIndices.has(``) ? `disabled` : ``}\"\n style=\"anchor-name: ${this.#anchorName(``)}\"\n data-cumulative=\"\"\n @click=${(e: MouseEvent) => this.#onCaretClick(-1, e)}>\n ${this.separator}\n </div>`\n : nothing;\n\n return html`\n <div class=\"crumbs\" tabindex=\"0\" @keydown=${this.#onHostKeyDown}>\n ${rootSegments.length > 0\n ? rootSegments.map((label, i) => this.#renderRootSegment(label, i))\n : nothing}\n ${leadingCaret}\n ${segments.map((label, i) =>\n this.#renderSegment(label, i, i === segments.length - 1),\n )}\n <div class=\"trailing\" @click=${this.#onTrailingClick}></div>\n </div>\n ${this._openIdx !== null\n ? html`\n <div class=\"crumb-dropdown popup-surface\" popover=\"auto\" tabindex=\"-1\"\n @toggle=${this.#onPopoverToggle}\n @keydown=${this.#onDropdownKeyDown}\n @click=${(e: Event) => e.stopPropagation()}>\n ${this.#renderDropdownContent(this._openIdx)}\n </div>\n `\n : nothing}\n `;\n }\n\n static override styles = [prominenceStyles, themeFallbacks, popupSurfaceStyles, css`\n :host {\n --text-highlight: var(--accent);\n --separator: var(--surface-muted-text);\n --padding-s: var(--space-xs);\n --padding-m: var(--space-s);\n --hover-bg: var(--surface-5);\n --hover-fg: var(--surface-5-text);\n\n display: flex;\n width: 100%;\n gap: var(--padding-s);\n position: relative;\n }\n\n ixfx-ac-text {\n flex: 1;\n font-size: inherit;\n --ac-input-padding: var(--padding-s) var(--padding-m);\n --ac-input-background: var(--surface-4);\n --ac-input-border-radius: var(--radius-s, 3px);\n --ac-popup-font-size: var(--text-s, 11px);\n }\n\n .crumbs {\n display: flex;\n width: 100%;\n overflow-x:scroll;\n scroll-snap-type:x proximity;\n scrollbar-width: none;\n }\n\n .trailing {\n flex: 1;\n min-width: 1em;\n cursor: text;\n }\n\n .seg {\n scroll-snap-align:start;\n\n position: relative;\n cursor: pointer;\n display: flex;\n flex-wrap: nowrap;\n align-items: center;\n user-select: none;\n pointer-events: auto;\n }\n\n .seg:hover {\n overflow: unset;\n }\n\n .seg-root {\n opacity: var(--prominence-idle-opacity);\n }\n\n .seg-root:hover {\n opacity: var(--prominence-tickled-opacity);\n }\n\n .seg-root label {\n font-weight: normal;\n }\n\n label {\n display: flex;\n align-items: center;\n white-space: nowrap;\n text-overflow: ellipsis;\n align-content: center;\n overflow: hidden;\n padding: 0 var(--padding-m);\n transition: all 0.2s ease-in-out;\n border-radius: var(--radius-m);\n }\n\n label:hover,.caret:hover {\n color: var(--item-text-tickled);\n background: var(--item-bg-tickled);\n }\n\n .caret {\n scroll-snap-align:start;\n\n position: relative;\n padding: var(--padding-m);\n transition: all 0.2s ease-in-out;\n\n border-radius: var(--radius-m);\n }\n\n\n .caret.open {\n background: color-mix(in srgb, var(--hover-bg) 40%, transparent);\n }\n\n .caret.disabled {\n opacity: var(--prominence-disabled-opacity);\n cursor: not-allowed;\n }\n\n .crumb-icon {\n width: 1em;\n height: 1em;\n flex-shrink: 0;\n }\n\n .crumb-dropdown {\n /* Reset popover UA defaults */\n inset: unset;\n margin: 0;\n\n /* Anchor positioning — position-anchor set dynamically via JS */\n position: fixed;\n position-area: block-end span-inline-end;\n position-try-fallbacks: flip-block, flip-inline, flip-block flip-inline;\n margin-block-start: 2px;\n\n min-width: 10ch;\n max-width: min(40ch, 80vw);\n max-height: 280px;\n overflow-y: auto;\n padding: var(--padding-s);\n outline: none;\n }\n\n .crumb-option {\n display: flex;\n align-items: center;\n gap: var(--padding-s);\n padding: var(--padding-s) var(--padding-m);\n cursor: pointer;\n border-radius: var(--radius-s, 4px);\n transition: background 0.15s ease-out;\n overflow: hidden;\n }\n\n .crumb-option:hover,\n .crumb-option.active {\n background: var(--hover-bg);\n color: var(--hover-fg);\n }\n\n .option-label {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n .crumb-option-label {\n font-style: italic;\n opacity: 0.6;\n pointer-events: none;\n user-select: none;\n }\n\n .loading-spinner {\n display: inline-block;\n width: 12px;\n height: 12px;\n border: 2px solid var(--surface-5);\n border-top-color: var(--accent);\n border-radius: 50%;\n animation: crumb-spin 0.7s linear infinite;\n }\n\n @keyframes crumb-spin {\n to { transform: rotate(360deg); }\n }\n `];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-crumb-path': CrumbPathElement;\n }\n}\n\nexport interface CrumbPathElementEventMap {\n navigate: CrumbNavNavigateEvent;\n change: CrumbNavChangeEvent;\n expand: CrumbNavExpandEvent;\n}\n\nexport interface CrumbPathElement {\n addEventListener: (<K extends keyof CrumbPathElementEventMap>(\n type: K,\n listener: (this: CrumbPathElement, event: CrumbPathElementEventMap[K]) => void,\n options?: boolean | AddEventListenerOptions,\n ) => void) & ((\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ) => void);\n}\n","/**\n * <ixfx-editable-number> — inline editable number label with Ableton-style drag.\n *\n * Extends <ixfx-editable-label> with:\n * • Pointer drag to adjust value — drag up to increase, down to decrease,\n * without entering full text-edit mode.\n * • Click gives focus; pressing any key while focused enters text-edit mode.\n * • Optional min/max clamping and step snapping.\n * • Optional fill-bar visualization behind the label text.\n *\n * Attributes:\n * min Minimum value (no clamping if unset)\n * max Maximum value (no clamping if unset)\n * step Snap increment, also informs decimal-place display (unset = no snapping)\n * drag-sensitivity Steps changed per pixel of drag (default: 1); multiply by step to get units/px\n * precision Decimal places applied when rounding drag-produced values (default: 0 = integers).\n * Has no effect when step is set (step implies its own precision).\n * Typed values are never precision-rounded — the user can always enter finer values.\n * fill-style 'linear' (default) or 'circular' — shape of the fill visualization\n * linear-style 'range' (default), 'bipolar', or 'unipolar' — how value maps to fill (linear mode only)\n * circular-style 'grow' (default), 'offset', or 'dot' — how value maps to fill (circular mode only)\n * no-drag Boolean — disables drag interaction; text editing still works\n *\n * CSS variables:\n * --fill-color Fill bar color (default: var(--accent))\n * --fill-opacity Fill bar opacity as 0..1 (default: 0.25)\n * --value Current normalized value (0..1)\n *\n * All CSS variables from <ixfx-editable-label> are also inherited.\n *\n * Events:\n * change — CustomEvent<{ value: string }>, bubbles + composed\n * Fired on text-edit commit AND on drag-end (if value changed).\n */\nimport type { CSSResult } from 'lit';\nimport type { EditableLabelChangeDetail } from './editable-label.js';\nimport { css, html } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { KEY_STEP_DIVISOR, resolveStep } from '../keyboard.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { prominenceStyles } from '../styles/prominence.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport { EditableLabel } from './editable-label.js';\n\nconst DRAG_THRESHOLD_PX = 3;\n\n@customElement(`ixfx-editable-number`)\nexport class EditableNumber extends EditableLabel {\n @property({ type: Number }) min?: number;\n @property({ type: Number }) max?: number;\n @property({ type: Number }) step?: number;\n @property({ type: Number, attribute: `drag-sensitivity` }) dragSensitivity = 1;\n @property({ attribute: `fill-style` }) fillStyle?: `linear` | `circular`;\n @property({ attribute: `linear-style` }) linearStyle?: `range` | `bipolar` | `unipolar`;\n @property({ attribute: `circular-style` }) circularStyle?: `grow` | `offset` | `dot`;\n @property({ type: Boolean, attribute: `no-drag` }) noDrag = false;\n @property({ type: Number }) precision = 0;\n\n // ── Drag state (not reactive — managed imperatively to avoid Lit cycles) ──\n #dragStartY = 0;\n #dragStartValue = 0;\n #dragging = false;\n #hasDragged = false;\n #dragCurrentValue = 0;\n #lastInputValue = ``;\n #firstUpdateComplete = false;\n\n constructor() {\n super();\n // Override parent defaults for a number input context\n this.mode = `editor`;\n this.entryMode = `number`;\n this.value = `0`;\n }\n\n // ── Render ───────────────────────────────────────────────────────────────────\n\n override render() {\n return html`\n ${this.fillStyle ? html`<div class=\"track\"></div>` : ``}\n ${this.fillStyle ? html`<div class=\"value\"><div class=\"bar\"></div></div>` : ``}\n <div\n class=\"number\"\n part=\"content\"\n tabindex=\"${this.disabled ? -1 : 0}\"\n contenteditable=\"${this._editing ? `plaintext-only` : `false`}\"\n data-placeholder=\"${this.placeholder}\"\n @click=${this._handleClick}\n @focus=${this._handleFocus}\n @blur=${this._handleBlur}\n @keydown=${this._handleKeydown}\n @beforeinput=${this._handleBeforeInput}\n @input=${this._stopNativeInput}\n ></div>\n `;\n }\n\n private _stopNativeInput = (e: Event): void => {\n e.stopPropagation();\n };\n\n // ── Lifecycle ─────────────────────────────────────────────────────────────\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener(`pointerdown`, this._onPointerDown);\n this.addEventListener(`pointermove`, this._onPointerMove);\n this.addEventListener(`pointerup`, this._onPointerUp);\n this.addEventListener(`keydown`, this._onKeyDown);\n this.addEventListener(`click`, this._interceptClick, { capture: true });\n this.addEventListener(`mouseenter`, this._handleMouseEnter);\n this.addEventListener(`mouseleave`, this._handleMouseLeave);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener(`pointerdown`, this._onPointerDown);\n this.removeEventListener(`pointermove`, this._onPointerMove);\n this.removeEventListener(`pointerup`, this._onPointerUp);\n this.removeEventListener(`keydown`, this._onKeyDown);\n this.removeEventListener(`click`, this._interceptClick);\n this.removeEventListener(`mouseenter`, this._handleMouseEnter);\n this.removeEventListener(`mouseleave`, this._handleMouseLeave);\n }\n\n private _handleMouseEnter = (): void => {\n if (this.displayTextLogic !== `transient` || this._editing)\n return;\n this._hovering = true;\n this._clearTransientTimer();\n this._transientTimer = window.setTimeout(() => {\n this._transientShowingValue = true;\n this._requestDisplayUpdate();\n }, this.appearDelay);\n };\n\n private _handleMouseLeave = (): void => {\n if (this.displayTextLogic !== `transient` || this._editing)\n return;\n this._hovering = false;\n this._clearTransientTimer();\n if (this._transientShowingValue) {\n this._transientTimer = window.setTimeout(() => {\n if (!this._hovering) {\n this._transientShowingValue = false;\n this._requestDisplayUpdate();\n }\n }, this.disappearDelay);\n }\n };\n\n // ── Override parent interaction — focus only, edit via keypress ───────────\n\n /** Click just focuses; edit mode is entered by pressing a key while focused. */\n protected _handleClick = (): void => {\n if (this.disabled)\n return;\n this.renderRoot?.querySelector<HTMLElement>(`.number`)?.focus();\n };\n\n /** Suppress auto-edit-on-focus from editor mode; keydown handles it instead. */\n protected override _handleFocus = (): void => { /* intentional no-op */ };\n\n /** Override to use .number instead of .content for text display */\n protected get _contentEl(): HTMLElement | undefined {\n const el = this.renderRoot?.querySelector<HTMLElement>(`.number`);\n return el ?? undefined;\n }\n\n override firstUpdated(changedProperties: Map<string, unknown>): void {\n super.firstUpdated(changedProperties);\n // For 'show' mode, start by showing displayText at rest\n if (this.displayTextLogic === `show`) {\n this._showModeWaitingToHide = true;\n }\n this._updateValueCss(this._normalizedValue());\n this._requestDisplayUpdate();\n }\n\n protected _onUserInteraction(): void {\n if (this.displayTextLogic === `show` && !this._editing) {\n this._clearTransientTimer();\n this._showModeWaitingToHide = false;\n this._requestDisplayUpdate();\n this._transientTimer = window.setTimeout(() => {\n this._showModeWaitingToHide = true;\n this._requestDisplayUpdate();\n }, this.disappearDelay);\n return;\n }\n if (this.displayTextLogic === `transient` && !this._editing) {\n this._clearTransientTimer();\n this._transientShowingValue = true;\n this._requestDisplayUpdate();\n this._transientTimer = window.setTimeout(() => {\n if (!this._hovering) {\n this._transientShowingValue = false;\n this._requestDisplayUpdate();\n }\n }, this.disappearDelay);\n return;\n }\n super._onUserInteraction();\n }\n\n private _onValueChange(): void {\n if (this.displayTextLogic !== `show` || this._editing)\n return;\n\n this._clearTransientTimer();\n this._showModeWaitingToHide = false;\n this._requestDisplayUpdate();\n this._transientTimer = window.setTimeout(() => {\n this._showModeWaitingToHide = true;\n this._requestDisplayUpdate();\n }, this.disappearDelay);\n }\n\n override updated(changedProperties: Map<string, unknown>): void {\n super.updated(changedProperties);\n // Note: We do NOT call _onValueChange here for 'show' mode.\n // The parent class handles display updates via _requestDisplayUpdate\n // in firstUpdated. Additional value changes are handled via\n // drag/keyboard events that call _onValueChange directly.\n if (!this._editing) {\n this._updateValueCss(this._normalizedValue());\n }\n }\n\n private _updateValueCss(normalized: number): void {\n this.style.setProperty(`--value`, String(normalized));\n\n let valueStart = 0;\n let valueEnd = normalized;\n\n if (this.linearStyle === `bipolar`) {\n if (normalized <= 0.5) {\n valueStart = normalized;\n valueEnd = 0.5;\n } else {\n valueStart = 0.5;\n valueEnd = normalized;\n }\n } else if (this.linearStyle === `unipolar`) {\n valueStart = 0.5 - normalized * 0.5;\n valueEnd = 0.5 + normalized * 0.5;\n }\n\n this.style.setProperty(`--value-start`, String(valueStart));\n this.style.setProperty(`--value-end`, String(valueEnd));\n\n // For circular offset mode, compute pixel offset from center\n // and set component dimensions for radius calculation\n if (this.fillStyle === `circular` && this.circularStyle === `offset`) {\n const h = this.offsetHeight;\n const w = this.offsetWidth;\n const r = h / 2 - 2; // radius with margin to prevent clipping at top/bottom\n // Circle edges must stay 2px inside component edges:\n // - at value=0: circle left edge at 2px\n // - at value=1: circle right edge at w-2px\n const leftEdge = 2;\n const rightEdge = w - 2;\n const valueCenterPx = leftEdge + r + normalized * (rightEdge - leftEdge - 2 * r);\n this.style.setProperty(`--radius`, `${r}px`);\n this.style.setProperty(`--value-center-px`, `${valueCenterPx}px`);\n this.style.setProperty(`--component-width-px`, `${w}px`);\n this.style.setProperty(`--component-height-px`, `${h}px`);\n }\n }\n\n protected override _getDisplayText(): string {\n // In override mode, always show displayText (even when dragging or editing)\n if (this._shouldUseDisplayText()) {\n return this.displayText ?? ``;\n }\n // For transient mode, show the drag value while dragging\n if (this.#dragging) {\n const formatted = this.step !== undefined\n ? this._formatNumber(this.#dragCurrentValue)\n : this.#dragCurrentValue.toFixed(this.precision);\n return this.formatter ? this.formatter(formatted) : formatted;\n }\n // Normal case: when a custom formatter is set, pass raw value so formatter\n // can apply its own precision logic (e.g. \"0.5\" → \"50%\" without precision loss)\n if (this.formatter) {\n const raw = Number.parseFloat(this.value);\n return this.formatter(Number.isNaN(raw) ? this.value : String(raw));\n }\n return this._formatDisplay();\n }\n\n // ── Clamp before parent commits (overrides parent's private _tryCommit) ──\n\n protected override _tryCommit(): void {\n const el = this.renderRoot?.querySelector<HTMLElement>(`.number`);\n if (el) {\n const n = Number.parseFloat(el.textContent?.trim() ?? ``);\n if (!Number.isNaN(n)) {\n el.textContent = this._formatNumber(this._clamp(this._snap(n)));\n }\n }\n super._tryCommit();\n }\n\n // ── Override parent's input handling — fire 'input' events on each keypress ──\n\n protected override _handleBeforeInput = (e: InputEvent): void => {\n if (e.inputType !== `insertText` || !e.data) {\n return;\n }\n\n if (!this._isAllowedInput(e.data)) {\n e.preventDefault();\n return;\n }\n\n const contentEl = this._contentEl;\n if (!contentEl) {\n return;\n }\n\n const currentContent = contentEl.textContent ?? ``;\n const insertPosition = (contentEl as HTMLInputElement).selectionStart ?? currentContent.length;\n const newValue = currentContent.slice(0, insertPosition) + e.data + currentContent.slice(insertPosition);\n\n if (newValue !== this.#lastInputValue) {\n this.#lastInputValue = newValue;\n this.dispatchEvent(new CustomEvent(`input`, {\n detail: { value: newValue },\n bubbles: true,\n composed: true,\n }));\n }\n };\n\n protected override _handleKeydown = (e: KeyboardEvent): void => {\n if (!this._editing) {\n return;\n }\n\n if (e.key === `Enter`) {\n e.preventDefault();\n this._tryCommit();\n if (this.mode === `editor`)\n this._contentEl?.blur();\n } else if (e.key === `Escape`) {\n e.preventDefault();\n this.dispatchEvent(new CustomEvent(`cancelled`, {\n detail: { value: this._prevValue },\n bubbles: true,\n composed: true,\n }));\n this._cancelEdit();\n this.dispatchEvent(new CustomEvent(`change`, {\n detail: { value: this._prevValue },\n bubbles: true,\n composed: true,\n }));\n if (this.mode === `editor`)\n this._contentEl?.blur();\n }\n };\n\n // ── Drag event handlers ───────────────────────────────────────────────────\n\n private _onKeyDown = (e: KeyboardEvent): void => {\n if (this._editing || this.disabled)\n return;\n\n if (this._handleArrowKey(e)) {\n return;\n }\n\n // Printable characters while focused → enter edit mode.\n // Enter is intentionally excluded: the parent handles Enter for commit,\n // and including it here would re-enter edit mode immediately after commit.\n if (e.key.length === 1) {\n this._onUserInteraction();\n this._beginEdit();\n }\n };\n\n private _handleArrowKey(e: KeyboardEvent): boolean {\n const range = (this.max ?? 100) - (this.min ?? 0);\n if (range === 0)\n return false;\n\n const shiftDivisor = e.shiftKey ? KEY_STEP_DIVISOR : 1;\n const effectiveStep = resolveStep(range, undefined, this.step) / shiftDivisor;\n\n let delta = 0;\n let handled = false;\n\n switch (e.key) {\n case `ArrowUp`:\n case `ArrowRight`:\n delta = effectiveStep;\n handled = true;\n break;\n case `ArrowDown`:\n case `ArrowLeft`:\n delta = -effectiveStep;\n handled = true;\n break;\n case `Home`:\n delta = -(this._parseValue() - (this.min ?? 0));\n handled = true;\n break;\n case `End`:\n delta = (this.max ?? 0) - this._parseValue();\n handled = true;\n break;\n }\n\n if (handled) {\n e.preventDefault();\n const prev = this.value;\n const current = this._parseValue();\n const newValue = this._clamp(this._snap(current + delta));\n\n const newValueStr = this.step !== undefined\n ? this._formatNumber(newValue)\n : newValue.toFixed(this.precision);\n\n this.value = newValueStr;\n\n this._requestDisplayUpdate();\n this._updateValueCss(this._normalizedValue(newValue));\n\n if (newValueStr !== prev) {\n this.dispatchEvent(new CustomEvent(`input`, {\n detail: { value: newValueStr },\n bubbles: true,\n composed: true,\n }));\n }\n\n requestAnimationFrame(() => {\n if (this.value !== prev) {\n this.dispatchEvent(new CustomEvent<EditableLabelChangeDetail>(`change`, {\n detail: { value: this.value },\n bubbles: true,\n composed: true,\n }));\n }\n });\n\n return true;\n }\n\n return false;\n }\n\n private _onPointerDown = (e: PointerEvent): void => {\n if (e.button !== 0)\n return; // left button only\n if (this._editing)\n return; // let contenteditable handle it\n if (this.disabled || this.noDrag)\n return;\n e.preventDefault(); // suppress browser text-select / native drag\n this.renderRoot?.querySelector<HTMLElement>(`.number`)?.focus(); // restore focus manually\n\n this.#dragStartY = e.clientY;\n this.#dragStartValue = this._parseValue();\n this.#dragCurrentValue = this.#dragStartValue;\n this.#dragging = false;\n this.#hasDragged = false;\n this.setPointerCapture(e.pointerId);\n };\n\n private _onPointerMove = (e: PointerEvent): void => {\n if (!(e.buttons & 1))\n return; // left button must be held\n if (this._editing)\n return;\n if (this.disabled || this.noDrag)\n return;\n\n const deltaY = this.#dragStartY - e.clientY; // up = positive\n if (!this.#dragging && Math.abs(deltaY) < DRAG_THRESHOLD_PX)\n return;\n\n this.#dragging = true;\n this.#hasDragged = true;\n this.toggleAttribute(`dragging`, true);\n this._onUserInteraction();\n\n const raw = this.#dragStartValue + deltaY * this.dragSensitivity * (this.step || 1);\n const snapped = this._clamp(this._snap(raw));\n // When step is set, snapping already gives the right precision.\n // When step is unset, round to `precision` decimal places.\n this.#dragCurrentValue = this.step !== undefined\n ? snapped\n : Number.parseFloat(snapped.toFixed(this.precision));\n\n const dragValueStr = this.step !== undefined\n ? this._formatNumber(this.#dragCurrentValue)\n : this.#dragCurrentValue.toFixed(this.precision);\n\n if (dragValueStr !== this.#lastInputValue) {\n this.#lastInputValue = dragValueStr;\n this.dispatchEvent(new CustomEvent(`input`, {\n detail: { value: dragValueStr },\n bubbles: true,\n composed: true,\n }));\n }\n\n // Update display using parent's displayTextLogic handling\n this._requestDisplayUpdate();\n this._updateValueCss(this._normalizedValue(this.#dragCurrentValue));\n };\n\n private _onPointerUp = (e: PointerEvent): void => {\n if (this.hasPointerCapture(e.pointerId))\n this.releasePointerCapture(e.pointerId);\n if (!this.#dragging)\n return;\n if (this.disabled || this.noDrag)\n return;\n\n this.#dragging = false;\n this.toggleAttribute(`dragging`, false);\n // Format with step-based or precision-based dp so trailing zeros are preserved\n // in the stored string (e.g. \"5.0\" when precision=1, not \"5\").\n const finalStr = this.step !== undefined\n ? this._formatNumber(this.#dragCurrentValue)\n : this.#dragCurrentValue.toFixed(this.precision);\n const prev = this.value;\n this.value = finalStr;\n if (finalStr !== prev) {\n this.dispatchEvent(new CustomEvent<EditableLabelChangeDetail>(`change`, {\n detail: { value: finalStr },\n bubbles: true,\n composed: true,\n }));\n }\n };\n\n private _interceptClick = (e: MouseEvent): void => {\n if (this.#hasDragged) {\n e.stopImmediatePropagation();\n this.#hasDragged = false;\n }\n };\n\n // ── Number helpers ────────────────────────────────────────────────────────\n\n private _parseValue(): number {\n return Number.parseFloat(this.value) || 0;\n }\n\n /**\n * Formats the stored value for display, inferring decimal places from the value\n * string itself. This preserves typed precision (e.g. \"0.1234\" stays \"0.1234\")\n * and also respects trailing zeros written by drag storage (e.g. \"5.0\" stays \"5.0\").\n */\n private _formatDisplay(): string {\n const n = Number.parseFloat(this.value);\n if (Number.isNaN(n))\n return this.value;\n if (this.precision !== undefined) {\n return n.toFixed(this.precision);\n }\n const dot = this.value.indexOf(`.`);\n const dp = dot >= 0 ? this.value.length - dot - 1 : 0;\n return n.toFixed(dp);\n }\n\n private _clamp(n: number): number {\n if (this.min !== undefined)\n n = Math.max(this.min, n);\n if (this.max !== undefined)\n n = Math.min(this.max, n);\n return n;\n }\n\n private _snap(n: number): number {\n if (!this.step)\n return n;\n return Math.round(n / this.step) * this.step;\n }\n\n private _inferDecimals(n?: number): number {\n if (this.step !== undefined) {\n const s = String(this.step);\n const dot = s.indexOf(`.`);\n return dot >= 0 ? s.length - dot - 1 : 0;\n }\n // No step set: infer from the value being formatted so floats are preserved\n const s = String(n ?? this._parseValue());\n const dot = s.indexOf(`.`);\n return dot >= 0 ? s.length - dot - 1 : 0;\n }\n\n private _formatNumber(n: number): string {\n return n.toFixed(this._inferDecimals(n));\n }\n\n /** Returns a 0..1 fraction for the given value within [min, max]. */\n private _normalizedValue(n = this._parseValue()): number {\n if (this.min === undefined || this.max === undefined)\n return 0;\n if (this.max === this.min)\n return 0;\n return Math.max(0, Math.min(1, (n - this.min) / (this.max - this.min)));\n }\n\n // ── Styles ───────────────────────────────────────────────────────────────\n\n static override styles: CSSResult[] = [\n themeFallbacks,\n prominenceStyles,\n ...EditableLabel.styles,\n css`\n :host {\n font-size: var(--text-s,11px);\n --value: 0;\n --value-start: 0;\n --value-end: 0;\n --_fill-color-alpha: color-mix(\n in oklch,\n var(--fill-color, var(--accent, oklch(60% 0.15 140))) calc(var(--fill-opacity, 0.25) * 100%),\n transparent\n );\n }\n\n /* ── Layout (when fill-style is enabled) ── */\n :host([fill-style]) {\n display: grid;\n position: relative;\n grid-template-columns: 1fr;\n grid-template-rows: 1fr;\n min-height: 1.5em;\n min-width: 5em;\n }\n\n :host([fill-style]) .track,\n :host([fill-style]) .value {\n grid-area: 1 / 1;\n position: absolute;\n inset: 0;\n }\n\n /* Track background styling */\n :host([fill-style]) .track {\n z-index: 0;\n background: var(--surface-4, oklch(22% 0.02 240));\n border: var(--border, 1px solid oklch(25% 0.02 240));\n }\n\n :host([fill-style]) .value {\n z-index: 1;\n }\n\n :host([fill-style=\"linear\"]) .track {\n border-radius: var(--radius-s, 3px);\n }\n\n :host([fill-style=\"circular\"]) .track {\n border-radius: 50%;\n overflow: hidden;\n }\n\n /* Linear: all linear-styles use .bar positioned via --value-start and --value-end */\n :host([fill-style=\"linear\"]) .value {\n overflow: hidden;\n }\n\n :host([fill-style=\"linear\"]) .bar {\n position: absolute;\n top: 0;\n bottom: 0;\n left: calc(var(--value-start, 0) * 100%);\n width: calc((var(--value-end, 0) - var(--value-start, 0)) * 100%);\n background: var(--fill-image, var(--_fill-color-alpha));\n }\n\n /* Circular grow: filled circle growing from center */\n :host([fill-style=\"circular\"][circular-style=\"grow\"]) .value,\n :host([fill-style=\"circular\"]:not([circular-style])) .value {\n background: var(--fill-image, var(--_fill-color-alpha));\n clip-path: circle(calc(var(--value) * 50%) at 50% 50%);\n }\n\n /* Circular offset: value circle slides left/right from center.\n Track circle is centered, filling the height.\n Value circle is same size, offset by --value-offset-px.\n At value=0.5: value circle centered on track (invisible when overlaid)\n At value=0: value circle at far left\n At value=1: value circle at far right\n */\n :host([fill-style=\"circular\"][circular-style=\"offset\"]) {\n min-width: 80px;\n min-height: 26px;\n overflow: hidden;\n }\n\n :host([fill-style=\"circular\"][circular-style=\"offset\"]) .track {\n position: absolute;\n top: 50%;\n border-radius: 50%;\n background: var(--surface-4, oklch(22% 0.02 240));\n border: var(--border, 1px solid oklch(25% 0.02 240));\n width: calc(var(--radius, 11px) * 2);\n height: calc(var(--radius, 11px) * 2);\n left: 50%;\n transform: translate(-50%, -50%);\n }\n\n :host([fill-style=\"circular\"][circular-style=\"offset\"]) .value {\n position: absolute;\n top: 50%;\n background: var(--fill-image, var(--_fill-color-alpha));\n border-radius: 50%;\n width: calc(var(--radius, 11px) * 2);\n height: calc(var(--radius, 11px) * 2);\n transform: translate(calc(var(--value-center-px, 13px) - var(--radius, 11px)), -50%);\n }\n\n :host([fill-style=\"circular\"][circular-style=\"offset\"]) .number {\n border-radius: 0;\n }\n\n /* Circular dot: full circle */\n :host([fill-style=\"circular\"][circular-style=\"dot\"]) .value {\n background: var(--fill-image, var(--_fill-color-alpha));\n }\n\n /* ── Number (top layer - text display) ── */\n :host([fill-style]) .number {\n position: absolute;\n inset: 0;\n z-index: 2;\n display: flex;\n align-items: center;\n justify-content: center;\n font-family: inherit;\n font-size: inherit;\n color: inherit;\n padding: var(--space-xs, 3px) var(--space-s, 4px);\n }\n\n :host([fill-style=\"circular\"]) .number {\n border-radius: 50%;\n }\n\n /* Drag cursor + no text selection while not in text-edit mode */\n :host(:not([disabled]):not([no-drag])) .number:not([contenteditable=\"plaintext-only\"]) {\n cursor: ns-resize;\n user-select: none;\n -webkit-user-select: none;\n touch-action: none;\n }\n\n /* Focus outline */\n :host .number {\n outline: none;\n }\n\n :host .number:focus-visible {\n outline: 2px solid var(--accent);\n outline-offset: 2px;\n }\n\n /* ── Circular host sizing ── */\n :host([fill-style=\"circular\"][circular-style=\"grow\"]),\n :host([fill-style=\"circular\"]:not([circular-style])) {\n aspect-ratio: 1;\n }\n `,\n ];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-editable-number': EditableNumber;\n }\n}\n","/* eslint-disable ts/no-unsafe-declaration-merging */\nimport type { CommandId } from '@clinth/ui-commands';\nimport type { PropertyValues } from 'lit';\nimport type { IDataProvider } from '../common/data-provider.js';\nimport type {\n GroupedItemListerElementEventMap,\n GroupedSelectDetail,\n IGroupedSubComponent,\n SubComponentFactory,\n} from './types.js';\nimport { html, LitElement, nothing } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { repeat } from 'lit/directives/repeat.js';\nimport { DataController } from '../common/data-controller.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport '../panel/panel.js';\n\nexport type {\n GroupedItemListerElementEventMap,\n GroupedSelectDetail,\n GroupedSelectEvent,\n IGroupedSubComponent,\n IGroupedSubComponentEventMap,\n SubComponentActivateDetail,\n SubComponentActivateEvent,\n SubComponentFactory,\n SubComponentItemClickDetail,\n SubComponentItemClickEvent,\n SubComponentSelectDetail,\n SubComponentSelectEvent,\n SubComponentTickleDetail,\n SubComponentTickleEvent,\n} from './types.js';\n\nconst UNGROUPED_KEY = `__ungrouped__`;\n\n@customElement(`ixfx-grouped-item-lister`)\nexport class GroupedItemListerElement<T = unknown> extends LitElement {\n @property({ type: Boolean, reflect: true }) grouped = false;\n\n @property({ type: Boolean, attribute: `cross-group-selection`, reflect: true })\n crossGroupSelection = false;\n\n #groupBy: ((item: T) => string) | undefined;\n #factory: SubComponentFactory<T> | undefined;\n #subComponents = new Map<string, HTMLElement & IGroupedSubComponent<T>>();\n // Computed in render() and reused in updated() to avoid a second groupBy pass\n #renderedGroups: Map<string, T[]> | undefined;\n // Guard against re-entrant select events when we call clearSelection() on siblings\n #clearingSelection = false;\n\n readonly #data = new DataController<void, T>(this);\n\n // ---------------------------------------------------------------------------\n // JS-only properties (not HTML attributes — carry function/type information)\n // ---------------------------------------------------------------------------\n\n get groupBy(): ((item: T) => string) | undefined {\n return this.#groupBy;\n }\n\n set groupBy(value: ((item: T) => string) | undefined) {\n this.#groupBy = value;\n this.requestUpdate();\n }\n\n get factory(): SubComponentFactory<T> | undefined {\n return this.#factory;\n }\n\n set factory(value: SubComponentFactory<T> | undefined) {\n if (value === this.#factory)\n return;\n this.#clearSubComponents();\n this.#factory = value;\n this.requestUpdate();\n }\n\n get provider(): IDataProvider<void, T> | undefined {\n return this.#data.provider;\n }\n\n set provider(value: IDataProvider<void, T> | undefined) {\n this.#data.provider = value;\n if (value)\n this.#data.request(undefined);\n }\n\n // ---------------------------------------------------------------------------\n // Public API\n // ---------------------------------------------------------------------------\n\n /** The union of all selected items across every sub-component. */\n get selectedItems(): ReadonlySet<T> {\n const all = new Set<T>();\n for (const subEl of this.#subComponents.values()) {\n for (const item of subEl.selectedItems) {\n all.add(item);\n }\n }\n return all;\n }\n\n /**\n * Forward a command to all live sub-components.\n * Use this to propagate changes like sort order, filter state, or view mode.\n */\n dispatch(commandId: CommandId, args?: Record<string, unknown>): void {\n for (const subEl of this.#subComponents.values()) {\n subEl.dispatch(commandId, args);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Lit lifecycle\n // ---------------------------------------------------------------------------\n\n protected override createRenderRoot() {\n return this;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener(`select`, this.#onSelect as EventListener);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener(`select`, this.#onSelect as EventListener);\n }\n\n protected override updated(changed: PropertyValues): void {\n super.updated(changed);\n if (changed.has(`grouped`)) {\n this.#clearSubComponents();\n }\n this.#syncSubComponents();\n }\n\n protected override render() {\n if (!this.#factory)\n return nothing;\n\n if (!this.grouped) {\n return html`<div class=\"ungrouped-host\"></div>`;\n }\n\n if (!this.#groupBy)\n return nothing;\n\n // Store computed groups so updated() can reuse them without a second pass\n this.#renderedGroups = this.#computeGroups();\n return html`${repeat(\n this.#renderedGroups.keys(),\n key => key,\n key => html`<ixfx-panel data-group-key=${key} .title=${key}></ixfx-panel>`,\n )}`;\n }\n\n // ---------------------------------------------------------------------------\n // Internal — DOM management\n // ---------------------------------------------------------------------------\n\n #computeGroups(): Map<string, T[]> {\n const groups = new Map<string, T[]>();\n if (!this.#groupBy)\n return groups;\n for (const item of this.#data.items) {\n const key = this.#groupBy(item);\n let bucket = groups.get(key);\n if (!bucket) {\n bucket = [];\n groups.set(key, bucket);\n }\n bucket.push(item);\n }\n return groups;\n }\n\n #clearSubComponents(): void {\n for (const subEl of this.#subComponents.values()) {\n subEl.remove();\n }\n this.#subComponents.clear();\n }\n\n #syncSubComponents(): void {\n if (!this.#factory)\n return;\n\n if (!this.grouped) {\n this.#syncUngrouped();\n return;\n }\n\n if (!this.#groupBy)\n return;\n this.#syncGrouped();\n }\n\n #syncUngrouped(): void {\n const host = this.querySelector<HTMLElement>(`.ungrouped-host`);\n if (!host)\n return;\n\n let subEl = this.#subComponents.get(UNGROUPED_KEY);\n if (!subEl) {\n subEl = this.#factory!(undefined);\n host.appendChild(subEl);\n this.#subComponents.set(UNGROUPED_KEY, subEl);\n }\n subEl.setItems(this.#data.items);\n }\n\n #syncGrouped(): void {\n const groups = this.#renderedGroups ?? this.#computeGroups();\n\n // Remove sub-components for groups that no longer exist\n for (const key of [...this.#subComponents.keys()]) {\n if (!groups.has(key)) {\n this.#subComponents.get(key)?.remove();\n this.#subComponents.delete(key);\n }\n }\n\n // Mount or update sub-components per group.\n // Panels are already in the DOM at this point (rendered by Lit's repeat above).\n for (const [key, items] of groups) {\n const panel = [...this.children].find(\n el => el instanceof HTMLElement && (el as HTMLElement).dataset.groupKey === key,\n ) as HTMLElement | undefined;\n if (!panel)\n continue;\n\n let subEl = this.#subComponents.get(key);\n if (!subEl) {\n subEl = this.#factory!(key);\n panel.appendChild(subEl);\n this.#subComponents.set(key, subEl);\n }\n subEl.setItems(items);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Internal — selection coordination\n // ---------------------------------------------------------------------------\n\n #onSelect = (event: Event): void => {\n if (this.#clearingSelection)\n return;\n\n // Identify which sub-component fired the event.\n // With composed:true events from shadow-DOM sub-components, event.target is\n // retargeted to the shadow host (the sub-component element itself).\n const sourceEl = event.target as HTMLElement;\n let sourceKey: string | undefined;\n for (const [key, subEl] of this.#subComponents) {\n if (subEl === sourceEl) {\n sourceKey = key;\n break;\n }\n }\n\n // Not from a known sub-component — ignore\n if (sourceKey === undefined)\n return;\n\n if (this.grouped && !this.crossGroupSelection) {\n this.#clearingSelection = true;\n for (const [key, subEl] of this.#subComponents) {\n if (key !== sourceKey)\n subEl.clearSelection();\n }\n this.#clearingSelection = false;\n }\n\n this.dispatchEvent(\n new CustomEvent<GroupedSelectDetail<T>>(`grouped-select`, {\n detail: {\n selected: this.selectedItems,\n groupKey: sourceKey === UNGROUPED_KEY ? undefined : sourceKey,\n },\n bubbles: true,\n composed: true,\n }),\n );\n };\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-grouped-item-lister': GroupedItemListerElement;\n }\n}\n\nexport interface GroupedItemListerElement<T> {\n addEventListener: (<K extends keyof GroupedItemListerElementEventMap<T>>(\n type: K,\n listener: (this: GroupedItemListerElement<T>, event: GroupedItemListerElementEventMap<T>[K]) => void,\n options?: boolean | AddEventListenerOptions,\n ) => void) & ((\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ) => void);\n}\n","import type { CommandId } from '@clinth/ui-commands';\nimport type { TreeExclusivity, TreeInteractionMode, TreeItem, TreeNode, TreeSelectionFilter } from '../common/types.js';\nimport type { TreeBaseElement } from '../tree/tree-base.js';\nimport type { ListSelectionMode } from '../vertical-list/types.js';\nimport type {\n IGroupedSubComponent,\n SubComponentActivateDetail,\n SubComponentItemClickDetail,\n SubComponentSelectDetail,\n SubComponentTickleDetail,\n} from './types.js';\nimport '../tree/tree-list.js';\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport type TreeListAdapterOptions<T> = {\n /**\n * Returns the direct children of an item to build the tree hierarchy.\n * Omit for flat item lists — all items become leaf nodes at the root level.\n */\n getChildren?: (item: T) => readonly T[];\n\n /** Forwarded to the inner ixfx-tree-list. Default: `'standard'`. */\n interactionMode?: TreeInteractionMode;\n\n /**\n * Controls which node types are selectable.\n * Forwarded to the inner ixfx-tree-list. Default: `'all'`.\n */\n selectionFilter?: TreeSelectionFilter;\n\n /**\n * Controls how expanding one node affects its siblings.\n * Forwarded to the inner ixfx-tree-list. Default: `'none'`.\n */\n exclusivity?: TreeExclusivity;\n\n /**\n * Called when a command is dispatched via `ixfx-grouped-item-lister.dispatch()`.\n * Receives the inner `TreeBaseElement` (undefined until the first `setItems()` call)\n * so the handler can sort, filter, or otherwise manipulate the tree directly.\n */\n onDispatch?: (\n commandId: CommandId,\n args: Record<string, unknown> | undefined,\n tree: TreeBaseElement | undefined,\n ) => void;\n};\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\n/**\n * Creates an `HTMLElement` that implements `IGroupedSubComponent<T>` by wrapping\n * an `ixfx-tree-list` internally.\n *\n * `toTreeItem` converts each item `T` to display metadata (`key`, `label`, etc).\n * The adapter stores the original `T` in `TreeItem.data` and uses it to map\n * tree-node selections back to typed values.\n *\n * Unlike `createVerticalListAdapter`, items can be hierarchical: provide\n * `options.getChildren` to return each item's children and the adapter will\n * recursively build the `TreeNode` tree. Omit it for a flat list of leaf nodes.\n *\n * The four interface events (`select`, `activate`, `item-click`, `tickle`) are\n * intercepted at the tree level, re-typed from `TreeNode` → `T`, and re-dispatched\n * on the adapter element so `ixfx-grouped-item-lister` can identify the source.\n *\n * @example Flat item list:\n * ```ts\n * lister.factory = () =>\n * createTreeListAdapter<FileItem>(item => ({ key: item.id, label: item.name, isLeaf: true }));\n * ```\n *\n * @example Hierarchical items:\n * ```ts\n * lister.factory = () =>\n * createTreeListAdapter<Category>(\n * cat => ({ key: cat.id, label: cat.name }),\n * { getChildren: cat => cat.subCategories },\n * );\n * ```\n */\nexport function createTreeListAdapter<T>(\n toTreeItem: (item: T) => Omit<TreeItem, `data`>,\n options?: TreeListAdapterOptions<T>,\n): HTMLElement & IGroupedSubComponent<T> {\n const container = document.createElement(`div`);\n container.style.cssText = `display:contents;`;\n\n let treeEl: TreeBaseElement | undefined;\n\n // ---- Tree building ----\n\n function buildNode(item: T): TreeNode {\n const treeItem: TreeItem = { ...toTreeItem(item), data: item };\n const children = options?.getChildren?.(item);\n return {\n item: treeItem,\n // If getChildren is provided, recurse. For known leaves (isLeaf:true or\n // no getChildren), use [] to signal \"confirmed leaf\" to the tree.\n children: children ? children.map(buildNode) : (treeItem.isLeaf ? [] : undefined),\n };\n }\n\n function getOrCreateTree(): TreeBaseElement {\n if (treeEl)\n return treeEl;\n\n treeEl = document.createElement(`ixfx-tree-list`) as TreeBaseElement;\n treeEl.interactionMode = options?.interactionMode ?? `standard`;\n treeEl.selectionFilter = options?.selectionFilter ?? `all`;\n treeEl.exclusivity = options?.exclusivity ?? `none`;\n treeEl.style.cssText = `display:block;width:100%;`;\n\n container.appendChild(treeEl);\n attachBridgeListeners();\n\n return treeEl;\n }\n\n // ---- Node → T mapping (via TreeItem.data) ----\n\n function mapNodes(nodes: ReadonlySet<TreeNode>): ReadonlySet<T> {\n const result = new Set<T>();\n for (const node of nodes) {\n if (node.item.data !== undefined)\n result.add(node.item.data as T);\n }\n return result;\n }\n\n // ---- Event bridge ----\n //\n // The tree fires the same event names as IGroupedSubComponent ('select',\n // 'activate', etc.). We must intercept them at the tree level and re-dispatch\n // on the container so grouped-item-lister can identify the correct source\n // element (the container, not the inner tree).\n\n function attachBridgeListeners(): void {\n treeEl!.addEventListener(`select`, (e) => {\n e.stopPropagation();\n const detail: SubComponentSelectDetail<T> = {\n selected: mapNodes(e.detail.selected),\n previous: mapNodes(e.detail.previous),\n };\n container.dispatchEvent(\n new CustomEvent(`select`, { detail, bubbles: true, composed: true }),\n );\n });\n\n treeEl!.addEventListener(`activate`, (e) => {\n e.stopPropagation();\n const item = (e.detail.node as TreeNode).item.data as T | undefined;\n if (item === undefined)\n return;\n const detail: SubComponentActivateDetail<T> = { item };\n container.dispatchEvent(\n new CustomEvent(`activate`, { detail, bubbles: true, composed: true }),\n );\n });\n\n treeEl!.addEventListener(`item-click`, (e) => {\n e.stopPropagation();\n const item = (e.detail.node as TreeNode).item.data as T | undefined;\n if (item === undefined)\n return;\n const detail: SubComponentItemClickDetail<T> = { item };\n container.dispatchEvent(\n new CustomEvent(`item-click`, { detail, bubbles: true, composed: true }),\n );\n });\n\n treeEl!.addEventListener(`tickle`, (e) => {\n e.stopPropagation();\n const item = (e.detail.node as TreeNode).item.data as T | undefined;\n if (item === undefined)\n return;\n const detail: SubComponentTickleDetail<T> = { item };\n container.dispatchEvent(\n new CustomEvent(`tickle`, { detail, bubbles: true, composed: true }),\n );\n });\n }\n\n // ---- IGroupedSubComponent implementation ----\n\n let selectionMode: ListSelectionMode = `single`;\n\n const adapter = Object.assign(container, {\n setItems(items: readonly T[]): void {\n const tree = getOrCreateTree();\n tree.root = {\n item: { key: `__adapter_root__`, label: ``, isLeaf: false },\n children: items.map(buildNode),\n };\n },\n\n clearSelection(): void {\n treeEl?.clearSelection();\n },\n\n dispatch(commandId: CommandId, args?: Record<string, unknown>): void {\n options?.onDispatch?.(commandId, args, treeEl);\n },\n });\n\n Object.defineProperties(adapter, {\n selectedItems: {\n get(): ReadonlySet<T> {\n return treeEl ? mapNodes(treeEl.selectedNodes) : new Set<T>();\n },\n enumerable: true,\n configurable: true,\n },\n selectionMode: {\n get(): ListSelectionMode {\n return selectionMode;\n },\n set(v: ListSelectionMode) {\n selectionMode = v;\n if (!treeEl)\n return;\n if (v === `none`) {\n treeEl.selectionFilter = `none`;\n } else if (v === `single`) {\n treeEl.selectionFilter = options?.selectionFilter ?? `all`;\n treeEl.interactionMode = `implicit`;\n } else {\n treeEl.selectionFilter = options?.selectionFilter ?? `all`;\n treeEl.interactionMode = options?.interactionMode ?? `standard`;\n }\n },\n enumerable: true,\n configurable: true,\n },\n });\n\n return adapter as unknown as HTMLElement & IGroupedSubComponent<T>;\n}\n","import type { CommandId } from '@clinth/ui-commands';\nimport type { PropertyValues } from 'lit';\nimport type { ElementIncrSearch } from '../incr-search/element-search.js';\nimport type {\n ListActivateDetail,\n ListElementEventMap,\n ListInteractionMode,\n ListItemClickDetail,\n ListSelectDetail,\n ListSelectionMode,\n ListTickleDetail,\n} from './types.js';\nimport { css, html, LitElement } from 'lit';\nimport { property, query, state } from 'lit/decorators.js';\nimport { createElementIncrSearch } from '../incr-search/element-search.js';\nimport { TickledController } from '../interaction/tickled-controller.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\n\nexport type {\n ListActivateDetail,\n ListActivateEvent,\n ListElementEventMap,\n ListInteractionMode,\n ListItemClickDetail,\n ListItemClickEvent,\n ListSelectDetail,\n ListSelectEvent,\n ListSelectionMode,\n ListTickleDetail,\n ListTickleEvent,\n} from './types.js';\n\nconst ITEM_SELECTOR = `li, [data-list-item]`;\n\n// Whether the mode allows building a multi-item selection\nfunction isMultiMode(mode: ListInteractionMode): boolean {\n return mode === `checked` || mode === `vscode` || mode === `standard`;\n}\n\n@customElement(`ixfx-vertical-list`)\nexport class VerticalListElement extends LitElement {\n @property({ type: String, attribute: `selection-mode` })\n selectionMode: ListSelectionMode = `single`;\n\n @property({ type: String, attribute: `interaction-mode` })\n interactionMode: ListInteractionMode = `standard`;\n\n @property({ attribute: false })\n filterPredicate: ((el: Element) => boolean) | undefined;\n\n @state() private _selectedItems: ReadonlySet<Element> = new Set();\n @state() private _searchVisible = false;\n @state() private _searchQuery = ``;\n\n @query(`.search-input`)\n private _searchInputEl!: HTMLInputElement;\n\n #search: ElementIncrSearch | undefined;\n // Anchor for range/shift selection — updated on plain-click or plain-keyboard select\n #selectionAnchor: Element | undefined;\n #customWrappers = new Map<HTMLLIElement, Element>();\n\n private tickled = new TickledController<Element>(this, {\n getItems: () => this._getVisibleItems().map(el => ({ id: el, enabled: true })),\n onTickle: (id) => {\n if (id !== undefined) {\n this._dispatch<ListTickleDetail>(`list-tickle`, { item: id });\n }\n },\n onStateChange: () => this._syncItemStates(),\n });\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (!this.hasAttribute(`tabindex`))\n this.tabIndex = 0;\n this.addEventListener(`pointerover`, this._onPointerOver);\n this.addEventListener(`pointerleave`, this._onPointerLeave);\n this.addEventListener(`keydown`, this._onKeyDown);\n this.addEventListener(`click`, this._onClick);\n this.addEventListener(`dblclick`, this._onDblClick);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener(`pointerover`, this._onPointerOver);\n this.removeEventListener(`pointerleave`, this._onPointerLeave);\n this.removeEventListener(`keydown`, this._onKeyDown);\n this.removeEventListener(`click`, this._onClick);\n this.removeEventListener(`dblclick`, this._onDblClick);\n this.#search?.dispose();\n this.#search = undefined;\n }\n\n override firstUpdated(): void {\n this.#search = createElementIncrSearch({\n container: this,\n itemSelector: ITEM_SELECTOR,\n getLabel: el => el.getAttribute(`data-search-label`) ?? el.textContent?.trim() ?? ``,\n getKey: el =>\n el.getAttribute(`data-key`)\n ?? el.getAttribute(`data-search-label`)\n ?? el.textContent?.trim()\n ?? ``,\n highlightKey: `vertical-list-search`,\n });\n }\n\n override updated(changed: PropertyValues): void {\n super.updated(changed);\n if (changed.has(`interactionMode`)) {\n this.#selectionAnchor = undefined;\n const previousSelected = this._selectedItems;\n // Save wrapper→inner map before _syncCheckboxes() clears it on unwrap\n const leavingChecked = (changed.get(`interactionMode`) as ListInteractionMode) === `checked`;\n const savedWrappers = leavingChecked ? new Map(this.#customWrappers) : null;\n\n this._syncCheckboxes();\n\n // Remap _selectedItems across the wrap/unwrap element-reference boundary\n if (previousSelected.size > 0) {\n let remapped: Set<Element>;\n if (savedWrappers && savedWrappers.size > 0) {\n // Leaving checked: wrapper refs → inner element refs\n remapped = new Set([...previousSelected].map(el => savedWrappers.get(el as HTMLLIElement) ?? el));\n } else if (this.#customWrappers.size > 0) {\n // Entering checked: inner element refs → wrapper refs\n const innerToWrapper = new Map([...this.#customWrappers].map(([w, i]) => [i, w]));\n remapped = new Set([...previousSelected].map(el => innerToWrapper.get(el) ?? el));\n } else {\n remapped = new Set(previousSelected);\n }\n this._selectedItems = remapped;\n }\n\n this._syncItemStates();\n }\n }\n\n // --- Public API ---\n\n /** The most recently selected item, or `undefined` if nothing is selected. */\n get selectedItem(): Element | undefined {\n return [...this._selectedItems].at(-1);\n }\n\n /** The full current selection set (read-only). */\n get selectedItems(): ReadonlySet<Element> {\n return this._selectedItems;\n }\n\n addItem(item: Element | string): void {\n if (typeof item === `string`) {\n const li = document.createElement(`li`);\n li.textContent = item;\n this.appendChild(li);\n } else {\n this.appendChild(item);\n }\n if (this.interactionMode === `checked`)\n this._syncCheckboxes();\n }\n\n removeItem(item: Element): void {\n item.remove();\n }\n\n clearItems(): void {\n this.#customWrappers.clear();\n this.replaceChildren();\n this.#selectionAnchor = undefined;\n this._selectedItems = new Set();\n this._syncItemStates();\n }\n\n /**\n * Replace the entire item list in one call.\n * Equivalent to `clearItems()` followed by `addItem()` for each element.\n * Preserves `interactionMode` checkbox wrapping.\n */\n setItems(items: readonly Element[]): void {\n this.clearItems();\n for (const item of items) {\n this.appendChild(item);\n }\n if (this.interactionMode === `checked`)\n this._syncCheckboxes();\n }\n\n /**\n * Dispatch a command to this list. No-op by default.\n * Intended for use with `ixfx-grouped-item-lister`'s `dispatch()` method,\n * which forwards commands to all sub-components.\n */\n dispatch(_commandId: CommandId, _args?: Record<string, unknown>): void {}\n\n select(item: Element): void {\n this._replaceSelection(item);\n }\n\n selectMany(items: Iterable<Element>): void {\n if (this.selectionMode !== `multiple`) {\n throw new Error(`selectMany requires selectionMode=\"multiple\" (current: \"${this.selectionMode}\")`);\n }\n const previous = this._selectedItems;\n const next = new Set(items);\n if (next.size === 0)\n return;\n this._selectedItems = next;\n this.#selectionAnchor = [...next].at(-1);\n this._syncItemStates();\n this._dispatch<ListSelectDetail>(`list-select`, { selected: next, previous });\n }\n\n deselect(item: Element): void {\n if (!this._selectedItems.has(item))\n return;\n const previous = this._selectedItems;\n const next = new Set(this._selectedItems);\n next.delete(item);\n this._selectedItems = next;\n this._syncItemStates();\n this._dispatch<ListSelectDetail>(`list-select`, { selected: next, previous });\n }\n\n clearSelection(): void {\n this._clearSelection();\n }\n\n selectAll(): void {\n const canMulti = this.selectionMode === `multiple` || isMultiMode(this.interactionMode);\n if (canMulti && this.selectionMode !== `none`)\n this._selectAll();\n }\n\n // --- Private selection primitives ---\n\n // Replace entire selection with one item; updates anchor. Used for plain clicks and Enter.\n private _replaceSelection(item: Element): void {\n if (this.selectionMode === `none`)\n return;\n const previous = this._selectedItems;\n const next = new Set([item]);\n this._selectedItems = next;\n this.#selectionAnchor = item;\n this._syncItemStates();\n this._dispatch<ListSelectDetail>(`list-select`, { selected: next, previous });\n }\n\n // Toggle a single item in/out of the selection without replacing. Does not update anchor.\n private _toggleItem(item: Element): void {\n // checked/vscode modes imply multiple selection capacity\n const effectiveMultiple\n = this.selectionMode === `multiple` || isMultiMode(this.interactionMode);\n if (this.selectionMode === `none` && this.interactionMode !== `checked`)\n return;\n\n const previous = this._selectedItems;\n const next = new Set(this._selectedItems);\n if (next.has(item)) {\n next.delete(item);\n } else {\n if (!effectiveMultiple)\n next.clear();\n next.add(item);\n }\n this._selectedItems = next;\n this._syncItemStates();\n this._dispatch<ListSelectDetail>(`list-select`, { selected: next, previous });\n }\n\n // Select the contiguous range from anchor to item. Anchor is not changed.\n private _rangeSelectTo(item: Element): void {\n if (this.selectionMode === `none`)\n return;\n if (!this.#selectionAnchor) {\n this._replaceSelection(item);\n return;\n }\n const visible = this._getVisibleItems();\n const anchorIdx = visible.indexOf(this.#selectionAnchor);\n const targetIdx = visible.indexOf(item);\n if (anchorIdx === -1 || targetIdx === -1) {\n this._replaceSelection(item);\n return;\n }\n const start = Math.min(anchorIdx, targetIdx);\n const end = Math.max(anchorIdx, targetIdx);\n const previous = this._selectedItems;\n const next = new Set(visible.slice(start, end + 1));\n this._selectedItems = next;\n this._syncItemStates();\n this._dispatch<ListSelectDetail>(`list-select`, { selected: next, previous });\n }\n\n private _clearSelection(): void {\n if (this._selectedItems.size === 0)\n return;\n const previous = this._selectedItems;\n this._selectedItems = new Set();\n this._syncItemStates();\n this._dispatch<ListSelectDetail>(`list-select`, { selected: new Set(), previous });\n }\n\n private _selectAll(): void {\n const visible = this._getVisibleItems();\n if (visible.length === 0)\n return;\n const previous = this._selectedItems;\n const next = new Set(visible);\n this._selectedItems = next;\n this._syncItemStates();\n this._dispatch<ListSelectDetail>(`list-select`, { selected: next, previous });\n }\n\n // --- Click interaction routing per interactionMode ---\n\n private _handleClickSelection(item: Element, e: MouseEvent): void {\n const mode = this.interactionMode;\n if (mode === `manual`)\n return;\n if (this.selectionMode === `none` && mode !== `checked`)\n return;\n\n switch (mode) {\n case `implicit`:\n // Single-select only; modifier keys have no effect\n this._replaceSelection(item);\n break;\n\n case `standard`:\n case `vscode`:\n if (e.ctrlKey || e.metaKey) {\n // Ctrl/Cmd+click: toggle item; requires effective multi-select\n if (this.selectionMode === `multiple` || mode === `vscode`) {\n this._toggleItem(item);\n }\n } else if (e.shiftKey && (this.selectionMode === `multiple` || mode === `vscode`)) {\n // Shift+click: range-select from anchor\n this._rangeSelectTo(item);\n } else {\n // Plain click: replace selection, update anchor\n this._replaceSelection(item);\n }\n break;\n\n case `checked`:\n // Body clicks do nothing — use the injected checkbox (li items) or Space key\n break;\n }\n }\n\n // --- Space key routing per interactionMode ---\n\n private _handleSpaceKey(item: Element): void {\n const mode = this.interactionMode;\n if (mode === `manual`)\n return;\n if (mode === `implicit`) {\n // Space selects (same as click) in implicit mode\n this._replaceSelection(item);\n } else {\n // standard / vscode / checked: Space toggles\n this._toggleItem(item);\n }\n }\n\n // --- Helpers ---\n\n private _getVisibleItems(): Element[] {\n return Array.from(this.querySelectorAll(ITEM_SELECTOR)).filter((el) => {\n if ((el as HTMLElement).hidden)\n return false;\n if (this.filterPredicate && !this.filterPredicate(el))\n return false;\n return true;\n });\n }\n\n private _syncItemStates(): void {\n for (const el of this.querySelectorAll(ITEM_SELECTOR)) {\n el.toggleAttribute(`data-tickled`, this.tickled.isTickled(el));\n el.toggleAttribute(`data-selected`, this._selectedItems.has(el));\n if (this.interactionMode === `checked`) {\n el.toggleAttribute(`data-checked`, this._selectedItems.has(el));\n } else {\n el.removeAttribute(`data-checked`);\n }\n }\n this.dataset.inputMode = this.tickled.inputMode;\n this._syncCheckboxes();\n }\n\n private _syncCheckboxes(): void {\n const inCheckedMode = this.interactionMode === `checked`;\n\n if (inCheckedMode) {\n for (const inner of Array.from(this.children)) {\n if (!inner.hasAttribute(`data-list-item`))\n continue;\n if (inner.parentElement !== this)\n continue; // idempotency: already wrapped\n const wrapper = document.createElement(`li`);\n wrapper.className = `ixfx-custom-row`;\n const key = inner.getAttribute(`data-key`);\n const label = inner.getAttribute(`data-search-label`);\n if (key !== null)\n wrapper.setAttribute(`data-key`, key);\n if (label !== null)\n wrapper.setAttribute(`data-search-label`, label);\n inner.removeAttribute(`data-list-item`);\n this.insertBefore(wrapper, inner);\n wrapper.appendChild(inner);\n this.#customWrappers.set(wrapper, inner);\n }\n } else {\n for (const [wrapper, inner] of this.#customWrappers) {\n if (wrapper.parentElement !== this)\n continue;\n inner.setAttribute(`data-list-item`, ``);\n this.insertBefore(inner, wrapper);\n wrapper.remove();\n }\n this.#customWrappers.clear();\n }\n\n for (const el of this.querySelectorAll<HTMLElement>(`li`)) {\n let cb = el.querySelector<HTMLInputElement>(`input.ixfx-list-checkbox`);\n if (inCheckedMode) {\n if (!cb) {\n cb = document.createElement(`input`);\n cb.type = `checkbox`;\n cb.className = `ixfx-list-checkbox`;\n cb.style.cssText = `flex-shrink:0;margin:0 6px 0 0;cursor:pointer;accent-color:var(--accent,#60a5fa);pointer-events:auto`;\n cb.tabIndex = -1;\n cb.addEventListener(`click`, (e) => {\n e.stopPropagation();\n this._toggleItem(el);\n });\n el.prepend(cb);\n }\n cb.checked = this._selectedItems.has(el);\n } else if (cb) {\n cb.remove();\n }\n }\n }\n\n private _findListItem(path: EventTarget[]): Element | undefined {\n for (const target of path) {\n if (!(target instanceof Element))\n continue;\n if (target === this)\n break;\n if (target.parentElement === this && target.matches(ITEM_SELECTOR))\n return target;\n }\n return undefined;\n }\n\n private _dispatch<T>(name: keyof ListElementEventMap, detail: T): void {\n this.dispatchEvent(new CustomEvent<T>(name as string, {\n detail,\n bubbles: true,\n composed: true,\n }));\n }\n\n private _openSearch(): void {\n this._searchVisible = true;\n void this.updateComplete.then(() => this._searchInputEl?.focus());\n }\n\n private _closeSearch(): void {\n this._searchVisible = false;\n this._searchQuery = ``;\n void this.#search?.clearQuery();\n this.focus();\n }\n\n // --- Event handlers ---\n\n private _onPointerOver = (e: PointerEvent): void => {\n const item = this._findListItem(e.composedPath());\n if (item)\n this.tickled.handlePointerEnter(item);\n };\n\n private _onPointerLeave = (e: PointerEvent): void => {\n this.tickled.handlePointerLeave(e);\n };\n\n private _onKeyDown = (e: KeyboardEvent): void => {\n if ((e.ctrlKey || e.metaKey) && e.key === `f`) {\n e.preventDefault();\n this._openSearch();\n return;\n }\n if ((e.ctrlKey || e.metaKey) && e.key === `a`) {\n const canMulti\n = this.selectionMode === `multiple` || isMultiMode(this.interactionMode);\n if (canMulti && this.selectionMode !== `none`) {\n e.preventDefault();\n this._selectAll();\n }\n return;\n }\n if (this._searchVisible)\n return;\n\n switch (e.key) {\n case `ArrowDown`: {\n e.preventDefault();\n this.tickled.handleKeyboardNavigation(`next`);\n // vscode: Shift+Arrow extends range from anchor\n if (e.shiftKey && this.interactionMode === `vscode`) {\n const cur = this.tickled.tickledId;\n if (cur)\n this._rangeSelectTo(cur);\n }\n break;\n }\n case `ArrowUp`: {\n e.preventDefault();\n this.tickled.handleKeyboardNavigation(`previous`);\n if (e.shiftKey && this.interactionMode === `vscode`) {\n const cur = this.tickled.tickledId;\n if (cur)\n this._rangeSelectTo(cur);\n }\n break;\n }\n case `Enter`: {\n const id = this.tickled.tickledId;\n if (id) {\n e.preventDefault();\n this._dispatch<ListItemClickDetail>(`list-item-click`, { item: id });\n this._activateItem(id);\n }\n break;\n }\n case ` `: {\n const id = this.tickled.tickledId;\n if (id) {\n e.preventDefault();\n this._handleSpaceKey(id);\n }\n break;\n }\n case `Escape`:\n this._clearSelection();\n break;\n }\n };\n\n private _onClick = (e: MouseEvent): void => {\n const item = this._findListItem(e.composedPath());\n if (!item)\n return;\n this._dispatch<ListItemClickDetail>(`list-item-click`, { item });\n this._handleClickSelection(item, e);\n };\n\n private _onDblClick = (e: MouseEvent): void => {\n const item = this._findListItem(e.composedPath());\n if (item)\n this._activateItem(item);\n };\n\n private _activateItem(item: Element): void {\n // manual mode: never auto-select; just fire the event\n if (this.interactionMode !== `manual`) {\n this._replaceSelection(item);\n }\n this._dispatch<ListActivateDetail>(`list-activate`, { item });\n }\n\n private _onSearchInput = (e: Event): void => {\n const input = e.target as HTMLInputElement;\n this._searchQuery = input.value;\n void this.#search?.setQuery(this._searchQuery);\n };\n\n private _onSearchKeydown = (e: KeyboardEvent): void => {\n if (e.key === `Escape`) {\n e.stopPropagation();\n this._closeSearch();\n } else if (e.key === `ArrowDown`) {\n e.preventDefault();\n this.tickled.handleKeyboardNavigation(`next`);\n } else if (e.key === `ArrowUp`) {\n e.preventDefault();\n this.tickled.handleKeyboardNavigation(`previous`);\n } else if (e.key === `Enter`) {\n e.preventDefault();\n e.stopPropagation();\n const id = this.tickled.tickledId ?? this._getVisibleItems()[0];\n if (id) {\n this._dispatch<ListItemClickDetail>(`list-item-click`, { item: id });\n this._activateItem(id);\n this._closeSearch();\n }\n }\n };\n\n // --- Styles ---\n\n static override styles = [themeFallbacks, css`\n :host {\n display: block;\n position: relative;\n background: var(--list-bg, var(--surface-3));\n color: var(--list-text, var(--surface-3-text));\n border-radius: var(--list-radius, var(--radius-s));\n border: 1px solid var(--list-border, var(--border));\n width: 100%;\n height: 100%;\n overflow: hidden;\n box-sizing: border-box;\n outline: none;\n }\n\n :host(:focus-visible) {\n outline: 2px solid var(--accent);\n outline-offset: 2px;\n }\n\n .container {\n position: relative;\n width: 100%;\n height: 100%;\n }\n\n ul {\n list-style: none;\n margin: 0;\n padding: 0;\n width: 100%;\n height: 100%;\n overflow-y: auto;\n box-sizing: border-box;\n }\n\n ::slotted([hidden]) {\n display: none !important;\n }\n\n ::slotted(li) {\n display: flex;\n align-items: center;\n padding: var(--list-item-padding, 4px var(--space-m, 8px));\n min-height: var(--list-item-height, 28px);\n cursor: pointer;\n user-select: none;\n transition: background var(--transition, 0.1s ease-out),\n outline-color var(--transition, 0.1s ease-out);\n box-sizing: border-box;\n outline: 1px solid transparent;\n }\n\n /* Custom shadow-DOM components handle their own internal layout/padding */\n ::slotted([data-list-item]) {\n display: block;\n cursor: pointer;\n user-select: none;\n transition: background var(--transition, 0.1s ease-out),\n outline-color var(--transition, 0.1s ease-out);\n outline: 1px solid transparent;\n }\n\n ::slotted([data-tickled]) {\n background: var(--item-bg-tickled);\n outline: var(--item-border-tickled);\n }\n\n ::slotted([data-selected]) {\n background: var(--item-bg-selected);\n color: var(--item-text-selected);\n outline: 1px solid transparent;\n }\n\n ::slotted([data-selected][data-tickled]) {\n background: var(--item-bg-selected-tickled);\n outline: 2px dashed var(--surface-3);\n outline-offset: -2px;\n }\n\n /* checked mode: checkbox (injected into li) communicates selection — suppress bg highlight */\n :host([interaction-mode=\"checked\"]) ::slotted([data-selected]) {\n background: transparent;\n color: inherit;\n outline: 1px solid transparent;\n }\n\n :host([interaction-mode=\"checked\"]) ::slotted([data-selected][data-tickled]) {\n background: var(--item-bg-tickled);\n color: inherit;\n outline: var(--item-border-tickled);\n }\n\n .search-overlay {\n position: absolute;\n top: 8px;\n right: 8px;\n z-index: 10;\n display: flex;\n align-items: center;\n gap: 4px;\n background: var(--surface-4, #2a2a2a);\n border: 1px solid var(--border, #444);\n border-radius: var(--radius-m, 4px);\n padding: 4px 6px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);\n }\n\n .search-overlay[hidden] {\n display: none;\n }\n\n .search-input {\n background: transparent;\n border: none;\n outline: none;\n color: inherit;\n font-size: var(--text-m, 0.875em);\n min-width: 140px;\n }\n\n .search-close {\n background: transparent;\n border: none;\n color: var(--surface-muted-text, #888);\n cursor: pointer;\n font-size: 1.1em;\n line-height: 1;\n padding: 0 2px;\n }\n\n .search-close:hover {\n color: inherit;\n }\n `];\n\n // --- Render ---\n\n override render() {\n return html`\n <div class=\"container\">\n <ul part=\"list\">\n <slot></slot>\n </ul>\n <div\n class=\"search-overlay\"\n part=\"search-overlay\"\n ?hidden=${!this._searchVisible}\n >\n <input\n type=\"text\"\n class=\"search-input\"\n placeholder=\"Search…\"\n .value=${this._searchQuery}\n @input=${this._onSearchInput}\n @keydown=${this._onSearchKeydown}\n />\n <button class=\"search-close\" @click=${this._closeSearch} title=\"Close search (Esc)\">×</button>\n </div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-vertical-list': VerticalListElement;\n }\n\n interface HTMLElementEventMap extends ListElementEventMap {}\n}\n","import type { CommandId } from '@clinth/ui-commands';\nimport type { ListInteractionMode, ListSelectionMode } from '../vertical-list/types.js';\nimport type { VerticalListElement } from '../vertical-list/vertical-list.js';\nimport type { IGroupedSubComponent, SubComponentSelectDetail } from './types.js';\nimport '../vertical-list/vertical-list.js';\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport type VerticalListAdapterOptions = {\n /** Initial selection mode forwarded to the inner ixfx-vertical-list. Default: `'single'`. */\n selectionMode?: ListSelectionMode;\n\n /** Interaction mode forwarded to the inner ixfx-vertical-list. Default: `'standard'`. */\n interactionMode?: ListInteractionMode;\n\n /**\n * Called when a command is dispatched via `ixfx-grouped-item-lister.dispatch()`.\n *\n * Receives the current inner `VerticalListElement` (undefined until the first\n * `setItems()` call) so the handler can sort, filter, or otherwise mutate the\n * list directly.\n *\n * @example Sort items alphabetically by text content:\n * ```ts\n * onDispatch: (id, _args, list) => {\n * if (id !== 'sort-alpha' || !list) return;\n * const rows = [...list.querySelectorAll<HTMLElement>('li')];\n * rows.sort((a, b) => (a.textContent ?? '').localeCompare(b.textContent ?? ''));\n * for (const row of rows) list.appendChild(row);\n * }\n * ```\n */\n onDispatch?: (\n commandId: CommandId,\n args: Record<string, unknown> | undefined,\n list: VerticalListElement | undefined,\n ) => void;\n};\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\n/**\n * Creates an `HTMLElement` that implements `IGroupedSubComponent<T>` by wrapping\n * an `ixfx-vertical-list` internally.\n *\n * Items are typed as `T`. The `renderItem` function converts each item to a DOM\n * element (typically an `<li>`) that `ixfx-vertical-list` renders and handles\n * pointer/keyboard interaction for.\n *\n * The returned element bridges the `list-*` event names fired by\n * `ixfx-vertical-list` to the `select / activate / item-click / tickle` names\n * required by `IGroupedSubComponent`, and maps element-based selection sets back\n * to typed `T` values.\n *\n * @example Basic usage with ixfx-grouped-item-lister:\n * ```ts\n * lister.factory = () =>\n * createVerticalListAdapter<MyItem>(item => {\n * const li = document.createElement('li');\n * li.textContent = item.label;\n * return li;\n * });\n * ```\n */\nexport function createVerticalListAdapter<T>(\n renderItem: (item: T) => Element,\n options?: VerticalListAdapterOptions,\n): HTMLElement & IGroupedSubComponent<T> {\n // Plain div — not a custom element, so appendChild is safe at any time.\n // display:contents makes it invisible in layout; the inner list is treated\n // as if it were a direct child of whatever the adapter is placed inside.\n const container = document.createElement(`div`);\n container.style.cssText = `display:contents;`;\n\n let listEl: VerticalListElement | undefined;\n let selectionMode: ListSelectionMode = options?.selectionMode ?? `single`;\n let elToItem = new WeakMap<Element, T>();\n\n // ---- Internal helpers ----\n\n function getOrCreateList(): VerticalListElement {\n if (listEl)\n return listEl;\n\n listEl = document.createElement(`ixfx-vertical-list`) as VerticalListElement;\n // Override :host { height:100% } so the list sizes to its content\n // when placed inside a panel with no explicit height.\n listEl.style.cssText = `height:auto;width:100%;`;\n listEl.selectionMode = selectionMode;\n if (options?.interactionMode)\n listEl.interactionMode = options.interactionMode;\n\n container.appendChild(listEl);\n attachBridgeListeners();\n\n return listEl;\n }\n\n function attachBridgeListeners(): void {\n listEl!.addEventListener(`list-select`, (e) => {\n const detail: SubComponentSelectDetail<T> = {\n selected: mapEls(e.detail.selected),\n previous: mapEls(e.detail.previous),\n };\n container.dispatchEvent(\n new CustomEvent(`select`, { detail, bubbles: true, composed: true }),\n );\n });\n\n listEl!.addEventListener(`list-activate`, (e) => {\n const item = elToItem.get(e.detail.item);\n if (item !== undefined) {\n container.dispatchEvent(\n new CustomEvent(`activate`, { detail: { item }, bubbles: true, composed: true }),\n );\n }\n });\n\n listEl!.addEventListener(`list-item-click`, (e) => {\n const item = elToItem.get(e.detail.item);\n if (item !== undefined) {\n container.dispatchEvent(\n new CustomEvent(`item-click`, { detail: { item }, bubbles: true, composed: true }),\n );\n }\n });\n\n listEl!.addEventListener(`list-tickle`, (e) => {\n const item = elToItem.get(e.detail.item);\n if (item !== undefined) {\n container.dispatchEvent(\n new CustomEvent(`tickle`, { detail: { item }, bubbles: true, composed: true }),\n );\n }\n });\n }\n\n function applyItems(items: readonly T[]): void {\n const list = getOrCreateList();\n list.clearItems();\n elToItem = new WeakMap();\n for (const item of items) {\n const el = renderItem(item);\n elToItem.set(el, item);\n list.addItem(el);\n }\n }\n\n function mapEls(els: ReadonlySet<Element>): ReadonlySet<T> {\n const result = new Set<T>();\n for (const el of els) {\n const item = elToItem.get(el);\n if (item !== undefined)\n result.add(item);\n }\n return result;\n }\n\n // ---- IGroupedSubComponent methods ----\n\n const adapter = Object.assign(container, {\n setItems(items: readonly T[]): void {\n applyItems(items);\n },\n\n clearSelection(): void {\n listEl?.clearSelection();\n },\n\n dispatch(commandId: CommandId, args?: Record<string, unknown>): void {\n options?.onDispatch?.(commandId, args, listEl);\n },\n });\n\n // Getters/setters require defineProperties — Object.assign would invoke them\n Object.defineProperties(adapter, {\n selectedItems: {\n get(): ReadonlySet<T> {\n return listEl ? mapEls(listEl.selectedItems) : new Set<T>();\n },\n enumerable: true,\n configurable: true,\n },\n selectionMode: {\n get(): ListSelectionMode {\n return listEl?.selectionMode ?? selectionMode;\n },\n set(v: ListSelectionMode) {\n selectionMode = v;\n if (listEl)\n listEl.selectionMode = v;\n },\n enumerable: true,\n configurable: true,\n },\n });\n\n return adapter as unknown as HTMLElement & IGroupedSubComponent<T>;\n}\n","import type { PanelElement, PanelOrientation, PanelToggleInteraction, PanelVariant } from './panel.js';\nimport { css, html, LitElement } from 'lit';\nimport { property, queryAssignedElements } from 'lit/decorators.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\n\nexport type PanelGroupOrientation = `horizontal` | `vertical`;\n\n@customElement(`ixfx-panel-group`)\nexport class PanelGroupElement extends LitElement {\n @property({ type: String, reflect: true }) orientation: PanelGroupOrientation = `horizontal`;\n @property({ type: String }) variant: PanelVariant = `titlebar`;\n @property({ type: String, attribute: `toggle-interaction` }) toggleInteraction: PanelToggleInteraction = `implicit`;\n @property({ type: Boolean, attribute: `allow-multiple` }) allowMultiple = false;\n @property() gap = `var(--space-m)`;\n\n @queryAssignedElements({ slot: `` }) private _panels!: PanelElement[];\n\n private _onPanelToggle(e: Event) {\n const panel = e.target as PanelElement;\n if (panel.collapsed) {\n return;\n }\n\n if (this.allowMultiple) {\n return;\n }\n\n for (const p of this._panels) {\n if (p !== panel) {\n p.collapsed = true;\n }\n }\n }\n\n protected override firstUpdated(): void {\n this.updateComplete.then(() => {\n this._propagateAll();\n });\n }\n\n protected override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (changed.has(`variant`) || changed.has(`toggleInteraction`) || changed.has(`orientation`)) {\n this.updateComplete.then(() => {\n this._propagateAll();\n });\n }\n }\n\n private _propagateAll(): void {\n const invertedOrientation: PanelOrientation\n = this.orientation === `horizontal` ? `vertical` : `horizontal`;\n\n for (const panel of this._panels) {\n panel.setAttribute(`variant`, this.variant);\n panel.setAttribute(`toggle-interaction`, this.toggleInteraction);\n panel.setAttribute(`orientation`, invertedOrientation);\n }\n }\n\n protected override render() {\n return html`\n <slot\n @toggle=${this._onPanelToggle}\n ></slot>\n `;\n }\n\n static override styles = css`\n :host {\n display: flex;\n flex-direction: column;\n gap: var(--group-gap, var(--space-m));\n }\n\n :host([orientation=\"horizontal\"]) {\n flex-direction: row;\n align-items: flex-start;\n flex-wrap: wrap;\n }\n\n :host([orientation=\"vertical\"]) {\n flex-direction: column;\n }\n\n ::slotted(ixfx-panel) {\n flex-shrink: 1;\n }\n\n :host([orientation=\"horizontal\"]) ::slotted(ixfx-panel) {\n flex-basis: content;\n min-width: 0;\n }\n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-panel-group': PanelGroupElement;\n }\n}\n","export type DragLogicCoordinates = {\n client: { x: number; y: number };\n offset: { x: number; y: number };\n};\nexport type DragLogicHandler = {\n progress: (current: DragLogicCoordinates, start: DragLogicCoordinates) => void;\n complete: (final: DragLogicCoordinates, start: DragLogicCoordinates) => void;\n};\n\nfunction getCoordinates(event: PointerEvent): DragLogicCoordinates {\n return {\n client: { x: event.clientX, y: event.clientY },\n offset: { x: event.offsetX, y: event.offsetY },\n };\n}\n\nexport function dragLogicStart(downEvent: PointerEvent, handler: DragLogicHandler) {\n const start = getCoordinates(downEvent);\n const onMove = (event: PointerEvent) => {\n handler.progress(\n getCoordinates(event),\n start,\n );\n };\n\n const onUp = (event: PointerEvent) => {\n document.removeEventListener(`pointermove`, onMove);\n document.removeEventListener(`pointerup`, onUp);\n handler.complete(\n getCoordinates(event),\n start,\n );\n };\n\n document.addEventListener(`pointermove`, onMove);\n document.addEventListener(`pointerup`, onUp);\n}\n","export function near(target: number, range: number) {\n const min = target - range;\n const max = target + range;\n return (v: number) => (v >= min && v <= max);\n}\n","import type { NumberScaler } from \"@ixfx/numbers\";\nimport type { PropertyValues } from \"lit\";\nimport type { TooltipOrientations } from \"../util/tooltip.js\";\nimport { clamper, scaler } from \"@ixfx/numbers\";\nimport { css, html, LitElement, nothing } from \"lit\";\nimport { eventOptions, property } from \"lit/decorators.js\";\nimport { themeFallbacks } from \"../styles/fallbacks.js\";\nimport { prominenceStyles } from \"../styles/prominence.js\";\nimport { tooltipValueStyles } from \"../styles/tooltip.js\";\nimport { safeCustomElement as customElement } from \"../util/custom-elements.js\";\nimport { dragLogicStart } from \"../util/drag.js\";\n// import type { ClampFn } from \"../util/clamp.js\";\nimport { near } from \"../util/near.js\";\n\nexport type Endpoints = `a` | `b`;\n\nexport type CrossoverBehaviour = `stop` | `allow`;\n\nexport type ResizeMode = `dual` | `none` | `bipolar` | `bipolar-flex`;\n\nexport type RangeMultiInputDetail = {\n readonly a: number;\n readonly b: number;\n readonly changed: `a` | `b` | `both`;\n};\n\nexport type RangeMultiInputEvent = CustomEvent<RangeMultiInputDetail>;\n\n/**\n *\n * Attributes\n * crossover: How thumbs can cross over. Default: 'allow' ('allow'/'stop')\n * a/b: Initial A/B values on 0...100 scale\n * step: Increments of input on 0...100 scale. Use 'any' for maximum precision. Default: 1 (number|'any')\n * tooltip: Whether tooltip is shown. Default: true (boolean)\n * tooltip-orientation: Orientation of tooltip if used. Default: 'top' ('top'|'right')\n *\n * CSS variables\n * --range-background: AccentColor\n * --range-height: 1.5em;\n * --range-thickness: 1em;\n * --thumb-background: ButtonFace;\n * --thumb-radius: 50%;\n * --thumb-width: 1em;\n * --thumb-height: 1em;\n */\n@customElement(`ixfx-range-multi`)\nexport class RangeMultiElement extends LitElement {\n @property({ type: Boolean })\n tooltip = true;\n\n @property({ type: String, attribute: `tooltip-orientation` })\n tooltipOrientation: TooltipOrientations = `top`;\n\n @property({ type: String })\n crossover: CrossoverBehaviour = `allow`;\n\n @property({ type: String, attribute: `resize-mode` })\n resizeMode: ResizeMode = `dual`;\n\n @property({ type: String, reflect: true })\n orientation: `horizontal` | `vertical` = `horizontal`;\n\n @property()\n step: number | `any` = 1;\n\n @property({ type: Number })\n a = 0;\n\n @property({ type: Number })\n b = 50;\n\n #userMax = 100;\n #userMin = 0;\n\n #scaleTo100: NumberScaler = (v: number) => v;\n #scaleFrom100: NumberScaler = (v: number) => v;\n #userClamp: NumberScaler = (v: number) => v;\n\n #updateScale() {\n this.#scaleTo100 = scaler(this.#userMin, this.#userMax, 0, 100);\n this.#scaleFrom100 = scaler(0, 100, this.#userMin, this.#userMax);\n this.#userClamp = clamper(this.#userMin, this.#userMax);\n this.a = this.#userClamp(this.a);\n this.b = this.#userClamp(this.b);\n }\n\n @property({ type: Number })\n set max(v: number) {\n this.#userMax = v;\n this.#updateScale();\n }\n\n get max() {\n return this.#userMax;\n }\n\n @property({ type: Number })\n set min(v: number) {\n this.#userMin = v;\n this.#updateScale();\n }\n\n get min() {\n return this.#userMin;\n }\n\n valuesAtPointerDown: undefined | { a: number; b: number };\n draggingThumb: `a` | `b` | `none` = `none`;\n\n @eventOptions({ capture: true })\n _onInput(event: Event) {\n event.stopPropagation();\n const t = event.target as HTMLInputElement;\n const v = this.#scaleFrom100(t.valueAsNumber);\n const which = t.id as Endpoints;\n let a = this.a;\n let b = this.b;\n\n if (this.resizeMode === `none`) {\n const rawDelta = v - (which === `a` ? this.a : this.b);\n let panDelta = rawDelta;\n const newA = this.a + panDelta;\n const newB = this.b + panDelta;\n if (newA < this.min) {\n panDelta = this.min - this.a;\n }\n if (newB > this.max) {\n panDelta = this.max - this.b;\n }\n\n if (panDelta === 0) {\n t.valueAsNumber = this.#scaleTo100(which === `a` ? this.a : this.b);\n return;\n }\n\n a = this.a + panDelta;\n b = this.b + panDelta;\n } else if (this.resizeMode === `bipolar`) {\n let newA: number;\n let newB: number;\n if (which === `a`) {\n const delta = v - this.a;\n newA = v;\n newB = this.b - delta;\n } else {\n const delta = v - this.b;\n newA = this.a - delta;\n newB = v;\n }\n\n if (newA < this.min || newB > this.max || newA > this.max || newB < this.min) {\n t.valueAsNumber = this.#scaleTo100(which === `a` ? this.a : this.b);\n return;\n }\n\n a = newA;\n b = newB;\n } else if (this.resizeMode === `bipolar-flex`) {\n let newA: number;\n let newB: number;\n if (which === `a`) {\n newA = v;\n if (this.b <= this.min) {\n newB = this.min;\n } else if (this.b >= this.max) {\n newB = this.max;\n } else {\n const delta = v - this.a;\n newB = this.b - delta;\n }\n } else {\n newB = v;\n if (this.a <= this.min) {\n newA = this.min;\n } else if (this.a >= this.max) {\n newA = this.max;\n } else {\n const delta = v - this.b;\n newA = this.a - delta;\n }\n }\n\n if (newA < this.min)\n newA = this.min;\n if (newA > this.max)\n newA = this.max;\n if (newB < this.min)\n newB = this.min;\n if (newB > this.max)\n newB = this.max;\n\n if (newA > newB) {\n t.valueAsNumber = this.#scaleTo100(which === `a` ? this.a : this.b);\n return;\n }\n\n a = newA;\n b = newB;\n } else {\n if (which === `a`) {\n if (v > this.b && this.crossover === `stop`) {\n t.valueAsNumber = this.#scaleTo100(this.a);\n } else {\n a = v;\n }\n } else if (which === `b`) {\n if (v < a && this.crossover === `stop`) {\n t.valueAsNumber = this.#scaleTo100(this.b);\n } else {\n b = v;\n }\n } else {\n throw new Error(`Expected 'a' or 'b', got: '${t.id}'`);\n }\n }\n\n this.setPoles(a, b);\n }\n\n setPoles(a: number, b: number) {\n const aDiff = a !== this.a;\n const bDiff = b !== this.b;\n // a = clamp(a, this.min, this.max);\n // b = clamp(b, this.min, this.max);\n this.a = this.#userClamp(a);\n this.b = this.#userClamp(b);\n this.dispatchEvent(new CustomEvent<RangeMultiInputDetail>(`input`, {\n detail: { a: this.a, b: this.b, changed: aDiff && bDiff ? `both` : aDiff ? `a` : `b` },\n }));\n }\n\n @eventOptions({ capture: true })\n _onPointerDown(event: PointerEvent) {\n const startA = this.a;\n const startB = this.b;\n this.valuesAtPointerDown = { a: startA, b: startB };\n const rect = (event.target as HTMLInputElement).getBoundingClientRect();\n const isVertical = this.orientation === `vertical`;\n const dim = isVertical ? rect.height : rect.width;\n const valuePerPix = dim / (this.max - this.min);\n const pos = isVertical ? event.offsetY : event.offsetX;\n\n const valueFromPos = (p: number): number => {\n return isVertical ? this.max - p * valuePerPix : p * valuePerPix;\n };\n const posFromValue = (v: number): number => {\n return isVertical ? dim - (v * valuePerPix) : v * valuePerPix;\n };\n\n const aPosPx = posFromValue(startA);\n const bPosPx = posFromValue(startB);\n\n const outsideClick = isVertical\n ? (this.b < this.a ? pos > bPosPx : pos < bPosPx)\n || (this.b < this.a ? pos < aPosPx : pos > aPosPx)\n : (this.b < this.a && pos < bPosPx) || (this.b > this.a && pos > bPosPx)\n || (this.a < this.b && pos < aPosPx) || (this.a > this.b && pos > aPosPx);\n\n if (outsideClick) {\n if (this.resizeMode === `none` || this.resizeMode === `bipolar` || this.resizeMode === `bipolar-flex`) {\n const newB = valueFromPos(pos);\n let panDelta = newB - this.b;\n if (this.a + panDelta < this.min) {\n panDelta = this.min - this.a;\n }\n if (this.b + panDelta > this.max) {\n panDelta = this.max - this.b;\n }\n const finalA = this.a + panDelta;\n const finalB = this.b + panDelta;\n if (finalA >= this.min && finalB <= this.max) {\n this.setPoles(finalA, finalB);\n }\n } else {\n this.b = valueFromPos(pos);\n }\n return;\n }\n\n const aPosPxNear = near(aPosPx, 10);\n const bPosPxNear = near(bPosPx, 10);\n\n const handleDrag = (draggingWhich: `a` | `b` | `none`) => {\n const setPoles = this.setPoles.bind(this);\n const resizeMode = this.resizeMode;\n const min = this.min;\n const max = this.max;\n const startPos = isVertical ? event.offsetY : event.offsetX;\n let polesChanged = false;\n dragLogicStart(event, {\n progress(current, _start) {\n const currentPos = isVertical ? current.offset.y : current.offset.x;\n const delta = isVertical ? startPos - currentPos : currentPos - startPos;\n const amt = delta / valuePerPix;\n polesChanged = true;\n\n if (draggingWhich === `a`) {\n if (resizeMode === `bipolar`) {\n const calcA = startA + amt;\n const calcB = startB - amt;\n if (calcA < min || calcB > max || calcA > max || calcB < min) {\n return;\n }\n setPoles(calcA, calcB);\n } else if (resizeMode === `bipolar-flex`) {\n let calcA = startA + amt;\n let calcB = startB;\n\n if (startB <= min) {\n calcB = min;\n } else if (startB >= max) {\n calcB = max;\n } else {\n calcA = startA + amt;\n calcB = startB - amt;\n }\n\n if (calcA < min)\n calcA = min;\n if (calcA > max)\n calcA = max;\n if (calcB < min)\n calcB = min;\n if (calcB > max)\n calcB = max;\n\n if (calcA > calcB) {\n return;\n }\n setPoles(calcA, calcB);\n } else {\n let constrainedAmt = amt;\n if (startA + amt < min) {\n constrainedAmt = min - startA;\n }\n if (startB + constrainedAmt > max) {\n constrainedAmt = max - startB;\n }\n const finalA = startA + constrainedAmt;\n const finalB = startB + constrainedAmt;\n if (finalA >= min && finalB <= max) {\n setPoles(finalA, finalB);\n }\n }\n } else if (draggingWhich === `b`) {\n if (resizeMode === `bipolar`) {\n const calcA = startA - amt;\n const calcB = startB + amt;\n if (calcA < min || calcB > max || calcA > max || calcB < min) {\n return;\n }\n setPoles(calcA, calcB);\n } else if (resizeMode === `bipolar-flex`) {\n let calcA = startA;\n let calcB = startB + amt;\n\n if (startA <= min) {\n calcA = min;\n } else if (startA >= max) {\n calcA = max;\n } else {\n calcA = startA - amt;\n calcB = startB + amt;\n }\n\n if (calcA < min)\n calcA = min;\n if (calcA > max)\n calcA = max;\n if (calcB < min)\n calcB = min;\n if (calcB > max)\n calcB = max;\n\n if (calcA > calcB) {\n return;\n }\n setPoles(calcA, calcB);\n } else {\n let constrainedAmt = amt;\n if (startA + amt < min) {\n constrainedAmt = min - startA;\n }\n if (startB + constrainedAmt > max) {\n constrainedAmt = max - startB;\n }\n const finalA = startA + constrainedAmt;\n const finalB = startB + constrainedAmt;\n if (finalA >= min && finalB <= max) {\n setPoles(finalA, finalB);\n }\n }\n } else {\n if (resizeMode === `bipolar`) {\n const calcA = startA + amt;\n const calcB = startB + amt;\n if (calcA < min || calcB > max) {\n return;\n }\n setPoles(calcA, calcB);\n } else if (resizeMode === `bipolar-flex`) {\n let calcA = startA + amt;\n let calcB = startB + amt;\n if (calcA < min) {\n calcA = min;\n calcB = min + (startB - startA);\n } else if (calcB > max) {\n calcB = max;\n calcA = max - (startB - startA);\n }\n if (calcA < min || calcB > max || calcA > calcB) {\n return;\n }\n setPoles(calcA, calcB);\n } else {\n let constrainedAmt = amt;\n if (startA + amt < min) {\n constrainedAmt = min - startA;\n }\n if (startB + constrainedAmt > max) {\n constrainedAmt = max - startB;\n }\n const finalA = startA + constrainedAmt;\n const finalB = startB + constrainedAmt;\n if (finalA >= min && finalB <= max) {\n setPoles(finalA, finalB);\n }\n }\n }\n },\n complete(_final, _start) {\n if (!polesChanged) {\n const currentPos = isVertical ? event.offsetY : event.offsetX;\n const closestA = Math.abs(currentPos - aPosPx) < Math.abs(currentPos - bPosPx);\n if (closestA) {\n setPoles(valueFromPos(currentPos), startB);\n } else {\n setPoles(startA, valueFromPos(currentPos));\n }\n }\n },\n });\n };\n\n if (aPosPxNear(pos)) {\n this.draggingThumb = `a`;\n if (this.resizeMode === `dual`) {\n return false;\n }\n event.preventDefault();\n (event.target as HTMLElement).setPointerCapture(event.pointerId);\n handleDrag(`a`);\n return;\n } else if (bPosPxNear(pos)) {\n this.draggingThumb = `b`;\n if (this.resizeMode === `dual`) {\n return false;\n }\n event.preventDefault();\n (event.target as HTMLElement).setPointerCapture(event.pointerId);\n handleDrag(`b`);\n return;\n } else {\n this.draggingThumb = `none`;\n }\n\n event.preventDefault();\n (event.target as HTMLElement).setPointerCapture(event.pointerId);\n handleDrag(`none`);\n }\n\n protected firstUpdated(_changedProperties: PropertyValues): void {\n this.#updateScale();\n }\n\n protected render(): unknown {\n const ttA = this.tooltip ? html`<ixfx-tooltip style=\"--tooltip-background: var(--surface-5); --tooltip-color: var(--surface-5-text)\" anchor=\"--a-tooltip\" .orientation=${this.tooltipOrientation} .value=${this.a}></ixfx-tooltip>` : nothing;\n const ttB = this.tooltip ? html`<ixfx-tooltip style=\"--tooltip-background: var(--surface-5); --tooltip-color: var(--surface-5-text)\" anchor=\"--b-tooltip\" .orientation=${this.tooltipOrientation} .value=${this.b}></ixfx-tooltip>` : nothing;\n\n const scaledA = this.#scaleTo100(this.a);\n const scaledB = this.#scaleTo100(this.b);\n const verticalStyle = this.orientation === `vertical`\n ? `writing-mode: vertical-lr; direction: rtl;`\n : nothing;\n // console.log(`a->b ${ this.a }->${ this.b } scaled: ${ scaledA }->${ scaledB }`)\n return html`\n <div @pointerdown=${this._onPointerDown} @input=${this._onInput} style=\"--a: ${scaledA}; --b: ${scaledB}\">\n <input class=\"thumb-round\" .value=${scaledA} id=\"a\" step=${this.step} type=\"range\" style=\"${verticalStyle}\" anchor=\"--a-tooltip\" />\n ${ttA}\n\n <input class=\"thumb-round\" .value=${scaledB} id=\"b\" step=${this.step} type=\"range\" style=\"${verticalStyle}\" anchor=\"--b-tooltip\" />\n ${ttB}\n </div>`;\n }\n\n static styles = [\n themeFallbacks,\n tooltipValueStyles,\n prominenceStyles,\n css`\n :host {\n display: grid;\n --value-label-color: unset;\n \n --range-background: AccentColor;\n --range-height: 1.5em;\n --range-thickness: 1em;\n --thumb-background: ButtonFace;\n --thumb-radius: 50%;\n --thumb-width: 1em;\n --thumb-height: 1em;\n --js:1;\n }\n\n :host([orientation=\"vertical\"]) {\n display: block;\n width: 1.5em;\n height: 200px;\n }\n\n * {\n margin: 0;\n padding: 0;\n font: inherit;\n }\n\n div {\n --j: var(--js, 0);\n display:inline grid;\n align-content: end;\n grid-gap: 0.25em;\n place-self: center;\n min-width: 8em;\n width: calc(100% - 1.5em);\n height: 1.5rem;\n }\n\n :host([orientation=\"vertical\"]) div {\n width: 1.5rem;\n height: calc(100% - 1.5em);\n min-width: unset;\n min-height: 8em;\n }\n\n div::before, div::after {\n margin: 0.5rem 0.6875rem;\n border-radius: 0.25rem;\n box-shadow: none;\n background: var(--surface-4);\n content: \"\";\n }\n :host([orientation=\"vertical\"]) div::before,\n :host([orientation=\"vertical\"]) div::after {\n margin: 0.5rem 0;\n }\n div::after {\n --or: calc((100 - Max(var(--a), var(--b)))*1%);\n --ol: calc(Min(var(--a), var(--b))*1%);\n box-shadow: none;\n background: var(--accent);\n clip-path: inset(0 var(--or) 0 var(--ol));\n }\n :host([orientation=\"vertical\"]) div::after {\n clip-path: inset(var(--or) 0 var(--ol) 0);\n }\n div input, div::before, div::after {\n grid-area: calc(1 + var(--j))/1;\n }\n div output, div::after {\n display:'none';\n }\n\n [type=range] {\n width: 100%;\n height: var(--range-height);\n background: transparent;\n pointer-events: none;\n }\n\n :host([orientation=\"vertical\"]) [type=range] {\n writing-mode: vertical-lr;\n direction: rtl;\n width: var(--range-height);\n height: 100%;\n }\n\n [type=range], [type=range]::-webkit-slider-runnable-track, [type=range]::-webkit-slider-thumb {\n -webkit-appearance: none;\n }\n [type=range], [type=range] + ixfx-tooltip {\n --sel: 0;\n z-index: calc(1 + var(--sel));\n }\n [type=range]::-webkit-slider-runnable-track {\n background: transparent;\n }\n [type=range]::-moz-range-track {\n background: transparent;\n }\n\n input.thumb-round::-webkit-slider-thumb {\n width: var(--thumb-width);\n height: var(--thumb-height);\n border-radius: var(--thumb-radius);\n }\n\n [type=range]::-webkit-slider-thumb {\n box-sizing: border-box;\n border: solid calc(0.5rem + -1px) transparent;\n\n /* box-shadow: var(--shadow-m); */\n background: var(--thumb-background);\n pointer-events: auto;\n cursor: ew-resize;\n }\n\n :host([orientation=\"vertical\"]) [type=range]::-webkit-slider-thumb {\n width: var(--thumb-height);\n height: var(--thumb-width);\n cursor: ns-resize;\n }\n\n [type=range]::-moz-range-thumb {\n box-sizing: border-box;\n border: solid calc(0.5rem + -1px) transparent;\n width: 1.375rem;\n height: 1.375rem;\n border-radius: 50%;\n box-shadow: var(--shadow-m);\n background: var(--thumb-background);\n pointer-events: auto;\n cursor: ew-resize;\n }\n\n :host([orientation=\"vertical\"]) [type=range]::-moz-range-thumb {\n cursor: ns-resize;\n }\n\n [type=range]:focus {\n outline: none;\n }\n [type=range]:focus, [type=range]:focus + ixfx-tooltip, [type=range]:hover, [type=range]:hover + ixfx-tooltip {\n --sel: 1 ;\n }\n `,\n ];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ixfx-range-multi\": RangeMultiElement;\n }\n}\n","import type { CommandRegistry } from \"@clinth/ui-commands\";\nimport type { PropertyValues } from \"lit\";\nimport { css, html, LitElement, nothing } from \"lit\";\nimport { property, state } from \"lit/decorators.js\";\nimport { themeFallbacks } from \"../styles/fallbacks.js\";\nimport { prominenceStyles } from \"../styles/prominence.js\";\nimport { safeCustomElement as customElement } from \"../util/custom-elements.js\";\nimport \"../icons/icon.js\";\n\n/**\n * CSS vars (can be overridden per-instance):\n * --selected-colour: text colour when selected\n * --selected-border-width: border width\n * --padding\n */\n@customElement(`ixfx-tab-list-item`)\nexport class TabListItemElement extends LitElement {\n @property({ type: Boolean })\n closeable = false;\n\n @property({ type: String, attribute: `icon-name` })\n iconName: string | undefined = undefined;\n\n @property({ type: String })\n description: string | undefined = undefined;\n\n @property({ type: String, attribute: `command-active` })\n commandActive: string | undefined = undefined;\n\n @property({ attribute: false })\n registry: CommandRegistry<unknown> | undefined = undefined;\n\n @state() private _compact = false;\n private _resizeObserver?: ResizeObserver;\n private _commandCleanup?: () => void;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this._resizeObserver = new ResizeObserver(([entry]) => {\n this._compact = entry.contentRect.width < 64;\n });\n this._resizeObserver.observe(this);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this._resizeObserver?.disconnect();\n this._resizeObserver = undefined;\n this._commandCleanup?.();\n this._commandCleanup = undefined;\n }\n\n override updated(changed: PropertyValues): void {\n super.updated(changed);\n this._syncTooltipAttrs();\n if (changed.has(`registry`) || changed.has(`commandActive`)) {\n this._syncCommandListener();\n }\n }\n\n private _syncTooltipAttrs(): void {\n if (this.description) {\n this.setAttribute(`data-tooltip`, this.description);\n this.setAttribute(`data-tooltip-anchor`, `top`);\n } else {\n this.removeAttribute(`data-tooltip`);\n this.removeAttribute(`data-tooltip-anchor`);\n }\n }\n\n private _syncCommandListener(): void {\n this._commandCleanup?.();\n this._commandCleanup = undefined;\n if (this.registry && this.commandActive) {\n this._commandCleanup = this.registry.addOnInvokeHandler((id) => {\n if (id === this.commandActive)\n this.click();\n });\n }\n }\n\n override render() {\n const showLabel = !this._compact || !this.iconName;\n return html`\n <div>\n ${this.iconName ? html`<ixfx-icon name=\"${this.iconName}\"></ixfx-icon>` : nothing}\n ${showLabel ? html`<span class=\"label\"><slot></slot></span>` : nothing}\n <div class=\"actions\">\n <div class=\"toolbar\"><slot name=\"toolbar\"></slot></div>\n ${this.closeable\n ? html`\n <button\n class=\"close-btn\"\n type=\"button\"\n aria-label=\"Close tab\"\n @click=${this._onCloseClick}\n >\n <ixfx-icon name=\"close\"></ixfx-icon>\n </button>\n `\n : nothing}\n </div>\n </div>\n `;\n }\n\n private _onCloseClick(e: Event) {\n e.stopPropagation();\n this.dispatchEvent(\n new CustomEvent<void>(`close`, {\n bubbles: true,\n composed: true,\n }),\n );\n this.remove();\n }\n\n static override styles = [\n themeFallbacks,\n prominenceStyles,\n css`\n :host {\n --selected-colour: var(--accent);\n --selected-border-width: 1px;\n --padding: var(--space-m);\n display: inline-flex;\n min-width: 0;\n user-select: none;\n box-sizing: border-box;\n }\n\n :host > div {\n display: flex;\n align-items: center;\n gap: var(--space-s, 4px);\n padding: var(--padding) calc(2 * var(--padding));\n min-width: 0;\n width: 100%;\n font-weight: 500;\n border: var(--selected-border-width) solid transparent;\n }\n\n :host([selected]) > div {\n color: var(--selected-colour);\n border-top-color: var(--indicator-color-top, transparent);\n border-bottom-color: var(--indicator-color-bottom, transparent);\n border-left-color: var(--indicator-color-left, transparent);\n border-right-color: var(--indicator-color-right, transparent);\n }\n\n .label {\n overflow: var(--allow-overflow, hidden);\n text-overflow: ellipsis;\n white-space: nowrap;\n min-width: 0;\n flex: 1 1 auto;\n }\n\n ixfx-icon {\n flex-shrink: 0;\n }\n\n .actions {\n display: flex;\n align-items: center;\n gap: var(--space-xs);\n margin-left: auto;\n flex-shrink: 0;\n }\n\n .toolbar {\n display: none;\n align-items: center;\n gap: var(--space-xs);\n }\n\n :host([selected]) .toolbar {\n display: flex;\n }\n\n slot[name=\"toolbar\"] {\n display: contents;\n }\n\n .close-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n background: none;\n border: none;\n padding: var(--space-xs);\n cursor: pointer;\n color: inherit;\n border-radius: var(--radius-s);\n opacity: var(--prominence-idle-opacity);\n transition: opacity var(--transition), background var(--transition);\n }\n\n .close-btn:hover {\n background: var(--surface-5);\n opacity: var(--prominence-tickled-opacity);\n }\n\n .close-btn:focus-visible {\n outline: 2px solid var(--accent);\n outline-offset: 1px;\n }\n\n :host([selected]) .close-btn,\n :host(:hover) .close-btn {\n opacity: var(--prominence-tickled-opacity);\n }\n `,\n ];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ixfx-tab-list-item\": TabListItemElement;\n }\n}\n","import { css, html, LitElement } from \"lit\";\nimport { themeFallbacks } from \"../styles/fallbacks.js\";\nimport { safeCustomElement as customElement } from \"../util/custom-elements.js\";\n\n@customElement(`ixfx-tab-panel`)\nexport class TabPanelElement extends LitElement {\n render() {\n return html`<slot></slot>`;\n }\n\n static styles = [themeFallbacks, css`\n :host {\n display:none;\n height:100%;\n width:100%;\n }\n\n :host([selected]) {\n background: var(--surface-3);\n display:block;\n }\n `];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ixfx-tab-panel\": TabPanelElement;\n }\n}\n","import type { TabListElement } from \"./tab-list.js\";\nimport type { TabPanelElement } from \"./tab-panel.js\";\nimport { css, html, LitElement } from \"lit\";\nimport { queryAssignedElements } from \"lit/decorators.js\";\nimport { safeCustomElement as customElement } from \"../util/custom-elements.js\";\n\n@customElement(`ixfx-tab-panels`)\nexport class TabPanelsElement extends LitElement {\n @queryAssignedElements()\n _listItems!: TabPanelElement[];\n\n /**\n * Triggered when a panel is being de-selected\n */\n onUnselectedPanel?: (id: string, el: TabPanelElement) => void;\n /**\n * Triggered before panel is selected\n */\n onSelectingPanel?: (id: string, el: TabPanelElement) => void;\n /**\n * Triggered after panel is selected\n */\n onSelectedPanel?: (id: string, el: TabPanelElement) => void;\n render() {\n return html`<slot></slot>`;\n }\n\n getSelectedElement() {\n for (const el of this._listItems) {\n if (this.#isSelected(el))\n return el;\n }\n }\n\n #isSelected(el: TabPanelElement) {\n // const v = el.getAttribute(`selected`);\n // console.log(`id: ${ el.id } v: ${ v }`);\n return el.hasAttribute(`selected`);\n }\n\n #unselect(el: TabPanelElement) {\n el.removeAttribute(`selected`);\n if (this.onUnselectedPanel) {\n this.onUnselectedPanel(el.id, el);\n }\n }\n\n #select(el: TabPanelElement) {\n if (this.onSelectingPanel) {\n this.onSelectingPanel(el.id, el);\n }\n el.setAttribute(`selected`, ``);\n if (this.onSelectedPanel) {\n this.onSelectedPanel(el.id, el);\n }\n }\n\n syncWithList(el: TabListElement) {\n const doSync = () => {\n const t = el.getSelectedElement();\n if (!t)\n return;\n const forEl = t.getAttribute(`for`);\n if (forEl)\n this.selectPanel(forEl);\n };\n // Wait for both the list and ourselves to be fully rendered\n // so that getSelectedElement() and _listItems both work.\n Promise.all([el.updateComplete, this.updateComplete]).then(doSync);\n }\n\n selectPanel(id: string) {\n const current = this.getSelectedElement();\n if (current) {\n if (current.id === id)\n return;\n this.#unselect(current);\n }\n\n let found = false;\n for (const el of this._listItems) {\n if (el.id === id) {\n this.#select(el);\n found = true;\n }\n }\n return found;\n }\n\n static styles = css`\n :host {\n display: block;\n }\n \n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ixfx-tab-panels\": TabPanelsElement;\n }\n}\n","import type { PropertyValues } from 'lit';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { keyed } from 'lit/directives/keyed.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\n\nexport type Effect = `slide-right` | `slide-left` | `slide-up` | `slide-down` | `fade` | `character-swap`;\n\ntype QueueEntry = { text: string; effect: Effect };\n\n@customElement(`ixfx-transitory-label`)\nexport class TransitoryLabelElement extends LitElement {\n @property({ type: String }) text = ``;\n @property({ type: String }) effect: Effect = `fade`;\n @property({ type: Number }) duration = 300;\n @property({ type: String }) easing = `ease`;\n\n @state() private _currentText = ``;\n @state() private _outgoingText = ``;\n @state() private _activeEffect: Effect | undefined;\n @state() private _transitionId = 0;\n\n private _queue: QueueEntry[] = [];\n private _pendingEffect: Effect | undefined;\n\n setText(msg: string, effect: Effect): void {\n this._pendingEffect = effect;\n this.text = msg;\n }\n\n protected override updated(changed: PropertyValues): void {\n if (changed.has(`text`) && this.text !== this._currentText) {\n const effect = this._pendingEffect ?? this.effect;\n this._pendingEffect = undefined;\n\n if (this._activeEffect !== undefined) {\n this._queue.push({ text: this.text, effect });\n } else {\n this._startTransition(this.text, effect);\n }\n }\n }\n\n private _startTransition(newText: string, effect: Effect): void {\n const prevText = this._currentText;\n this._currentText = newText;\n this._outgoingText = prevText;\n\n if (prevText !== ``) {\n this._transitionId++;\n this._activeEffect = effect;\n }\n }\n\n private _onTransitionEnd(): void {\n this._outgoingText = ``;\n this._activeEffect = undefined;\n\n if (this._queue.length > 0) {\n const next = this._queue.shift()!;\n this._startTransition(next.text, next.effect);\n }\n }\n\n #onOutgoingEnd = (): void => {\n this._onTransitionEnd();\n };\n\n #onLastCharOut = (): void => {\n this._onTransitionEnd();\n };\n\n #renderCharSwap() {\n const charDuration = Math.round(this.duration * 0.3);\n const charStagger = Math.round(this.duration * 0.1);\n const currentChars = this._currentText.split(``);\n const outgoingChars = this._outgoingText.split(``);\n const lastIdx = outgoingChars.length - 1;\n\n const charStyle = (i: number) =>\n `animation-duration:${charDuration}ms;animation-delay:${i * charStagger}ms;animation-timing-function:${this.easing}`;\n\n return html`\n ${keyed(`cc${this._transitionId}`, html`\n <span class=\"layer current char-swap\">\n ${currentChars.map((ch, i) => html`<span class=\"char in\" style=${charStyle(i)}>${ch}</span>`)}\n </span>\n `)}\n ${this._outgoingText\n ? keyed(this._transitionId, html`\n <span class=\"layer outgoing char-swap\">\n ${outgoingChars.map((ch, i) => html`<span\n class=\"char out\"\n style=${charStyle(i)}\n @animationend=${i === lastIdx ? this.#onLastCharOut : undefined}\n >${ch}</span>`)}\n </span>\n `)\n : nothing}\n `;\n }\n\n protected override render() {\n if (this._activeEffect === `character-swap`) {\n return html`<span class=\"container\">${this.#renderCharSwap()}</span>`;\n }\n\n const effect = this._activeEffect ?? ``;\n const durStyle = this._activeEffect\n ? `animation-duration:${this.duration}ms;animation-timing-function:${this.easing}`\n : ``;\n\n return html`\n <span class=\"container\">\n ${this._outgoingText\n ? keyed(this._transitionId, html`\n <span class=\"layer outgoing ${effect}\" style=${durStyle} @animationend=${this.#onOutgoingEnd}>\n ${this._outgoingText}\n </span>\n `)\n : nothing}\n ${keyed(`c${this._transitionId}`, html`\n <span class=\"layer current ${effect}\" style=${durStyle}>\n ${this._currentText}\n </span>\n `)}\n </span>\n `;\n }\n\n static override styles = css`\n :host {\n display: inline-block;\n --transitory-label-easing: ease;\n }\n\n .container {\n display: inline-grid;\n overflow: hidden;\n }\n\n .layer {\n grid-area: 1 / 1;\n white-space: nowrap;\n }\n\n .layer.outgoing {\n pointer-events: none;\n }\n\n /* slide-right */\n .layer.current.slide-right {\n transform: translateX(-100%);\n animation: tl-slide-in-left var(--transitory-label-easing) forwards;\n }\n .layer.outgoing.slide-right {\n animation: tl-slide-out-right var(--transitory-label-easing) forwards;\n }\n\n @keyframes tl-slide-in-left {\n from { transform: translateX(-100%); }\n to { transform: translateX(0); }\n }\n @keyframes tl-slide-out-right {\n from { transform: translateX(0); }\n to { transform: translateX(100%); }\n }\n\n /* slide-left */\n .layer.current.slide-left {\n transform: translateX(100%);\n animation: tl-slide-in-right var(--transitory-label-easing) forwards;\n }\n .layer.outgoing.slide-left {\n animation: tl-slide-out-left var(--transitory-label-easing) forwards;\n }\n\n @keyframes tl-slide-in-right {\n from { transform: translateX(100%); }\n to { transform: translateX(0); }\n }\n @keyframes tl-slide-out-left {\n from { transform: translateX(0); }\n to { transform: translateX(-100%); }\n }\n\n /* slide-up */\n .layer.current.slide-up {\n transform: translateY(100%);\n animation: tl-slide-in-bottom var(--transitory-label-easing) forwards;\n }\n .layer.outgoing.slide-up {\n animation: tl-slide-out-top var(--transitory-label-easing) forwards;\n }\n\n @keyframes tl-slide-in-bottom {\n from { transform: translateY(100%); }\n to { transform: translateY(0); }\n }\n @keyframes tl-slide-out-top {\n from { transform: translateY(0); }\n to { transform: translateY(-100%); }\n }\n\n /* slide-down */\n .layer.current.slide-down {\n transform: translateY(-100%);\n animation: tl-slide-in-top var(--transitory-label-easing) forwards;\n }\n .layer.outgoing.slide-down {\n animation: tl-slide-out-bottom var(--transitory-label-easing) forwards;\n }\n\n @keyframes tl-slide-in-top {\n from { transform: translateY(-100%); }\n to { transform: translateY(0); }\n }\n @keyframes tl-slide-out-bottom {\n from { transform: translateY(0); }\n to { transform: translateY(100%); }\n }\n\n /* fade */\n .layer.current.fade {\n opacity: 0;\n animation: tl-fade-in var(--transitory-label-easing) forwards;\n }\n .layer.outgoing.fade {\n animation: tl-fade-out var(--transitory-label-easing) forwards;\n }\n\n @keyframes tl-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n @keyframes tl-fade-out {\n from { opacity: 1; }\n to { opacity: 0; }\n }\n\n /* character-swap */\n .char {\n display: inline-block;\n }\n\n .char.in {\n opacity: 0;\n animation: tl-char-in var(--transitory-label-easing) forwards;\n }\n\n .char.out {\n animation: tl-char-out var(--transitory-label-easing) forwards;\n }\n\n @keyframes tl-char-in {\n from { opacity: 0; transform: translateY(-0.3em) scale(0.8); }\n to { opacity: 1; transform: translateY(0) scale(1); }\n }\n @keyframes tl-char-out {\n from { opacity: 1; transform: translateY(0) scale(1); }\n to { opacity: 0; transform: translateY(0.3em) scale(0.8); }\n }\n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-transitory-label': TransitoryLabelElement;\n }\n}\n","interface CheckboxLike extends HTMLElement {\n checked: boolean;\n indeterminate?: boolean;\n}\n\nfunction isCheckboxLike(el: unknown): el is CheckboxLike {\n if (!(el instanceof HTMLElement))\n return false;\n return `checked` in el;\n}\n\nfunction resolveElement(elOrQuery: string | HTMLElement): HTMLElement {\n if (typeof elOrQuery === `string`) {\n const found = document.querySelector(elOrQuery);\n if (!(found instanceof HTMLElement))\n throw new Error(`Element not found or not HTMLElement: ${elOrQuery}`);\n return found;\n }\n return elOrQuery;\n}\n\nexport function monitorIndeterminate(\n targetElOrQuery: string | HTMLElement,\n watchedElsOrQueries: Array<string | HTMLElement>,\n): () => void {\n const target = resolveElement(targetElOrQuery);\n if (!isCheckboxLike(target)) {\n throw new Error(`Target element is not a checkbox-like element`);\n }\n\n const watched: CheckboxLike[] = [];\n for (const elOrQuery of watchedElsOrQueries) {\n const el = resolveElement(elOrQuery);\n if (isCheckboxLike(el)) {\n watched.push(el);\n }\n }\n\n const updateTarget = () => {\n if (watched.length === 0) {\n target.checked = false;\n target.indeterminate = false;\n return;\n }\n\n let checkedCount = 0;\n let uncheckedCount = 0;\n\n for (const el of watched) {\n if (el.checked) {\n checkedCount++;\n } else {\n uncheckedCount++;\n }\n }\n\n if (checkedCount > 0 && uncheckedCount > 0) {\n target.checked = false;\n target.indeterminate = true;\n } else if (checkedCount === watched.length) {\n target.checked = true;\n target.indeterminate = false;\n } else {\n target.checked = false;\n target.indeterminate = false;\n }\n };\n\n const handleChange = () => {\n updateTarget();\n };\n\n for (const el of watched) {\n el.addEventListener(`change`, handleChange);\n }\n\n updateTarget();\n\n return () => {\n for (const el of watched) {\n el.removeEventListener(`change`, handleChange);\n }\n };\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 { getIcon } 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@customElement(`ixfx-tooltip`)\nexport class TooltipElement extends LitElement {\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 const svg = getIcon(this.icon);\n\n if (!svg)\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","import \"./style.css\";\n\nexport * from './ac-text/ac-text.js';\nexport * from './ac-token/ac-token.js';\nexport * from './button/button.js';\nexport * from './button/radio-group.js';\nexport * from './button/split-button.js';\nexport * from './button/types.js';\nexport * from './checkbox/checkbox.js';\nexport * from './colour-picker/index.js';\nexport * from './common/data-controller.js';\nexport * from './common/data-provider.js';\nexport * from './common/searchable.js';\nexport * from './common/tree-component.js';\nexport * from './common/tree-data-model.js';\nexport * from './common/types.js';\nexport * from './crumbs/crumb-navigation.js';\nexport * from './crumbs/crumb-path-controller.js';\nexport * from './crumbs/crumb-path.js';\n\nexport * from './data-display/data-display.js';\nexport * from './editable-label/editable-label.js';\nexport * from './editable-label/editable-number.js';\nexport * from './grouped-item-lister/grouped-item-lister.js';\nexport * from './grouped-item-lister/tree-list-adapter.js';\nexport * from './grouped-item-lister/vertical-list-adapter.js';\nexport * from './hex/hex-editor.js';\nexport * from './icons/index.js';\nexport * from './incr-search/index.js';\nexport * from './labelled-radial-input/index.js';\nexport * from './labelled-range-input/index.js';\nexport * from './led/led.js';\nexport * as Menu from './menu';\nexport * from './miller/index.js';\nexport * from './narrowed-text/index.js';\nexport * from './panel/panel-group.js';\nexport * from './panel/panel.js';\nexport * from './plots/colour-map.js';\nexport * from './plots/data.js';\nexport * from './plots/multi-axis.js';\nexport * from './plots/plot-histogram.js';\nexport * from './plots/single-axis.js';\nexport * from './plots/xy-axis.js';\nexport * from './polar-pad/polar-pad.js';\nexport * from './radial-input/radial-input.js';\nexport * from './radial-input/types.js';\nexport * from './range-input/index.js';\nexport * from './range/range-multi.js';\nexport * from './range/range.js';\nexport * from './selecthorizontal.js';\nexport * from './snap-container/snap-container.js';\nexport * from './split-layout/split-layout.js';\nexport * from './swipe/index.js';\nexport * from './tabs/tab-list-item.js';\nexport * from './tabs/tab-list.js';\nexport * from './tabs/tab-panel.js';\nexport * from './tabs/tab-panels.js';\nexport * from './timeline/index.js';\nexport * from './transitory-label/transitory-label.js';\nexport * from './tree/index.js';\nexport * from './util/checkbox.js';\nexport * from './util/tooltip.js';\nexport * from './vertical-list/vertical-list.js';\nexport * from './xy-pad/xy-pad.js';\nexport function init() {\n console.log(`Init`);\n}"],"x_google_ignoreList":[4,5],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["#host","#opts","#provider","#items","#loading","#loaded","#total","#error","#abort","#consume","#applyBatch","#consumeStream","#handleError","#data","#scheduleSuggestionFetch","#addToken","#startEditingSelectedToken","#handleNavigationKey","#selectSuggestion","#removeToken","#cache","#emitChange","#buildStaticProvider","#debounceTimer","#lastSuggestions","#staticProvider","#closePopup","#scrollSuggestionIntoView","#buildCachedProvider","#filterUsed","#onChipPointerDown","#onSuggestionPointerDown","#renderSuggestion","#onWrapperClick","#renderChip","#onInput","#onKeyDown","#onFocus","#onBlur","#onPaste","#renderPopup","customElement","#updateComputedItems","#handleToggleChange","#handleRadioChange","customElement","customElement","#separator","#onQuery","#pathed","#element","#siblingLookup","#cleanupPending","#closeDropdown","#scrollDropdownActiveIntoView","#selectSibling","#uid","#getSegments","#anchorName","#pendingController","#pendingIndex","#getRootSegments","#onSiblingClick","#getCumulativePath","#onSegmentClick","#onLabelClick","#onCaretClick","#onRootSegmentClick","#dispatchChangeEvent","#makeCompletionProvider","#onAcChange","#onAcFocusOut","#onAcKeyDown","#onHostKeyDown","#renderRootSegment","#renderSegment","#onTrailingClick","#onPopoverToggle","#onDropdownKeyDown","#renderDropdownContent","customElement","#lastInputValue","#dragStartY","#dragStartValue","#dragCurrentValue","#dragging","#hasDragged","customElement","#clearingSelection","#subComponents","#data","#groupBy","#factory","#clearSubComponents","#onSelect","#syncSubComponents","#renderedGroups","#computeGroups","#syncUngrouped","#syncGrouped","customElement","#search","#selectionAnchor","#customWrappers","customElement","customElement","#scaleTo100","#userMin","#userMax","#scaleFrom100","#userClamp","#updateScale","customElement","customElement","customElement","#isSelected","#unselect","#select","customElement","#onLastCharOut","#renderCharSwap","#onOutgoingEnd","customElement"],"sources":["../src/common/data-controller.ts","../src/ac-token/ac-token.ts","../src/button/radio-group.ts","../src/button/split-button.ts","../src/crumbs/crumb-path-controller.ts","../src/crumbs/crumb-path.ts","../src/editable-label/editable-number.ts","../src/grouped-item-lister/grouped-item-lister.ts","../src/grouped-item-lister/tree-list-adapter.ts","../src/vertical-list/vertical-list.ts","../src/grouped-item-lister/vertical-list-adapter.ts","../src/panel/panel-group.ts","../src/util/drag.ts","../src/util/near.ts","../src/range/range-multi.ts","../src/tabs/tab-list-item.ts","../src/tabs/tab-panel.ts","../src/tabs/tab-panels.ts","../src/transitory-label/transitory-label.ts","../src/util/checkbox.ts","../src/index.ts"],"sourcesContent":["import type { ReactiveController, ReactiveControllerHost } from 'lit';\nimport type { DataBatch, DataProviderResult, IDataProvider } from './data-provider.js';\n\nexport type DataControllerOptions = {\n /**\n * Clear accumulated items immediately when request() is called.\n * When false, stale items remain visible while the new request is in-flight\n * (useful for re-query-on-keystroke patterns — avoids a blank flash).\n * Default: true.\n */\n clearOnRequest?: boolean;\n /**\n * Called when the provider throws or rejects. Useful for logging without\n * coupling the error to render logic.\n */\n onError?: (err: unknown) => void;\n};\n\nfunction isAsyncIterable<T>(v: unknown): v is AsyncIterable<T> {\n return typeof v === `object` && v !== null && Symbol.asyncIterator in v;\n}\n\n/**\n * Lit ReactiveController that manages one active data provider request at a time.\n *\n * Handles all three provider return modes (sync, async one-shot, streaming),\n * tracks progress, and cancels in-flight requests when a new one starts.\n * Calls host.requestUpdate() on every state change so the component re-renders\n * automatically.\n *\n * @typeParam TQuery - The query/scope type passed to the provider.\n * @typeParam TItem - The item type produced by the provider.\n *\n * @example\n * ```ts\n * class MyList extends LitElement {\n * #data = new DataController<string, MyItem>(this, myProvider);\n *\n * protected override render() {\n * return html`\n * ${this.#data.loading ? html`<span>Loading…</span>` : nothing}\n * ${this.#data.items.map(item => html`<div>${item.label}</div>`)}\n * `;\n * }\n * }\n * ```\n */\nexport class DataController<TQuery, TItem> implements ReactiveController {\n readonly #host: ReactiveControllerHost;\n readonly #opts: Required<Omit<DataControllerOptions, `onError`>> & Pick<DataControllerOptions, `onError`>;\n\n #provider: IDataProvider<TQuery, TItem> | undefined;\n #abort: AbortController | undefined;\n\n #items: readonly TItem[] = [];\n #loading = false;\n #loaded = 0;\n #total: number | undefined;\n #error: unknown;\n\n constructor(\n host: ReactiveControllerHost,\n provider?: IDataProvider<TQuery, TItem>,\n options?: DataControllerOptions,\n ) {\n this.#host = host;\n this.#provider = provider;\n this.#opts = {\n clearOnRequest: options?.clearOnRequest ?? true,\n onError: options?.onError,\n };\n host.addController(this);\n }\n\n // ---- ReactiveController lifecycle ----\n\n hostConnected(): void {}\n\n hostDisconnected(): void {\n this.cancel();\n }\n\n // ---- Configuration ----\n\n get provider(): IDataProvider<TQuery, TItem> | undefined {\n return this.#provider;\n }\n\n set provider(value: IDataProvider<TQuery, TItem> | undefined) {\n this.#provider = value;\n }\n\n // ---- Reactive state (read-only) ----\n\n /** The currently accumulated items. */\n get items(): readonly TItem[] {\n return this.#items;\n }\n\n /** True while a provider call is pending or a stream is still open. */\n get loading(): boolean {\n return this.#loading;\n }\n\n /** Number of items accumulated so far in the current request. */\n get loaded(): number {\n return this.#loaded;\n }\n\n /**\n * Provider's latest estimate of the total number of items expected.\n * Undefined when the provider has not reported a total.\n */\n get total(): number | undefined {\n return this.#total;\n }\n\n /**\n * Progress as a 0–1 value, or undefined when total is unknown.\n * Derived from loaded / total.\n */\n get progress(): number | undefined {\n if (this.#total === undefined || this.#total === 0)\n return undefined;\n return Math.min(this.#loaded / this.#total, 1);\n }\n\n /** The last error thrown by the provider, or undefined if the last request succeeded. */\n get error(): unknown {\n return this.#error;\n }\n\n // ---- Control ----\n\n /**\n * Cancel any in-flight request and start a new one.\n * Clears items immediately unless clearOnRequest was set to false.\n */\n request(query: TQuery): void {\n this.cancel();\n\n if (!this.#provider)\n return;\n\n if (this.#opts.clearOnRequest) {\n this.#items = [];\n this.#loaded = 0;\n }\n this.#total = undefined;\n this.#error = undefined;\n this.#loading = true;\n this.#host.requestUpdate();\n\n this.#abort = new AbortController();\n const { signal } = this.#abort;\n\n this.#consume(this.#provider(query, signal), signal);\n }\n\n /** Abort any in-flight request without issuing a new one. */\n cancel(): void {\n this.#abort?.abort();\n this.#abort = undefined;\n if (this.#loading) {\n this.#loading = false;\n this.#host.requestUpdate();\n }\n }\n\n // ---- Internal ----\n\n #consume(result: DataProviderResult<TItem>, signal: AbortSignal): void {\n if (Array.isArray(result)) {\n this.#applyBatch({ items: result }, signal);\n this.#loading = false;\n this.#host.requestUpdate();\n } else if (isAsyncIterable<DataBatch<TItem>>(result)) {\n this.#consumeStream(result, signal);\n } else {\n // Promise (async one-shot)\n (result as Promise<readonly TItem[]>).then(\n (items) => {\n if (signal.aborted)\n return;\n this.#applyBatch({ items }, signal);\n this.#loading = false;\n this.#host.requestUpdate();\n },\n (err: unknown) => {\n if (signal.aborted)\n return;\n this.#handleError(err);\n },\n );\n }\n }\n\n async #consumeStream(stream: AsyncIterable<DataBatch<TItem>>, signal: AbortSignal): Promise<void> {\n try {\n for await (const batch of stream) {\n if (signal.aborted)\n return;\n this.#applyBatch(batch, signal);\n this.#host.requestUpdate();\n }\n } catch (err) {\n if (signal.aborted)\n return;\n this.#handleError(err);\n return;\n }\n if (!signal.aborted) {\n this.#loading = false;\n this.#host.requestUpdate();\n }\n }\n\n #applyBatch(batch: { items: readonly TItem[]; replace?: boolean; total?: number }, _signal: AbortSignal): void {\n if (batch.replace) {\n this.#items = [...batch.items];\n this.#loaded = batch.items.length;\n } else {\n this.#items = [...this.#items, ...batch.items];\n this.#loaded = this.#items.length;\n }\n if (batch.total !== undefined) {\n this.#total = batch.total;\n }\n }\n\n #handleError(err: unknown): void {\n this.#error = err;\n this.#loading = false;\n this.#opts.onError?.(err);\n this.#host.requestUpdate();\n }\n}\n","/* eslint-disable ts/no-unsafe-declaration-merging */\nimport type { PropertyValues } from 'lit';\nimport type { IDataProvider } from '../common/data-provider.js';\nimport type {\n AcTokenAddDetail,\n AcTokenElementEventMap,\n AcTokenItem,\n AcTokenizerFn,\n AcTokenRemoveDetail,\n AcTokensChangeDetail,\n} from './types.js';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { DataController } from '../common/data-controller.js';\nimport { createAcCompletionProvider } from '../incr-search/index.js';\nimport { TickledController } from '../interaction/tickled-controller.js';\nimport { tickledItemStyles, tickledStyles } from '../interaction/tickled-styles.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport '../icons/icon.js';\n\nexport type {\n AcTokenAddDetail,\n AcTokenAddEvent,\n AcTokenElementEventMap,\n AcTokenItem,\n AcTokenizerFn,\n AcTokenRemoveDetail,\n AcTokenRemoveEvent,\n AcTokensChangeDetail,\n AcTokensChangeEvent,\n} from './types.js';\n\n// ---- Helpers ----\n\nconst DEFAULT_TOKENIZER: AcTokenizerFn = (text: string) => text.split(/[\\s,;]+/);\n\ntype LruCache<K, V> = {\n get: (k: K) => V | undefined;\n set: (k: K, v: V) => void;\n has: (k: K) => boolean;\n clear: () => void;\n};\n\nfunction makeLruCache<K, V>(maxSize: number): LruCache<K, V> {\n const map = new Map<K, V>();\n return {\n get: k => map.get(k),\n set: (k, v) => {\n if (map.has(k))\n map.delete(k);\n map.set(k, v);\n if (map.size > maxSize)\n map.delete(map.keys().next().value!);\n },\n has: k => map.has(k),\n clear: () => map.clear(),\n };\n}\n\n// ---- Component ----\n\n/**\n * Token/tag input with per-token autocomplete suggestions.\n *\n * Users type tokens separated by space, comma or semicolon (default). Each\n * committed token appears as a chip inline with the text cursor. The\n * suggestion popup follows the input cursor position.\n *\n * @fires {AcTokensChangeEvent} ac-token-change — any time the token list changes\n * @fires {AcTokenAddEvent} ac-token-add — when a token is added\n * @fires {AcTokenRemoveEvent} ac-token-remove — when a token is removed\n *\n * @example\n * ```html\n * <ixfx-ac-token placeholder=\"Add tags…\" data-tokens=\"one two three\"></ixfx-ac-token>\n * ```\n */\n@customElement(`ixfx-ac-token`)\nexport class AcTokenElement extends LitElement {\n /** Provides completion results for the current draft token. */\n @property({ type: Object })\n completionProvider: IDataProvider<string, AcTokenItem> | undefined;\n\n /** Custom tokenizer — defaults to splitting on space, comma, semicolon. */\n @property({ type: Object })\n tokenizer: AcTokenizerFn | undefined;\n\n /** Placeholder text shown when no tokens or draft text are present. */\n @property({ type: String })\n placeholder = ``;\n\n /** Maximum number of query results to cache (LRU). */\n @property({ type: Number, attribute: `cache-size` })\n cacheSize = 20;\n\n /** Debounce delay in ms before invoking the provider after keystroke. */\n @property({ type: Number, attribute: `debounce-ms` })\n debounceMs = 150;\n\n /**\n * When true, only suggestions from the popup can be committed.\n * When false (default), typing text and pressing Enter commits it as-is.\n */\n @property({ type: Boolean })\n strict = false;\n\n /**\n * When false (default), tokens that have already been committed are\n * filtered out of the suggestion list. Set to true to show all\n * suggestions including duplicates.\n */\n @property({ type: Boolean, attribute: `allow-duplicates` })\n allowDuplicates = false;\n\n @state() private _tokens: AcTokenItem[] = [];\n @state() private _draft = ``;\n @state() private _selectedTokenIndex: number | undefined;\n @state() private _isOpen = false;\n\n private _tickled = new TickledController<number>(this, {\n getItems: () => this.#data.items.map((_, i) => ({ id: i, enabled: true })),\n });\n\n #data = new DataController<string, AcTokenItem>(this, undefined, {\n clearOnRequest: true,\n onError: err => console.error(`[ixfx-ac-token] completionProvider error:`, err),\n });\n\n #cache: LruCache<string, readonly AcTokenItem[]> = makeLruCache(20);\n #debounceTimer: ReturnType<typeof setTimeout> | undefined;\n #staticProvider: IDataProvider<string, AcTokenItem> | undefined;\n #lastSuggestions: readonly AcTokenItem[] = [];\n\n constructor() {\n super();\n this.#cache = makeLruCache<string, readonly AcTokenItem[]>(this.cacheSize);\n }\n\n // ---- Public API ----\n\n get tokens(): readonly AcTokenItem[] {\n return this._tokens;\n }\n\n set tokens(value: readonly AcTokenItem[]) {\n this._tokens = [...value];\n this.#emitChange();\n }\n\n /** All committed token labels joined with commas. */\n get value(): string {\n return this._tokens.map(t => t.label).join(`, `);\n }\n\n // ---- Lifecycle ----\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.#buildStaticProvider();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n if (this.#debounceTimer !== undefined) {\n clearTimeout(this.#debounceTimer);\n this.#debounceTimer = undefined;\n }\n // DataController.cancel() called automatically via hostDisconnected\n }\n\n protected override updated(changedProps: PropertyValues): void {\n if (changedProps.has(`completionProvider`) || changedProps.has(`cacheSize`)) {\n this.#cache = makeLruCache<string, readonly AcTokenItem[]>(this.cacheSize);\n }\n if (changedProps.has(`completionProvider`)) {\n this.#buildStaticProvider();\n }\n // Clear keyboard cursor when suggestion list is replaced\n if (this.#data.items !== this.#lastSuggestions) {\n this.#lastSuggestions = this.#data.items;\n this._tickled.clearTickled();\n }\n }\n\n #buildStaticProvider(): void {\n const raw = this.getAttribute(`data-tokens`);\n if (!raw || this.completionProvider) {\n this.#staticProvider = undefined;\n return;\n }\n const items: AcTokenItem[] = raw\n .trim()\n .split(/[\\s,;]+/)\n .filter(Boolean)\n .map(label => ({ label }));\n this.#staticProvider = createAcCompletionProvider(items);\n }\n\n // ---- Handlers ----\n\n #onWrapperClick = (e: MouseEvent): void => {\n const target = e.target as HTMLElement;\n if (!target.closest(`.token-chip`)) {\n this.shadowRoot?.querySelector<HTMLInputElement>(`input.draft`)?.focus();\n }\n };\n\n #onFocus = (): void => {\n this._selectedTokenIndex = undefined;\n this.#scheduleSuggestionFetch(this._draft);\n };\n\n #onBlur = (): void => {\n // Delay so pointerdown on popup items fires first\n setTimeout(() => {\n this._isOpen = false;\n this._tickled.clearTickled();\n this._selectedTokenIndex = undefined;\n }, 120);\n };\n\n #onInput = (e: Event): void => {\n const input = e.target as HTMLInputElement;\n const value = input.value;\n this._selectedTokenIndex = undefined;\n\n const tokenize = this.tokenizer ?? DEFAULT_TOKENIZER;\n const parts = tokenize(value);\n\n if (parts.length > 1) {\n for (let i = 0; i < parts.length - 1; i++) {\n const label = parts[i].trim();\n if (label)\n this.#addToken({ label });\n }\n this._draft = parts[parts.length - 1] ?? ``;\n } else {\n this._draft = value;\n }\n\n this.#scheduleSuggestionFetch(this._draft);\n };\n\n #onKeyDown = (e: KeyboardEvent): void => {\n const input = e.target as HTMLInputElement;\n\n if ((e.metaKey || e.ctrlKey) && e.key === `a`) {\n e.preventDefault();\n const parts = [...this._tokens.map(t => t.label), this._draft.trim()].filter(Boolean);\n navigator.clipboard.writeText(parts.join(` `)).catch(() => {});\n return;\n }\n\n // Printable key while a token chip is selected → edit that token\n if (\n this._selectedTokenIndex !== undefined\n && e.key.length === 1\n && !e.metaKey && !e.ctrlKey && !e.altKey\n ) {\n e.preventDefault();\n this.#startEditingSelectedToken(e.key);\n return;\n }\n\n this.#handleNavigationKey(e, input);\n };\n\n #handleNavigationKey(e: KeyboardEvent, input: HTMLInputElement): void {\n switch (e.key) {\n case `ArrowLeft`: {\n if (input.selectionStart === 0 && input.selectionEnd === 0) {\n e.preventDefault();\n if (this._selectedTokenIndex === undefined) {\n if (this._tokens.length > 0)\n this._selectedTokenIndex = this._tokens.length - 1;\n } else if (this._selectedTokenIndex > 0) {\n this._selectedTokenIndex--;\n }\n }\n break;\n }\n case `ArrowRight`: {\n if (this._selectedTokenIndex !== undefined) {\n e.preventDefault();\n if (this._selectedTokenIndex < this._tokens.length - 1) {\n this._selectedTokenIndex++;\n } else {\n this._selectedTokenIndex = undefined;\n }\n }\n break;\n }\n case `Backspace`: {\n if (input.selectionStart === 0 && input.selectionEnd === 0) {\n e.preventDefault();\n if (this._selectedTokenIndex !== undefined) {\n this.#removeToken(this._selectedTokenIndex);\n } else if (this._tokens.length > 0) {\n this.#removeToken(this._tokens.length - 1);\n }\n }\n break;\n }\n case `Enter`: {\n const tickledIdx = this._tickled.tickledId;\n if (this._isOpen && tickledIdx !== undefined && this.#data.items[tickledIdx]) {\n e.preventDefault();\n this.#selectSuggestion(this.#data.items[tickledIdx] as AcTokenItem);\n } else if (!this.strict && this._draft.trim()) {\n e.preventDefault();\n this.#addToken({ label: this._draft.trim() });\n this._draft = ``;\n this.#closePopup();\n }\n break;\n }\n case `ArrowDown`: {\n if (!this._isOpen)\n return;\n e.preventDefault();\n this._tickled.handleKeyboardNavigation(`next`);\n this.#scrollSuggestionIntoView();\n break;\n }\n case `ArrowUp`: {\n if (!this._isOpen)\n return;\n e.preventDefault();\n this._tickled.handleKeyboardNavigation(`previous`);\n this.#scrollSuggestionIntoView();\n break;\n }\n case `Escape`: {\n e.preventDefault();\n this.#closePopup();\n this._selectedTokenIndex = undefined;\n break;\n }\n }\n }\n\n #onPaste = (e: ClipboardEvent): void => {\n e.preventDefault();\n const text = e.clipboardData?.getData(`text/plain`) ?? ``;\n if (!text)\n return;\n\n const tokenize = this.tokenizer ?? DEFAULT_TOKENIZER;\n const parts = tokenize(this._draft + text).filter(Boolean);\n if (parts.length === 0)\n return;\n\n if (parts.length === 1) {\n this._draft = parts[0];\n } else {\n for (let i = 0; i < parts.length - 1; i++) {\n const label = parts[i].trim();\n if (label)\n this.#addToken({ label });\n }\n this._draft = parts[parts.length - 1] ?? ``;\n }\n\n this.updateComplete.then(() => {\n this.shadowRoot\n ?.querySelector<HTMLInputElement>(`input.draft`)\n ?.setSelectionRange(this._draft.length, this._draft.length);\n });\n this.#scheduleSuggestionFetch(this._draft);\n };\n\n #onSuggestionPointerDown = (e: PointerEvent, item: AcTokenItem): void => {\n e.preventDefault();\n this.#selectSuggestion(item);\n };\n\n #onChipPointerDown = (e: PointerEvent, index: number): void => {\n if (e.button !== 0)\n return;\n e.preventDefault();\n const el = e.currentTarget as HTMLElement;\n const startY = e.clientY;\n let dragged = false;\n\n el.setPointerCapture(e.pointerId);\n\n const cleanup = (): void => {\n // eslint-disable-next-line ts/no-use-before-define\n el.removeEventListener(`pointermove`, onMove);\n // eslint-disable-next-line ts/no-use-before-define\n el.removeEventListener(`pointerup`, onUp);\n };\n\n const onMove = (me: PointerEvent): void => {\n if (Math.abs(me.clientY - startY) > 28) {\n dragged = true;\n el.releasePointerCapture(me.pointerId);\n cleanup();\n this.#removeToken(index);\n this.shadowRoot?.querySelector<HTMLInputElement>(`input.draft`)?.focus();\n }\n };\n\n const onUp = (): void => {\n cleanup();\n if (!dragged) {\n this._selectedTokenIndex = this._selectedTokenIndex === index ? undefined : index;\n this.shadowRoot?.querySelector<HTMLInputElement>(`input.draft`)?.focus();\n }\n };\n\n el.addEventListener(`pointermove`, onMove);\n el.addEventListener(`pointerup`, onUp);\n };\n\n // ---- Internal logic ----\n\n #startEditingSelectedToken(key: string): void {\n const idx = this._selectedTokenIndex;\n if (idx === undefined)\n return;\n const token = this._tokens[idx];\n if (!token)\n return;\n\n const newDraft = token.label + key;\n this.#removeToken(idx);\n this._selectedTokenIndex = undefined;\n this._draft = newDraft;\n\n this.updateComplete.then(() => {\n const inp = this.shadowRoot?.querySelector<HTMLInputElement>(`input.draft`);\n if (!inp)\n return;\n inp.setSelectionRange(inp.value.length, inp.value.length);\n });\n this.#scheduleSuggestionFetch(newDraft);\n }\n\n #addToken(item: AcTokenItem): void {\n const index = this._tokens.length;\n this._tokens = [...this._tokens, item];\n this.dispatchEvent(new CustomEvent<AcTokenAddDetail>(`ac-token-add`, {\n detail: { item, index },\n bubbles: true,\n composed: true,\n }));\n this.#emitChange();\n }\n\n #removeToken(index: number): void {\n const item = this._tokens[index];\n if (!item)\n return;\n this._tokens = this._tokens.filter((_, i) => i !== index);\n\n if (this._selectedTokenIndex !== undefined) {\n if (this._selectedTokenIndex === index) {\n this._selectedTokenIndex = undefined;\n } else if (this._selectedTokenIndex > index) {\n this._selectedTokenIndex--;\n }\n }\n\n this.dispatchEvent(new CustomEvent<AcTokenRemoveDetail>(`ac-token-remove`, {\n detail: { item, index },\n bubbles: true,\n composed: true,\n }));\n this.#emitChange();\n }\n\n #selectSuggestion(item: AcTokenItem): void {\n this.#addToken(item);\n this._draft = ``;\n this.#closePopup();\n }\n\n #emitChange(): void {\n this.dispatchEvent(new CustomEvent<AcTokensChangeDetail>(`ac-token-change`, {\n detail: { tokens: this._tokens },\n bubbles: true,\n composed: true,\n }));\n }\n\n #filterUsed(items: readonly AcTokenItem[]): readonly AcTokenItem[] {\n if (this.allowDuplicates)\n return items;\n const used = new Set(this._tokens.map(t => t.label));\n return items.filter(item => !used.has(item.label));\n }\n\n #closePopup(): void {\n this._isOpen = false;\n this._tickled.clearTickled();\n }\n\n #cancelPending(): void {\n if (this.#debounceTimer !== undefined) {\n clearTimeout(this.#debounceTimer);\n this.#debounceTimer = undefined;\n }\n this.#data.cancel();\n }\n\n #scheduleSuggestionFetch(query: string): void {\n const cachedProvider = this.#buildCachedProvider();\n if (!cachedProvider) {\n this._isOpen = false;\n return;\n }\n\n if (this.#debounceTimer !== undefined)\n clearTimeout(this.#debounceTimer);\n this._isOpen = true;\n\n this.#debounceTimer = setTimeout(() => {\n this.#data.provider = cachedProvider;\n this.#data.request(query);\n }, this.debounceMs);\n }\n\n #buildCachedProvider(): IDataProvider<string, AcTokenItem> | undefined {\n const raw = this.completionProvider ?? this.#staticProvider;\n if (!raw)\n return undefined;\n\n return (query, signal) => {\n const hit = this.#cache.get(query);\n if (hit !== undefined)\n return this.#filterUsed(hit as AcTokenItem[]);\n\n const result = raw(query, signal);\n\n // Streaming providers pass through uncached\n if (Symbol.asyncIterator in new Object(result))\n return result;\n\n if (Array.isArray(result)) {\n this.#cache.set(query, result);\n return this.#filterUsed(result);\n }\n\n return (result as Promise<readonly AcTokenItem[]>).then((items) => {\n if (!signal.aborted)\n this.#cache.set(query, items);\n return this.#filterUsed(items);\n });\n };\n }\n\n #scrollSuggestionIntoView(): void {\n this.updateComplete.then(() => {\n this.shadowRoot?.querySelector(`.item.tickled`)?.scrollIntoView({ block: `nearest` });\n });\n }\n\n // ---- Render helpers ----\n\n #renderChip(item: AcTokenItem, index: number) {\n const isSelected = this._selectedTokenIndex === index;\n return html`\n <span\n class=\"token-chip ${isSelected ? `selected` : ``}\"\n title=${item.subLabel ?? nothing}\n @pointerdown=${(e: PointerEvent) => this.#onChipPointerDown(e, index)}\n >\n ${item.icon ? html`<ixfx-icon class=\"chip-icon\" name=${item.icon}></ixfx-icon>` : nothing}\n <span class=\"chip-label\">${item.label}</span>\n </span>\n `;\n }\n\n #renderSuggestion(item: AcTokenItem, index: number) {\n const isTickled = this._tickled.isTickled(index);\n return html`\n <div\n class=\"item ${isTickled ? `tickled` : ``}\"\n role=\"option\"\n id=\"ac-token-sugg-${index}\"\n aria-selected=${isTickled}\n @pointerenter=${() => this._tickled.handlePointerEnter(index)}\n @pointerdown=${(e: PointerEvent) => this.#onSuggestionPointerDown(e, item)}\n >\n ${item.icon ? html`<ixfx-icon class=\"sugg-icon\" name=${item.icon}></ixfx-icon>` : nothing}\n <span class=\"sugg-label\">${item.label}</span>\n ${item.subLabel ? html`<span class=\"sugg-sublabel\">${item.subLabel}</span>` : nothing}\n </div>\n `;\n }\n\n #renderPopup() {\n const showEmpty = !this.#data.loading && this.#data.items.length === 0;\n return html`\n <div\n class=\"popup\"\n role=\"listbox\"\n aria-label=\"Suggestions\"\n data-input-mode=${this._tickled.inputMode}\n @pointerleave=${(e: PointerEvent) => this._tickled.handlePointerLeave(e)}\n >\n ${showEmpty\n ? html`<div class=\"no-results\">No matching results</div>`\n : this.#data.items.map((item, i) => this.#renderSuggestion(item as AcTokenItem, i))\n }\n </div>\n `;\n }\n\n protected override render() {\n const tickledIdx = this._tickled.tickledId ?? -1;\n const activeDescendant = tickledIdx >= 0 ? `ac-token-sugg-${tickledIdx}` : undefined;\n const showPlaceholder = this._tokens.length === 0 ? (this.placeholder || nothing) : nothing;\n\n return html`\n <div class=\"wrapper\" @click=${this.#onWrapperClick}>\n ${this._tokens.map((t, i) => this.#renderChip(t, i))}\n <input\n type=\"text\"\n class=\"draft\"\n .value=${this._draft}\n placeholder=${showPlaceholder}\n autocomplete=\"off\"\n spellcheck=\"false\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-expanded=${this._isOpen}\n aria-activedescendant=${activeDescendant ?? nothing}\n @input=${this.#onInput}\n @keydown=${this.#onKeyDown}\n @focus=${this.#onFocus}\n @blur=${this.#onBlur}\n @paste=${this.#onPaste}\n >\n ${this.#data.loading ? html`<span class=\"spinner\" aria-hidden=\"true\"></span>` : nothing}\n </div>\n ${this._isOpen ? this.#renderPopup() : nothing}\n `;\n }\n\n static override styles = [\n themeFallbacks,\n tickledStyles,\n tickledItemStyles,\n css`\n :host {\n display: block;\n position: relative;\n font-family: var(--font-family, system-ui, sans-serif);\n font-size: var(--text-m, 12px);\n color: var(--surface-2-text);\n }\n\n /* ---- Wrapper (looks like a text input) ---- */\n\n .wrapper {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--ac-token-chip-gap, var(--space-xs, 3px));\n padding: var(--ac-token-input-padding, var(--space-xs, 3px) var(--space-m, 8px));\n background: var(--ac-token-input-background, var(--surface-3, var(--surface-2)));\n color: var(--surface-2-text);\n border: var(--ac-token-input-border, var(--border));\n border-radius: var(--ac-token-input-border-radius, var(--radius-m, 4px));\n cursor: text;\n min-height: 32px;\n box-sizing: border-box;\n transition: border-color var(--transition, 0.15s ease-out);\n }\n\n .wrapper:focus-within {\n border-color: var(--accent);\n }\n\n /* ---- Token chips ---- */\n\n .token-chip {\n display: inline-flex;\n align-items: center;\n gap: var(--space-xs, 3px);\n padding: 1px var(--space-m, 8px);\n background: var(--ac-token-chip-background, var(--surface-4));\n border: var(--ac-token-chip-border, var(--border));\n border-radius: var(--ac-token-chip-border-radius, var(--radius-s, 3px));\n user-select: none;\n cursor: default;\n font-size: var(--text-s, 11px);\n white-space: nowrap;\n touch-action: none;\n transition:\n background var(--transition, 0.1s ease-out),\n border-color var(--transition, 0.1s ease-out),\n color var(--transition, 0.1s ease-out);\n }\n\n .token-chip.selected {\n background: var(--ac-token-chip-selected-background, var(--accent));\n color: var(--ac-token-chip-selected-color, var(--accent-text, #fff));\n border-color: var(--accent);\n }\n\n .chip-icon {\n flex-shrink: 0;\n width: 1em;\n height: 1em;\n }\n\n /* ---- Draft input ---- */\n\n input.draft {\n flex: 1;\n min-width: 60px;\n border: none;\n background: transparent;\n color: inherit;\n font: inherit;\n outline: none;\n caret-color: var(--accent);\n padding: 1px 0;\n anchor-name: --ac-token-draft;\n }\n\n input.draft::placeholder {\n color: var(--surface-muted-text);\n }\n\n /* ---- Spinner ---- */\n\n .spinner {\n width: 12px;\n height: 12px;\n border: 2px solid var(--surface-5);\n border-top-color: var(--accent);\n border-radius: 50%;\n animation: ac-token-spin 0.7s linear infinite;\n flex-shrink: 0;\n pointer-events: none;\n margin-left: var(--space-xs, 3px);\n }\n\n @keyframes ac-token-spin {\n to { transform: rotate(360deg); }\n }\n\n /* ---- Popup ---- */\n\n .popup {\n position: fixed;\n position-anchor: --ac-token-draft;\n top: anchor(bottom);\n left: anchor(left);\n margin-top: 2px;\n position-try-fallbacks: --ac-token-popup-above;\n z-index: 200;\n background: var(--surface-3, var(--surface-2));\n border: var(--border);\n border-radius: var(--radius-m, 4px);\n box-shadow: var(--shadow-l, 0 4px 24px rgba(0, 0, 0, 0.5));\n padding: var(--space-xs, 3px) 0;\n max-height: 260px;\n min-width: 160px;\n overflow-y: auto;\n font-size: var(--ac-token-popup-font-size, var(--text-s, 11px));\n }\n\n @position-try --ac-token-popup-above {\n top: auto;\n bottom: anchor(top);\n left: anchor(left);\n margin-top: 0;\n margin-bottom: 2px;\n }\n\n /* ---- Suggestion items ---- */\n\n .item {\n /* tickledItemStyles provides base; override layout for popup context */\n display: flex;\n padding: var(--item-padding, var(--space-xs, 3px) var(--space-l, 12px));\n gap: var(--space-m, 8px);\n cursor: pointer;\n margin: 0 var(--space-xs, 3px);\n white-space: nowrap;\n min-height: 28px;\n user-select: none;\n }\n\n .sugg-icon {\n flex-shrink: 0;\n width: 1em;\n height: 1em;\n }\n\n .sugg-label {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .sugg-sublabel {\n flex-shrink: 0;\n margin-left: auto;\n color: var(--surface-muted-text);\n font-size: var(--text-s, 11px);\n }\n\n /* ---- Empty state ---- */\n\n .no-results {\n padding: var(--space-m, 8px) var(--space-l, 12px);\n color: var(--surface-muted-text);\n font-style: italic;\n }\n `,\n ];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-ac-token': AcTokenElement;\n }\n}\n\nexport interface AcTokenElement {\n addEventListener: (<K extends keyof AcTokenElementEventMap>(\n type: K,\n listener: (this: AcTokenElement, event: AcTokenElementEventMap[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 } from 'lit';\nimport { css, html, LitElement } from 'lit';\nimport { property, query, state } from 'lit/decorators.js';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { prominenceStyles } from '../styles/prominence.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport '../icons/icon.js';\n\nexport type RadioGroupMode = `compact` | `max`;\n\nexport type RadioItem = Readonly<{\n value: string;\n label: string;\n disabled?: boolean;\n iconName?: string;\n iconNameOff?: string;\n}>;\n\n@customElement(`ixfx-radio-group`)\nexport class RadioGroup extends LitElement {\n @property({ type: String }) value = ``;\n @property({ type: String }) orientation: `horizontal` | `vertical` = `horizontal`;\n @property({ type: Array }) items: RadioItem[] = [];\n @property({ type: String }) name = ``;\n @property({ type: String }) mode: RadioGroupMode = `compact`;\n @property({ type: Boolean }) checked = false;\n @property({ type: String, attribute: `value-off` }) valueOff = ``;\n @property({ type: String, attribute: `icon-name` }) iconName = ``;\n @property({ type: String, attribute: `icon-name-off` }) iconNameOff = ``;\n @property({ type: Boolean, attribute: `hide-labels` }) hideLabels = false;\n\n @state() private _computedItems: RadioItem[] = [];\n @state() private _icons: Map<string, string> = new Map();\n @query(`slot`) private _slot?: HTMLSlotElement;\n\n private get _isSingleToggle(): boolean {\n return this._computedItems.length === 0 && Boolean(this.textContent?.trim());\n }\n\n private get _singleToggleIconName(): string | null {\n if (!this.iconName && !this.iconNameOff)\n return null;\n return this.checked ? this.iconName : (this.iconNameOff || this.iconName);\n }\n\n protected override firstUpdated(): void {\n this.#updateComputedItems();\n }\n\n protected override updated(changedProperties: PropertyValues): void {\n if (changedProperties.has(`checked`)) {\n const input = this.shadowRoot?.querySelector(`.radio-toggle-input`) as HTMLInputElement | undefined;\n if (input && input.checked !== this.checked) {\n input.checked = this.checked;\n const newValue = this.checked\n ? (this.value || `on`)\n : (this.valueOff || undefined);\n\n this.dispatchEvent(new CustomEvent<RadioGroupChangeDetail>(`change`, {\n detail: { checked: this.checked, value: newValue },\n bubbles: true,\n composed: true,\n }));\n }\n }\n\n if (changedProperties.has(`value`) && !this._isSingleToggle) {\n const inputs = this.shadowRoot?.querySelectorAll(`.radio-input`) as NodeListOf<HTMLInputElement>;\n if (inputs) {\n for (const input of inputs) {\n if (input.checked !== (input.value === this.value)) {\n input.checked = input.value === this.value;\n }\n }\n }\n }\n }\n\n #updateComputedItems(): void {\n const options = this.querySelectorAll(`option`);\n const icons = new Map<string, string>();\n\n if (options.length > 0) {\n this._computedItems = Array.from(options, (el) => {\n const tempDiv = document.createElement(`div`);\n tempDiv.innerHTML = el.innerHTML;\n const iconEl = tempDiv.querySelector(`svg`);\n if (iconEl) {\n icons.set(el.getAttribute(`value`) || ``, iconEl.outerHTML);\n }\n return {\n value: el.getAttribute(`value`) || ``,\n label: el.textContent?.trim() || ``,\n disabled: el.hasAttribute(`disabled`),\n iconName: el.getAttribute(`icon-name`) || undefined,\n iconNameOff: el.getAttribute(`icon-name-off`) || undefined,\n };\n });\n this._icons = icons;\n } else {\n this._computedItems = [...this.items];\n }\n }\n\n // #handleItemClick(item: RadioItem): void {\n // if (item.disabled || item.value === this.value)\n // return;\n\n // this.value = item.value;\n // this.dispatchEvent(new CustomEvent<RadioGroupChangeDetail>(`change`, {\n // detail: { checked: true, value: item.value },\n // bubbles: true,\n // composed: true,\n // }));\n // }\n\n #handleRadioChange(e: Event): void {\n e.stopImmediatePropagation();\n const input = e.target as HTMLInputElement;\n this.value = input.value;\n this.dispatchEvent(new CustomEvent<RadioGroupChangeDetail>(`change`, {\n detail: { checked: true, value: input.value },\n bubbles: true,\n composed: true,\n }));\n }\n\n #handleToggleChange(e: Event): void {\n e.stopImmediatePropagation();\n const input = e.target as HTMLInputElement;\n this.checked = input.checked;\n const newValue = this.checked\n ? (this.value || `on`)\n : (this.valueOff || undefined);\n\n this.dispatchEvent(new CustomEvent<RadioGroupChangeDetail>(`change`, {\n detail: { checked: this.checked, value: newValue },\n bubbles: true,\n composed: true,\n }));\n }\n\n #renderIcon(item: RadioItem): ReturnType<typeof html> | null {\n const isSelected = item.value === this.value;\n const iconName = isSelected ? (item.iconName || null) : (item.iconNameOff || item.iconName || null);\n if (iconName) {\n return html`<ixfx-icon class=\"radio-icon\" name=\"${iconName}\"></ixfx-icon>`;\n }\n const iconHtml = this._icons.get(item.value);\n if (!iconHtml)\n return null;\n return html`<span class=\"radio-icon\">${unsafeHTML(iconHtml)}</span>`;\n }\n\n protected override render(): unknown {\n if (this._isSingleToggle) {\n const iconName = this._singleToggleIconName;\n const showIcon = iconName || this.hideLabels;\n const iconPart = showIcon\n ? html`<ixfx-icon class=\"radio-icon\" name=\"${iconName || `check`}\"></ixfx-icon>`\n : null;\n const labelPart = !this.hideLabels\n ? html`<span class=\"radio-label\" data-text=\"${this.textContent?.trim()}\">${this.textContent?.trim()}</span>`\n : null;\n return html`\n <label class=\"radio-item ${this.checked ? `selected` : ``}\">\n <input\n type=\"checkbox\"\n class=\"radio-toggle-input\"\n ?checked=${this.checked}\n @change=${this.#handleToggleChange}\n />\n ${iconPart}\n ${labelPart}\n </label>\n `;\n }\n\n return html`\n <slot @slotchange=${this.#updateComputedItems} style=\"display: none;\"></slot>\n <div class=\"radio-group ${this.orientation} ${this.mode}\" role=\"radiogroup\" aria-label=${this.name}>\n ${this._computedItems.map((item) => {\n const isSelected = item.value === this.value;\n const iconName = isSelected\n ? (item.iconName || null)\n : (item.iconNameOff || item.iconName || null);\n const showIcon = iconName || this.hideLabels;\n const iconPart = showIcon\n ? html`<ixfx-icon class=\"radio-icon\" name=\"${iconName || `check`}\"></ixfx-icon>`\n : null;\n const labelPart = !this.hideLabels\n ? html`<span class=\"radio-label\" data-text=\"${item.label}\">${item.label}</span>`\n : null;\n return html`\n <label class=\"radio-item ${item.value === this.value ? `selected` : ``}\" ?disabled=${item.disabled}>\n <input\n type=\"radio\"\n class=\"radio-input\"\n name=${this.name}\n value=${item.value}\n ?disabled=${item.disabled}\n ?checked=${item.value === this.value}\n @change=${this.#handleRadioChange}\n />\n ${iconPart}\n ${labelPart}\n </label>\n `;\n })}\n </div>\n `;\n }\n\n static override styles = [themeFallbacks, prominenceStyles, css`\n :host {\n display: inline-flex;\n min-width: min-content;\n box-sizing: border-box;\n /* Default to looking like a cohesive control group */\n background: var(--surface-3, transparent);\n border: var(--border, none);\n border-radius: var(--radius-m, 4px);\n }\n\n * {\n box-sizing: border-box;\n }\n\n .radio-toggle-input {\n position: absolute;\n opacity: 0;\n width: 0;\n height: 0;\n pointer-events: none;\n }\n\n .radio-input {\n position: absolute;\n opacity: 0;\n width: 0;\n height: 0;\n pointer-events: none;\n }\n\n .radio-group {\n display: flex;\n width: 100%;\n height: 100%;\n gap: var(--item-spacing, 0);\n overflow: hidden;\n border-radius: inherit;\n }\n\n .radio-group.horizontal {\n flex-direction: row;\n }\n\n .radio-group.vertical {\n flex-direction: column;\n }\n\n .radio-group.max.horizontal .radio-item {\n flex: 1;\n justify-content: center;\n }\n\n .radio-group.max.vertical .radio-item {\n flex: 1;\n justify-content: flex-start;\n }\n\n .radio-item {\n display: inline-flex;\n align-items: center;\n justify-content: flex-start;\n gap: var(--icon-label-spacing, 0.5rem);\n padding: var(--space-m, 0.5rem) var(--space-l, 1rem);\n border: none;\n background: transparent;\n color: var(--color-fg-fade, var(--surface-muted-text));\n font-family: inherit;\n font-size: var(--text-m, inherit);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n cursor: pointer;\n transition: all var(--transition, 0.1s) ease;\n user-select: none;\n white-space: nowrap;\n }\n\n .radio-item:hover:not([disabled]) {\n opacity: 0.9;\n background: var(--surface-4, rgba(255,255,255,0.05));\n }\n\n .radio-item.selected {\n font-weight: bold;\n color: var(--color-fg-accent, var(--surface-2-text));\n background: var(--surface-6, rgba(255,255,255,0.1));\n }\n\n .radio-item[disabled] {\n cursor: not-allowed;\n }\n\n .radio-item:has(input:focus-visible) {\n outline: 2px solid var(--accent, #666);\n outline-offset: -2px;\n }\n\n .radio-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--icon-size, 1.2rem);\n height: var(--icon-size, 1.2rem);\n flex-shrink: 0;\n }\n\n .radio-icon svg {\n width: 100%;\n height: 100%;\n }\n\n .radio-label {\n position: relative;\n display: inline-flex;\n flex-shrink: 0;\n flex-direction: column;\n align-items: center;\n justify-content: space-between;\n }\n\n .radio-label::after {\n content: attr(data-text);\n content: attr(data-text)/\"\";\n font-weight: bold;\n height: 0;\n visibility: hidden;\n overflow: hidden;\n user-select: none;\n pointer-events: none;\n @media speech {\n display: none;\n }\n }\n\n .radio-group.vertical .radio-item {\n width: 100%;\n }\n\n .radio-group.horizontal .radio-item {\n flex-shrink: 0;\n }\n\n .radio-group.compact .radio-label {\n display: var(--show-labels, inline-flex);\n }\n\n .radio-group.compact.horizontal .radio-item {\n padding: var(--compact-padding, 0.5rem);\n }\n `];\n}\n\nexport type RadioGroupChangeDetail = {\n readonly checked: boolean;\n readonly value: string | undefined;\n};\n\nexport type RadioGroupChangeEvent = CustomEvent<RadioGroupChangeDetail>;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-radio-group': RadioGroup;\n }\n}\n","import type { CommandRegistry, KeyboardManager } from '@clinth/ui-commands';\nimport type { MenuTrigger } from '../menu/menu-trigger.js';\nimport type { ItemsProvider, PopupItem, SwitcherItem } from './types.js';\nimport { css, html, nothing } from 'lit';\nimport { property, query, state } from 'lit/decorators.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { prominenceStyles } from '../styles/prominence.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport { buttonStyles } from './button-styles.js';\nimport { ButtonElement } from './button.js';\nimport '../menu/menu-trigger.js';\nimport '../menu/menu-container.js';\nimport '../menu/menu-item.js';\nimport '../icons/icon.js';\n\nexport type SplitButtonMode = `default` | `switcher`;\n\n@customElement(`ixfx-split-button`)\nexport class SplitButton extends ButtonElement {\n @property({ attribute: false }) registry?: CommandRegistry<unknown>;\n @property({ attribute: false }) keyboardManager?: KeyboardManager;\n @property({ type: String }) mode: SplitButtonMode = `default`;\n @property({ type: String, attribute: `default-value` }) defaultValue = ``;\n /** When set, called each time the popup is opened; its return value replaces declarative items. */\n @property({ attribute: false }) itemsProvider?: ItemsProvider;\n /** Directly set popup items. Ignored when itemsProvider is also set. */\n @property({ attribute: false }) items?: PopupItem[];\n\n @query(`ixfx-menu-trigger`) private _menuTrigger!: MenuTrigger;\n\n @state() private _compact = false;\n @state() private _selectedCommand = ``;\n @state() private _selectedLabel = ``;\n @state() private _selectedIcon = ``;\n @state() private _switcherItems: SwitcherItem[] = [];\n @state() private _dynamicItems: PopupItem[] = [];\n @state() private _loadingItems = false;\n @state() private _menuHasItems = false;\n\n private _resizeObserver?: ResizeObserver;\n private _widthNeeded = 0;\n\n // ── Lifecycle ──────────────────────────────────────────────────────────\n\n override connectedCallback(): void {\n super.connectedCallback();\n this._resizeObserver = new ResizeObserver(([entry]) => {\n if (this._compact) {\n if (this._widthNeeded > 0 && entry.contentRect.width >= this._widthNeeded) {\n this._compact = false;\n }\n } else {\n this._checkOverflow();\n }\n });\n this._resizeObserver.observe(this);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this._resizeObserver?.disconnect();\n this._resizeObserver = undefined;\n this._menuTrigger?.removeEventListener(`menu-command`, this._handleSwitcherMenuCommand as EventListener);\n }\n\n override firstUpdated(): void {\n this.updateComplete.then(() => {\n this._menuTrigger?.addEventListener(`menu-command`, this._handleSwitcherMenuCommand as EventListener);\n });\n }\n\n override updated(changedProperties: Map<string, unknown>): void {\n super.updated(changedProperties);\n this._checkOverflow();\n if ((changedProperties.has(`items`) || changedProperties.has(`mode`)) && this.items && !this.itemsProvider) {\n this._applyItems(this.items);\n }\n }\n\n // ── Responsive ─────────────────────────────────────────────────────────\n\n private _checkOverflow(): void {\n if (this._compact)\n return;\n const primary = this.shadowRoot?.querySelector(`button.primary`) as HTMLElement | null;\n if (!primary)\n return;\n if (primary.scrollWidth > primary.offsetWidth + 1) {\n const caret = this.shadowRoot?.querySelector(`button.caret`) as HTMLElement | null;\n this._widthNeeded = primary.scrollWidth + (caret?.offsetWidth ?? 32) + 4;\n this._compact = true;\n }\n }\n\n // ── Programmatic API ───────────────────────────────────────────────────\n\n private _applyItems(items: PopupItem[]): void {\n if (this.mode === `switcher`) {\n this._applySwitcherItems(items.map(i => ({ command: i.command, label: i.label, icon: i.icon ?? `` })));\n } else {\n this._dynamicItems = [...items];\n this._menuHasItems = items.length > 0;\n }\n }\n\n /** In switcher mode, programmatically select the active command. Returns false if not found. */\n selectCommand(command: string): boolean {\n const item = this._switcherItems.find(i => i.command === command);\n if (!item)\n return false;\n this._selectedCommand = item.command;\n this._selectedLabel = item.label;\n this._selectedIcon = item.icon;\n return true;\n }\n\n // ── Caret state ────────────────────────────────────────────────────────\n\n /** True when there is (or will be) popup content. Used to dim the caret visually. */\n private get _caretHasContent(): boolean {\n if (this.itemsProvider)\n return true;\n if (this.items && this.items.length > 0)\n return true;\n if (this.mode === `switcher`)\n return this._switcherItems.length > 1;\n return this._menuHasItems;\n }\n\n // ── Default-mode slot ──────────────────────────────────────────────────\n\n private _onDefaultMenuSlotChange = (e: Event): void => {\n const slot = e.target as HTMLSlotElement;\n this._menuHasItems = slot.assignedElements({ flatten: true }).length > 0;\n };\n\n // ── Switcher helpers ───────────────────────────────────────────────────\n\n private _onSwitcherSlotChange = (e: Event): void => {\n // When itemsProvider is set, declarative items are ignored\n if (this.itemsProvider)\n return;\n const slot = e.target as HTMLSlotElement;\n this._applySwitcherItems(\n slot.assignedElements({ flatten: true })\n .filter(el => el.tagName === `IXFX-MENU-ITEM`)\n .map(el => ({\n command: el.getAttribute(`command`) ?? ``,\n label: el.getAttribute(`label`) ?? el.textContent?.trim() ?? ``,\n icon: el.getAttribute(`icon-name`) ?? ``,\n })),\n );\n };\n\n private _applySwitcherItems(items: SwitcherItem[]): void {\n this._switcherItems = items;\n if (!this._selectedCommand && items.length > 0) {\n const picked = this.defaultValue\n ? (items.find(i => i.command === this.defaultValue) ?? items[0])\n : items[0];\n this._selectedCommand = picked.command;\n this._selectedLabel = picked.label;\n this._selectedIcon = picked.icon;\n }\n }\n\n private _handleSwitcherMenuCommand = (e: CustomEvent): void => {\n if (this.mode !== `switcher`)\n return;\n e.stopPropagation();\n\n const { command } = e.detail;\n const item = this._switcherItems.find(i => i.command === command);\n if (!item)\n return;\n\n this._selectedCommand = item.command;\n this._selectedLabel = item.label;\n this._selectedIcon = item.icon;\n\n // Fire immediately\n this.dispatchEvent(new CustomEvent(`menu-command`, {\n detail: e.detail,\n bubbles: true,\n composed: true,\n }));\n };\n\n private _handleSwitcherPrimaryClick = (): void => {\n if (!this._selectedCommand)\n return;\n this.dispatchEvent(new CustomEvent(`menu-command`, {\n detail: { command: this._selectedCommand },\n bubbles: true,\n composed: true,\n }));\n };\n\n // ── Caret / menu open ──────────────────────────────────────────────────\n\n private _handleCaretClick = async (e: Event): Promise<void> => {\n e.stopPropagation();\n if (this._menuTrigger?.isOpen) {\n this._menuTrigger.closeMenu();\n return;\n }\n\n if (this.itemsProvider) {\n this._loadingItems = true;\n try {\n const result = this.itemsProvider();\n const items = result instanceof Promise ? await result : result;\n\n if (this.mode === `switcher`) {\n this._applySwitcherItems(\n items.map(i => ({ command: i.command, label: i.label, icon: i.icon ?? `` })),\n );\n } else {\n this._dynamicItems = items;\n }\n } finally {\n this._loadingItems = false;\n }\n // Let Lit render the new items before the popup opens\n await this.updateComplete;\n }\n\n this._menuTrigger?.openMenu();\n };\n\n private _handlePrimaryKeyDown = (e: KeyboardEvent): void => {\n if (e.key === `ArrowDown`) {\n e.preventDefault();\n this._menuTrigger?.openMenu();\n }\n };\n\n private _handleCaretKeyDown = (e: KeyboardEvent): void => {\n if (e.key === `ArrowDown`) {\n e.preventDefault();\n this._menuTrigger?.openMenu();\n }\n };\n\n // ── Render ─────────────────────────────────────────────────────────────\n\n protected override render() {\n return this.mode === `switcher`\n ? this._renderSwitcher()\n : this._renderDefault();\n }\n\n private _renderCaret(iconName: string, ariaLabel: string) {\n const empty = !this._caretHasContent;\n return html`\n <button\n slot=\"trigger\"\n class=\"caret\"\n part=\"caret\"\n ?disabled=${this.disabled}\n ?data-empty=${empty}\n aria-haspopup=\"true\"\n aria-label=${ariaLabel}\n @click=${this._handleCaretClick}\n @keydown=${this._handleCaretKeyDown}\n >\n <ixfx-icon name=\"${iconName}\"></ixfx-icon>\n </button>\n `;\n }\n\n private _renderLoadingOrItems(items: PopupItem[]) {\n if (this._loadingItems) {\n return html`<ixfx-menu-item label=\"Loading…\" disabled></ixfx-menu-item>`;\n }\n return items.map(i => html`\n <ixfx-menu-item\n command=${i.command}\n label=${i.label}\n icon-name=${i.icon || nothing}\n ?disabled=${i.disabled ?? false}\n ></ixfx-menu-item>\n `);\n }\n\n private _renderDefault() {\n const showLabel = !this.hideLabel && !this._compact;\n const label = showLabel\n ? html`<span class=\"button-label\"><slot></slot></span>`\n : nothing;\n\n const menuContent = this.itemsProvider\n ? html`\n <ixfx-menu-container slot=\"menu\">\n ${this._renderLoadingOrItems(this._dynamicItems)}\n </ixfx-menu-container>\n `\n : html`<slot name=\"menu\" slot=\"menu\" @slotchange=${this._onDefaultMenuSlotChange}></slot>`;\n\n return html`\n <div class=\"split\">\n <button\n class=\"primary\"\n part=\"primary\"\n ?disabled=${this.disabled}\n @keydown=${this._handlePrimaryKeyDown}\n >\n ${this._renderIcon()}${label}\n </button>\n <ixfx-menu-trigger .registry=${this.registry} .keyboardManager=${this.keyboardManager}>\n ${this._renderCaret(`chevron-down`, `Open menu`)}\n ${menuContent}\n </ixfx-menu-trigger>\n </div>\n `;\n }\n\n private _renderSwitcher() {\n const showLabel = !this.hideLabel && !this._compact;\n\n const primaryIcon = this._selectedIcon\n ? html`<ixfx-icon class=\"button-icon\" name=\"${this._selectedIcon}\"></ixfx-icon>`\n : nothing;\n\n const primaryLabel = showLabel\n ? html`<span class=\"button-label\">${this._selectedLabel}</span>`\n : nothing;\n\n const popupItems = this.itemsProvider\n ? this._renderLoadingOrItems(this._dynamicItems)\n : this._switcherItems\n .filter(i => i.command !== this._selectedCommand)\n .map(i => html`\n <ixfx-menu-item\n command=${i.command}\n label=${i.label}\n icon-name=${i.icon || nothing}\n ></ixfx-menu-item>\n `);\n\n return html`\n <!-- Hidden data-capture slot reads light-DOM items as the data source -->\n <slot name=\"menu\" class=\"switcher-data\" @slotchange=${this._onSwitcherSlotChange}></slot>\n <div class=\"split switcher\">\n <button\n class=\"primary\"\n part=\"primary\"\n ?disabled=${this.disabled}\n @keydown=${this._handlePrimaryKeyDown}\n @click=${this._handleSwitcherPrimaryClick}\n >\n ${primaryIcon}${primaryLabel}\n </button>\n <ixfx-menu-trigger .registry=${this.registry} .keyboardManager=${this.keyboardManager}>\n ${this._renderCaret(`chevron-right`, `Choose action`)}\n <ixfx-menu-container slot=\"menu\">\n ${popupItems}\n </ixfx-menu-container>\n </ixfx-menu-trigger>\n </div>\n `;\n }\n\n // ── Styles ─────────────────────────────────────────────────────────────\n\n static override styles = [\n themeFallbacks,\n prominenceStyles,\n buttonStyles,\n css`\n :host {\n display: inline-flex;\n max-width: 100%;\n vertical-align: middle;\n }\n\n slot.switcher-data {\n display: none;\n }\n\n .split {\n display: inline-flex;\n width: 100%;\n background: var(--surface-3, #ccc);\n color: var(--surface-3-text, #000);\n border: var(--border, 1px solid #999);\n border-radius: var(--radius-xl, 8px);\n corner-shape: superellipse(1);\n box-shadow:\n inset 1px 1px 1px 1px color-mix(in oklch, var(--surface-4) 30%, transparent),\n inset -1px -1px 1px 1px color-mix(in oklch, var(--surface-2) 20%, transparent),\n 2px 2px 1px 0px color-mix(in oklch, var(--surface-2) 30%, transparent);\n overflow: hidden;\n transition: background var(--transition, 0.2s), border-color var(--transition, 0.2s);\n }\n\n /* Switcher: accent the caret separator to signal \"this changes the default\" */\n .split.switcher button.caret {\n border-inline-start-color: var(--accent, #666);\n opacity: 0.7;\n }\n\n .split.switcher button.caret:hover:not(:disabled) {\n opacity: 1;\n }\n\n /* Caret is dimmed when there is no popup content */\n button.caret[data-empty] {\n opacity: 0.3;\n pointer-events: none;\n }\n\n .split:has(button:hover:not(:disabled)) {\n border-color: var(--accent, #666);\n box-shadow:\n inset 1px 1px 1px 1px color-mix(in oklch, var(--surface-5) 70%, transparent),\n inset -1px -1px 1px 1px color-mix(in oklch, var(--surface-2) 60%, transparent),\n 2px 2px 1px 0px color-mix(in oklch, var(--surface-2) 90%, transparent);\n }\n\n .split:has(button:active:not(:disabled)) {\n transform: translateY(1px);\n box-shadow: inset 1px 1px 0px 0.5px color-mix(in oklch, var(--surface-1), transparent);\n }\n\n button.primary,\n button.caret {\n border: none;\n border-radius: 0;\n background: none;\n box-shadow: none;\n color: inherit;\n margin: 0;\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n transition: background var(--transition, 0.2s), opacity var(--transition, 0.2s);\n }\n\n button.primary {\n flex: 1;\n padding: var(--space-m, 8px) var(--space-l, 12px);\n gap: 0.5em;\n overflow: hidden;\n white-space: nowrap;\n }\n\n button.caret {\n padding: var(--space-m, 8px) var(--space-s, 6px);\n border-inline-start: var(--border, 1px solid #999);\n flex-shrink: 0;\n }\n\n button.primary:hover:not(:disabled),\n button.caret:hover:not(:disabled) {\n background: color-mix(in oklch, var(--surface-4) 80%, transparent);\n }\n\n button.primary:active:not(:disabled),\n button.caret:active:not(:disabled) {\n background: var(--surface-2, #aaa);\n transform: none;\n box-shadow: none;\n }\n\n button.primary:disabled,\n button.caret:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n button.primary:focus-visible,\n button.caret:focus-visible {\n outline: 2px solid var(--accent, #666);\n outline-offset: -2px;\n }\n\n ixfx-menu-trigger {\n display: inline-flex;\n align-items: stretch;\n }\n `,\n ];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-split-button': SplitButton;\n }\n}\n","import type { CrumbPathElement, CrumbSegment } from './crumb-path.js';\n\nimport { Trees } from '@ixfx/collections';\n\nexport type CrumbPathControllerOptions = {\n separator?: string;\n paths?: string[];\n onQuery?: (pathSegments: string[]) => Promise<CrumbSegment[]>;\n};\n\nexport class CrumbPathController {\n #element: CrumbPathElement | null = null;\n #pathed: Trees.Pathed.Pathed<CrumbSegment>;\n #separator: string;\n #onQuery: ((pathSegments: string[]) => Promise<CrumbSegment[]>) | undefined;\n\n constructor(options: CrumbPathControllerOptions = {}) {\n this.#separator = options.separator ?? `/`;\n this.#onQuery = options.onQuery;\n this.#pathed = new Trees.Pathed.Pathed<CrumbSegment>({ separator: this.#separator });\n\n if (options.paths) {\n this.addPaths(options.paths);\n // console.log(this.#pathed.prettyPrint());\n }\n }\n\n get separator(): string {\n return this.#separator;\n }\n\n addPath(path: string): void {\n const segments = path.split(this.#separator).filter(s => s.length > 0);\n for (let i = 0; i < segments.length; i++) {\n const segmentPath = segments.slice(0, i + 1).join(this.#separator);\n const label = segments[i];\n const segment: CrumbSegment = { label };\n this.#pathed.add(segment, segmentPath);\n }\n }\n\n addPaths(paths: string[]): void {\n for (const path of paths) {\n this.addPath(path);\n }\n }\n\n getPath(): string {\n return this.#element?.getPath() ?? ``;\n }\n\n setPath(path: string): void {\n this.#element?.setPath(path);\n }\n\n connect(element: CrumbPathElement): void {\n this.#element = element;\n element.separator = this.#separator;\n element.siblingLookup = this.#siblingLookup.bind(this);\n }\n\n disconnect(): void {\n if (this.#element) {\n this.#element.siblingLookup = undefined;\n this.#element = null;\n }\n }\n\n async #siblingLookup(\n pathSegments: string[],\n _index: number,\n signal: AbortSignal,\n ): Promise<CrumbSegment[]> {\n const currentPath = pathSegments.join(this.#separator);\n\n const cachedChildren = this.#pathed.children(currentPath);\n const children = [...cachedChildren];\n\n if (children.length > 0) {\n return children\n .map(node => node.value)\n .filter((v): v is NonNullable<typeof v> => v !== undefined)\n .map((v) => {\n if (`value` in v) {\n return v.value ?? { label: v.label };\n }\n return { label: v.label };\n });\n }\n\n if (this.#onQuery) {\n const newChildren = await this.#onQuery(pathSegments);\n\n for (const child of newChildren) {\n const childPath = currentPath.length > 0\n ? `${currentPath}${this.#separator}${child.label}`\n : child.label;\n this.#pathed.add(child, childPath);\n }\n\n if (signal.aborted) {\n return [];\n }\n\n return newChildren;\n }\n\n return [];\n }\n}\n","/* eslint-disable ts/no-unsafe-declaration-merging */\nimport type { PropertyValues } from 'lit';\nimport type { AcTextChangeEvent, AcTextItem } from '../ac-text/ac-text.js';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { popupSurfaceStyles } from '../styles/popup.js';\nimport { prominenceStyles } from '../styles/prominence.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport '../ac-text/ac-text.js';\n\nconst INVALID_ANCHOR_CHARS_RE = /[^\\w-]/g;\n\nexport type CrumbSegment = {\n label: string;\n icon?: string;\n isLeaf?: boolean;\n};\n\nexport type CrumbSiblingLookupFn = (\n pathSegments: string[],\n index: number,\n signal: AbortSignal,\n) => Promise<CrumbSegment[]>;\n\nexport type CrumbNavNavigateDetail = { index: number; label: string; parentPath: string; fullPath: string };\nexport type CrumbNavNavigateEvent = CustomEvent<CrumbNavNavigateDetail>;\nexport type CrumbNavChangeDetail = { label: string; parentPath: string; fullPath: string };\nexport type CrumbNavChangeEvent = CustomEvent<CrumbNavChangeDetail>;\nexport type CrumbNavExpandDetail = { index: number; segments: string[]; path: string; signal: AbortSignal };\nexport type CrumbNavExpandEvent = CustomEvent<CrumbNavExpandDetail>;\n\n@customElement(`ixfx-crumb-path`)\nexport class CrumbPathElement extends LitElement {\n @property({ type: String })\n path = ``;\n\n @property({ type: String })\n separator = `/`;\n\n @property({ type: String, attribute: `path-root` })\n pathRoot = ``;\n\n @property({ type: Object })\n siblingLookup: CrumbSiblingLookupFn | undefined;\n\n @state()\n private _openIdx: number | null = null;\n\n @state()\n private _editing = false;\n\n @state()\n private _cachedSiblings: Map<string, CrumbSegment[]> = new Map();\n\n @state()\n private _leafSegmentIndex: number | null = null;\n\n @state()\n private _confirmedLeafIndices: Set<string> = new Set();\n\n @state()\n private _dropdownActiveIndex = -1;\n\n @state()\n private _editingCancelled = false;\n\n @state()\n private _editStartIndex: number | null = null;\n\n @state()\n private _openCumPath: string | null = null;\n\n #pendingController: AbortController | undefined;\n #pendingIndex: number | undefined;\n readonly #uid = Math.random().toString(36).slice(2, 8);\n\n #anchorName(cumPath: string): string {\n return `--cp-${this.#uid}-${cumPath\n .replaceAll(this.separator, `-`)\n .replaceAll(` `, `-`)\n .replace(INVALID_ANCHOR_CHARS_RE, `-`)}`;\n }\n\n #closeDropdown() {\n if (this._openIdx !== null) {\n this._openIdx = null;\n this._openCumPath = null;\n this._dropdownActiveIndex = -1;\n this.#cleanupPending();\n const popup = this.shadowRoot?.querySelector(`.crumb-dropdown`) as HTMLElement | null;\n try {\n (popup as any)?.hidePopover();\n } catch { /* unsupported */ }\n }\n }\n\n #onPopoverToggle = (e: Event): void => {\n if ((e as ToggleEvent).newState === `closed` && this._openIdx !== null) {\n this._openIdx = null;\n this._dropdownActiveIndex = -1;\n this.#cleanupPending();\n }\n };\n\n protected override updated(changedProperties: PropertyValues): void {\n if (this._editing) {\n const el = this.shadowRoot?.querySelector(`ixfx-ac-text`);\n if (el instanceof LitElement) {\n const editValue = this.path;\n if (this._editStartIndex !== null) {\n const segments = this.#getSegments();\n const segmentLabel = segments[this._editStartIndex];\n const startPos = this.path.indexOf(segmentLabel);\n (el as any).focusWithValue(editValue, startPos);\n } else {\n (el as any).focusWithValue(editValue);\n }\n }\n }\n if (changedProperties.has(`_openIdx`) && this._openIdx !== null) {\n this.updateComplete.then(() => {\n const popup = this.shadowRoot?.querySelector(`.crumb-dropdown`) as HTMLElement | null;\n if (popup) {\n popup.style.setProperty(`position-anchor`, this.#anchorName(this._openCumPath ?? String(this._openIdx)));\n try {\n (popup as any).showPopover();\n } catch { /* unsupported */ }\n popup.focus();\n }\n });\n }\n }\n\n #cleanupPending() {\n if (this.#pendingController) {\n this.#pendingController.abort();\n this.#pendingController = undefined;\n this.#pendingIndex = undefined;\n }\n }\n\n #getSegments(): string[] {\n const fullPath = this.path;\n if (this.pathRoot.length > 0 && fullPath.startsWith(this.pathRoot)) {\n const relativePath = fullPath.slice(this.pathRoot.length);\n return relativePath.split(this.separator).filter(p => p.length > 0);\n }\n return this.path.split(this.separator).filter(p => p.length > 0);\n }\n\n #getRootSegments(): string[] {\n if (this.pathRoot.length === 0)\n return [];\n return this.pathRoot.split(this.separator).filter(p => p.length > 0);\n }\n\n #getCumulativePath(index: number, isRoot: boolean): string {\n const segments = this.#getSegments();\n const rootSegments = this.#getRootSegments();\n\n if (isRoot) {\n return rootSegments.slice(0, index + 1).join(this.separator);\n }\n\n return [...rootSegments, ...segments.slice(0, index + 1)].join(this.separator);\n }\n\n public setPath(newPath: string): void {\n this.#cleanupPending();\n if (this.pathRoot.length > 0 && !newPath.startsWith(this.pathRoot)) {\n newPath = this.pathRoot;\n }\n this.path = newPath;\n this._cachedSiblings = new Map();\n this._openIdx = null;\n this._leafSegmentIndex = null;\n this._confirmedLeafIndices = new Set();\n }\n\n public getPath(): string {\n return this.path;\n }\n\n #onCaretClick(index: number, event: MouseEvent) {\n event.preventDefault();\n event.stopPropagation();\n\n if (this._openIdx === index) {\n this.#closeDropdown();\n return;\n }\n\n const target = event.currentTarget as HTMLElement;\n const cumPath = target.dataset.cumulative;\n\n this._openIdx = index;\n this._openCumPath = cumPath ?? null;\n this._dropdownActiveIndex = -1;\n const segments = this.#getSegments();\n const rootSegments = this.#getRootSegments();\n\n const pathSegments = cumPath\n ? cumPath.split(this.separator).filter(p => p.length > 0)\n : (index === -1 ? rootSegments : segments.slice(0, index + 1));\n\n const cacheKey = cumPath ?? String(index);\n if (!this._cachedSiblings.has(cacheKey) && this.siblingLookup) {\n this.#cleanupPending();\n const controller = new AbortController();\n this.#pendingController = controller;\n this.#pendingIndex = index;\n\n this.siblingLookup(pathSegments, index, controller.signal)\n .then((siblings) => {\n if (!controller.signal.aborted) {\n this._cachedSiblings.set(cacheKey, siblings);\n if (siblings.length === 0) {\n this._confirmedLeafIndices.add(cumPath ?? ``);\n }\n this.#pendingController = undefined;\n this.#pendingIndex = undefined;\n this.requestUpdate();\n }\n })\n .catch((err) => {\n if (err.name !== `AbortError`) {\n console.error(`Sibling lookup failed:`, err);\n }\n this.#pendingController = undefined;\n this.#pendingIndex = undefined;\n });\n\n this.dispatchEvent(new CustomEvent<CrumbNavExpandDetail>(`expand`, {\n detail: { index, segments: pathSegments, path: pathSegments.join(this.separator), signal: controller.signal },\n bubbles: true,\n composed: true,\n }));\n }\n\n this.requestUpdate();\n }\n\n #onLabelClick(index: number, event: MouseEvent) {\n event.preventDefault();\n event.stopPropagation();\n this.#closeDropdown();\n\n const segments = this.#getSegments();\n const truncatedSegments = segments.slice(0, index + 1);\n const hadLeading = this.path.startsWith(this.separator);\n const newPath = truncatedSegments.join(this.separator);\n this.path = hadLeading ? this.separator + newPath : newPath;\n this._cachedSiblings = new Map();\n this._leafSegmentIndex = null;\n\n const parentPath = truncatedSegments.slice(0, -1).join(this.separator);\n this.dispatchEvent(new CustomEvent<CrumbNavNavigateDetail>(`navigate`, {\n detail: { index, label: truncatedSegments[index], parentPath, fullPath: newPath },\n bubbles: true,\n composed: true,\n }));\n }\n\n #selectSibling(index: number, segment: CrumbSegment): void {\n const cumPath = this._openCumPath;\n this.#closeDropdown();\n const segments = this.#getSegments();\n const rootSegments = this.#getRootSegments();\n let newSegments: string[];\n\n if (cumPath) {\n newSegments = [...cumPath.split(this.separator).filter(p => p.length > 0), segment.label];\n } else if (this.pathRoot.length > 0 && index < rootSegments.length) {\n newSegments = [...rootSegments.slice(0, index + 1), segment.label];\n } else {\n newSegments = [...rootSegments, ...segments.slice(0, index + 1 - rootSegments.length), segment.label];\n }\n\n const hadLeading = this.path.startsWith(this.separator);\n const newPath = newSegments.join(this.separator);\n this.path = hadLeading ? this.separator + newPath : newPath;\n this._cachedSiblings = new Map();\n const leafIndex = segment.isLeaf ? newSegments.length - 1 : null;\n this._leafSegmentIndex = leafIndex;\n if (segment.isLeaf) {\n this._confirmedLeafIndices.add(cumPath ?? ``);\n }\n const parentPath = newSegments.slice(0, -1).join(this.separator);\n this.dispatchEvent(new CustomEvent<CrumbNavNavigateDetail>(`navigate`, {\n detail: { index, label: segment.label, parentPath, fullPath: newPath },\n bubbles: true,\n composed: true,\n }));\n }\n\n #onSiblingClick(index: number, segment: CrumbSegment, event: MouseEvent) {\n event.preventDefault();\n event.stopPropagation();\n this.#selectSibling(index, segment);\n }\n\n #onDropdownKeyDown = (e: KeyboardEvent): void => {\n if (this._openIdx === null)\n return;\n const siblings = this._cachedSiblings.get(this._openCumPath ?? String(this._openIdx)) ?? [];\n if (!siblings.length) {\n if (e.key === `Escape`) {\n e.preventDefault(); this.#closeDropdown();\n }\n return;\n }\n switch (e.key) {\n case `ArrowDown`:\n e.preventDefault();\n this._dropdownActiveIndex = (this._dropdownActiveIndex + 1) % siblings.length;\n this.#scrollDropdownActiveIntoView();\n break;\n case `ArrowUp`:\n e.preventDefault();\n this._dropdownActiveIndex = this._dropdownActiveIndex <= 0\n ? siblings.length - 1\n : this._dropdownActiveIndex - 1;\n this.#scrollDropdownActiveIntoView();\n break;\n case `Enter`:\n if (this._dropdownActiveIndex >= 0) {\n e.preventDefault();\n this.#selectSibling(this._openIdx, siblings[this._dropdownActiveIndex]);\n }\n break;\n case `Escape`:\n e.preventDefault();\n this.#closeDropdown();\n break;\n }\n };\n\n #scrollDropdownActiveIntoView(): void {\n this.updateComplete.then(() => {\n this.shadowRoot?.querySelector(`.crumb-option.active`)\n ?.scrollIntoView({ block: `nearest` });\n });\n }\n\n #renderDropdownContent(index: number) {\n const siblings = this._cachedSiblings.get(this._openCumPath ?? String(index)) ?? [];\n const isPending = this.#pendingIndex === index;\n\n return html`\n ${isPending ? html`<span class=\"loading-spinner\"></span>` : nothing}\n ${siblings.length === 0 && !isPending\n ? html`<span class=\"crumb-option crumb-option-label\">No items</span>`\n : siblings.map((segment, i) => html`\n <div class=\"crumb-option ${i === this._dropdownActiveIndex ? `active` : ``}\"\n @click=${(e: MouseEvent) => this.#onSiblingClick(index, segment, e)}>\n ${segment.icon\n ? html`<ixfx-icon class=\"crumb-icon\" name=\"${segment.icon}\"></ixfx-icon>`\n : nothing}\n <span class=\"option-label\">${segment.label}</span>\n </div>\n `)}\n `;\n }\n\n #renderSegment(label: string, index: number, isLast: boolean) {\n const isOpen = this._openIdx === index;\n const cumPath = this.#getCumulativePath(index, false);\n\n return html`\n <div class=\"seg\" data-cumulative=${cumPath} @click=${(e: MouseEvent) => this.#onSegmentClick(index, e)}>\n <label title=${label} @click=${(e: MouseEvent) => this.#onLabelClick(index, e)}>\n ${label}\n </label>\n ${(!isLast || this.siblingLookup) && this._leafSegmentIndex !== index\n ? html`\n <div class=\"caret ${isOpen ? `open` : ``} ${this._confirmedLeafIndices.has(cumPath) ? `disabled` : ``}\"\n style=\"anchor-name: ${this.#anchorName(cumPath)}\"\n data-cumulative=${cumPath}\n @click=${(e: MouseEvent) => this.#onCaretClick(index, e)}>\n ${this.separator}\n </div>\n `\n : nothing}\n </div>\n `;\n }\n\n #renderRootSegment(label: string, index: number) {\n const rootSegments = this.#getRootSegments();\n const isLast = index === rootSegments.length - 1;\n const isOpen = this._openIdx === index;\n const cumPath = this.#getCumulativePath(index, true);\n\n return html`\n <div class=\"seg seg-root\" data-cumulative=${cumPath} @click=${(e: MouseEvent) => this.#onRootSegmentClick(index, e)}>\n <label title=${label}>${label}</label>\n ${isLast && this.siblingLookup\n ? html`\n <div class=\"caret ${isOpen ? `open` : ``} ${this._confirmedLeafIndices.has(cumPath) ? `disabled` : ``}\"\n style=\"anchor-name: ${this.#anchorName(cumPath)}\"\n data-cumulative=${cumPath}\n @click=${(e: MouseEvent) => this.#onCaretClick(index, e)}>\n ${this.separator}\n </div>\n `\n : nothing}\n </div>\n `;\n }\n\n #onRootSegmentClick(index: number, event: MouseEvent): void {\n event.preventDefault();\n event.stopPropagation();\n const rootSegments = this.#getRootSegments();\n const newPath = rootSegments.slice(0, index + 1).join(this.separator);\n this.setPath(newPath);\n }\n\n #onSegmentClick(index: number, event: MouseEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.#closeDropdown();\n this._editing = true;\n this._editStartIndex = index;\n }\n\n #onTrailingClick() {\n this.#closeDropdown();\n this._editing = true;\n this._editStartIndex = null;\n }\n\n #makeCompletionProvider() {\n return async (query: string, signal: AbortSignal): Promise<AcTextItem[]> => {\n if (!this.siblingLookup)\n return [];\n const endsWithSep = query.endsWith(this.separator);\n const parts = query.split(this.separator).filter(p => p.length > 0);\n const parentSegments = endsWithSep ? parts : parts.slice(0, -1);\n const lastSegment = endsWithSep ? `` : (parts.at(-1) ?? ``);\n const hadLeading = query.startsWith(this.separator);\n const children = await this.siblingLookup(\n parentSegments,\n parentSegments.length - 1,\n signal,\n );\n return children\n .filter(c => c.label.toLowerCase().startsWith(lastSegment.toLowerCase()))\n .map((c) => {\n const joined = [...parentSegments, c.label].join(this.separator);\n return { label: hadLeading ? this.separator + joined : joined, icon: c.icon, isLeaf: c.isLeaf };\n });\n };\n }\n\n #onAcChange(e: AcTextChangeEvent) {\n e.stopPropagation();\n const newPath = e.detail.value;\n this.path = newPath;\n this._cachedSiblings = new Map();\n this._leafSegmentIndex = newPath.endsWith(this.separator) ? null : newPath.split(this.separator).filter((p: string) => p.length > 0).length - 1;\n this._editing = false;\n this._editingCancelled = false;\n this._editStartIndex = null;\n this.#dispatchChangeEvent(newPath);\n }\n\n #onAcFocusOut() {\n if (this._editing) {\n this._editing = false;\n if (!this._editingCancelled) {\n const el = this.shadowRoot?.querySelector(`ixfx-ac-text`) as any;\n const newPath = el?.value ?? this.path;\n if (newPath !== this.path) {\n this.path = newPath;\n this._cachedSiblings = new Map();\n this._leafSegmentIndex = newPath.endsWith(this.separator) ? null : newPath.split(this.separator).filter((p: string) => p.length > 0).length - 1;\n this.#dispatchChangeEvent(newPath);\n }\n }\n this._editingCancelled = false;\n this._editStartIndex = null;\n }\n }\n\n #dispatchChangeEvent(newPath: string): void {\n const segments = newPath.split(this.separator).filter(p => p.length > 0);\n const label = segments.at(-1) ?? ``;\n const parentPath = segments.slice(0, -1).join(this.separator);\n this.dispatchEvent(new CustomEvent<CrumbNavChangeDetail>(`change`, {\n detail: { label, parentPath, fullPath: newPath },\n bubbles: true,\n composed: true,\n }));\n }\n\n #onAcKeyDown(e: KeyboardEvent) {\n if (e.key === `Escape`) {\n this._editingCancelled = true;\n this._editing = false;\n this._editStartIndex = null;\n }\n }\n\n #onHostKeyDown = (e: KeyboardEvent): void => {\n if (this._editing)\n return;\n const nonEditKeys = [`ArrowUp`, `ArrowDown`, `ArrowLeft`, `ArrowRight`, `Enter`];\n if (!nonEditKeys.includes(e.key)) {\n this._editing = true;\n }\n };\n\n protected override render() {\n const segments = this.#getSegments();\n\n if (this._editing) {\n const editValue = this.path;\n return html`\n <ixfx-ac-text\n .value=${editValue}\n .tabSuffix=${this.separator}\n .completionProvider=${this.#makeCompletionProvider()}\n @change=${this.#onAcChange}\n @focusout=${this.#onAcFocusOut}\n @keydown=${this.#onAcKeyDown}\n ></ixfx-ac-text>\n `;\n }\n\n const rootSegments = this.#getRootSegments();\n const leadingCaret = this.siblingLookup && rootSegments.length === 0\n ? html`\n <div class=\"caret ${this._openIdx === -1 ? `open` : ``} ${this._confirmedLeafIndices.has(``) ? `disabled` : ``}\"\n style=\"anchor-name: ${this.#anchorName(``)}\"\n data-cumulative=\"\"\n @click=${(e: MouseEvent) => this.#onCaretClick(-1, e)}>\n ${this.separator}\n </div>`\n : nothing;\n\n return html`\n <div class=\"crumbs\" tabindex=\"0\" @keydown=${this.#onHostKeyDown}>\n ${rootSegments.length > 0\n ? rootSegments.map((label, i) => this.#renderRootSegment(label, i))\n : nothing}\n ${leadingCaret}\n ${segments.map((label, i) =>\n this.#renderSegment(label, i, i === segments.length - 1),\n )}\n <div class=\"trailing\" @click=${this.#onTrailingClick}></div>\n </div>\n ${this._openIdx !== null\n ? html`\n <div class=\"crumb-dropdown popup-surface\" popover=\"auto\" tabindex=\"-1\"\n @toggle=${this.#onPopoverToggle}\n @keydown=${this.#onDropdownKeyDown}\n @click=${(e: Event) => e.stopPropagation()}>\n ${this.#renderDropdownContent(this._openIdx)}\n </div>\n `\n : nothing}\n `;\n }\n\n static override styles = [prominenceStyles, themeFallbacks, popupSurfaceStyles, css`\n :host {\n --text-highlight: var(--accent);\n --separator: var(--surface-muted-text);\n --padding-s: var(--space-xs);\n --padding-m: var(--space-s);\n --hover-bg: var(--surface-5);\n --hover-fg: var(--surface-5-text);\n\n display: flex;\n width: 100%;\n gap: var(--padding-s);\n position: relative;\n }\n\n ixfx-ac-text {\n flex: 1;\n font-size: inherit;\n --ac-input-padding: var(--padding-s) var(--padding-m);\n --ac-input-background: var(--surface-4);\n --ac-input-border-radius: var(--radius-s, 3px);\n --ac-popup-font-size: var(--text-s, 11px);\n }\n\n .crumbs {\n display: flex;\n width: 100%;\n overflow-x:scroll;\n scroll-snap-type:x proximity;\n scrollbar-width: none;\n }\n\n .trailing {\n flex: 1;\n min-width: 1em;\n cursor: text;\n }\n\n .seg {\n scroll-snap-align:start;\n\n position: relative;\n cursor: pointer;\n display: flex;\n flex-wrap: nowrap;\n align-items: center;\n user-select: none;\n pointer-events: auto;\n }\n\n .seg:hover {\n overflow: unset;\n }\n\n .seg-root {\n opacity: var(--prominence-idle-opacity);\n }\n\n .seg-root:hover {\n opacity: var(--prominence-tickled-opacity);\n }\n\n .seg-root label {\n font-weight: normal;\n }\n\n label {\n display: flex;\n align-items: center;\n white-space: nowrap;\n text-overflow: ellipsis;\n align-content: center;\n overflow: hidden;\n padding: 0 var(--padding-m);\n transition: all 0.2s ease-in-out;\n border-radius: var(--radius-m);\n }\n\n label:hover,.caret:hover {\n color: var(--item-text-tickled);\n background: var(--item-bg-tickled);\n }\n\n .caret {\n scroll-snap-align:start;\n\n position: relative;\n padding: var(--padding-m);\n transition: all 0.2s ease-in-out;\n\n border-radius: var(--radius-m);\n }\n\n\n .caret.open {\n background: color-mix(in srgb, var(--hover-bg) 40%, transparent);\n }\n\n .caret.disabled {\n opacity: var(--prominence-disabled-opacity);\n cursor: not-allowed;\n }\n\n .crumb-icon {\n width: 1em;\n height: 1em;\n flex-shrink: 0;\n }\n\n .crumb-dropdown {\n /* Reset popover UA defaults */\n inset: unset;\n margin: 0;\n\n /* Anchor positioning — position-anchor set dynamically via JS */\n position: fixed;\n position-area: block-end span-inline-end;\n position-try-fallbacks: flip-block, flip-inline, flip-block flip-inline;\n margin-block-start: 2px;\n\n min-width: 10ch;\n max-width: min(40ch, 80vw);\n max-height: 280px;\n overflow-y: auto;\n padding: var(--padding-s);\n outline: none;\n }\n\n .crumb-option {\n display: flex;\n align-items: center;\n gap: var(--padding-s);\n padding: var(--padding-s) var(--padding-m);\n cursor: pointer;\n border-radius: var(--radius-s, 4px);\n transition: background 0.15s ease-out;\n overflow: hidden;\n }\n\n .crumb-option:hover,\n .crumb-option.active {\n background: var(--hover-bg);\n color: var(--hover-fg);\n }\n\n .option-label {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n .crumb-option-label {\n font-style: italic;\n opacity: 0.6;\n pointer-events: none;\n user-select: none;\n }\n\n .loading-spinner {\n display: inline-block;\n width: 12px;\n height: 12px;\n border: 2px solid var(--surface-5);\n border-top-color: var(--accent);\n border-radius: 50%;\n animation: crumb-spin 0.7s linear infinite;\n }\n\n @keyframes crumb-spin {\n to { transform: rotate(360deg); }\n }\n `];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-crumb-path': CrumbPathElement;\n }\n}\n\nexport interface CrumbPathElementEventMap {\n navigate: CrumbNavNavigateEvent;\n change: CrumbNavChangeEvent;\n expand: CrumbNavExpandEvent;\n}\n\nexport interface CrumbPathElement {\n addEventListener: (<K extends keyof CrumbPathElementEventMap>(\n type: K,\n listener: (this: CrumbPathElement, event: CrumbPathElementEventMap[K]) => void,\n options?: boolean | AddEventListenerOptions,\n ) => void) & ((\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ) => void);\n}\n","/**\n * <ixfx-editable-number> — inline editable number label with Ableton-style drag.\n *\n * Extends <ixfx-editable-label> with:\n * • Pointer drag to adjust value — drag up to increase, down to decrease,\n * without entering full text-edit mode.\n * • Click gives focus; pressing any key while focused enters text-edit mode.\n * • Optional min/max clamping and step snapping.\n * • Optional fill-bar visualization behind the label text.\n *\n * Attributes:\n * min Minimum value (no clamping if unset)\n * max Maximum value (no clamping if unset)\n * step Snap increment, also informs decimal-place display (unset = no snapping)\n * stops Number of quantised keyboard stops (unset = no snapping). Wins over `step` when > 1.\n * drag-sensitivity Steps changed per pixel of drag (default: 1); multiply by step to get units/px\n * precision Decimal places applied when rounding drag-produced values (default: 0 = integers).\n * Has no effect when step is set (step implies its own precision).\n * Typed values are never precision-rounded — the user can always enter finer values.\n * fill-style 'linear' (default) or 'circular' — shape of the fill visualization\n * linear-style 'range' (default), 'bipolar', or 'unipolar' — how value maps to fill (linear mode only)\n * circular-style 'grow' (default), 'offset', or 'dot' — how value maps to fill (circular mode only)\n * no-drag Boolean — disables drag interaction; text editing still works\n * lighttouch Boolean — wheel adjusts the value on hover instead of requiring focus.\n * Wheel is suppressed while the user is typing (`_editing === true`).\n *\n * CSS variables:\n * --fill-color Fill bar color (default: var(--accent))\n * --fill-opacity Fill bar opacity as 0..1 (default: 0.25)\n * --value Current normalized value (0..1)\n *\n * All CSS variables from <ixfx-editable-label> are also inherited.\n *\n * Events:\n * change — CustomEvent<{ value: string }>, bubbles + composed\n * Fired on text-edit commit AND on drag-end (if value changed).\n */\nimport type { CSSResult } from 'lit';\nimport type { WheelDirection } from '../mixins/wheel-nudge.js';\nimport type { EditableLabelChangeDetail } from './editable-label.js';\nimport { css, html } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { resolveAxisStep } from '../keyboard.js';\nimport { WheelNudgeMixin } from '../mixins/wheel-nudge.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { prominenceStyles } from '../styles/prominence.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport { EditableLabel } from './editable-label.js';\n\nconst DRAG_THRESHOLD_PX = 3;\n\n@customElement(`ixfx-editable-number`)\nexport class EditableNumber extends WheelNudgeMixin(EditableLabel) {\n @property({ type: Number }) min?: number;\n @property({ type: Number }) max?: number;\n @property({ type: Number }) step?: number;\n /** Quantised stops for keyboard nudging. Overrides `step` when > 1. */\n @property({ type: Number }) stops?: number;\n @property({ type: Number, attribute: `drag-sensitivity` }) dragSensitivity = 1;\n @property({ attribute: `fill-style` }) fillStyle?: `linear` | `circular`;\n @property({ attribute: `linear-style` }) linearStyle?: `range` | `bipolar` | `unipolar`;\n @property({ attribute: `circular-style` }) circularStyle?: `grow` | `offset` | `dot`;\n @property({ type: Boolean, attribute: `no-drag` }) noDrag = false;\n @property({ type: Number }) precision = 0;\n\n // ── Drag state (not reactive — managed imperatively to avoid Lit cycles) ──\n #dragStartY = 0;\n #dragStartValue = 0;\n #dragging = false;\n #hasDragged = false;\n #dragCurrentValue = 0;\n #lastInputValue = ``;\n #firstUpdateComplete = false;\n\n constructor() {\n super();\n // Override parent defaults for a number input context\n this.mode = `editor`;\n this.entryMode = `number`;\n this.value = `0`;\n }\n\n // ── Render ───────────────────────────────────────────────────────────────────\n\n override render() {\n return html`\n ${this.fillStyle ? html`<div class=\"track\"></div>` : ``}\n ${this.fillStyle ? html`<div class=\"value\"><div class=\"bar\"></div></div>` : ``}\n <div\n class=\"number\"\n part=\"content\"\n tabindex=\"${this.disabled ? -1 : 0}\"\n contenteditable=\"${this._editing ? `plaintext-only` : `false`}\"\n data-placeholder=\"${this.placeholder}\"\n @click=${this._handleClick}\n @focus=${this._handleFocus}\n @blur=${this._handleBlur}\n @keydown=${this._handleKeydown}\n @beforeinput=${this._handleBeforeInput}\n @input=${this._stopNativeInput}\n ></div>\n `;\n }\n\n private _stopNativeInput = (e: Event): void => {\n e.stopPropagation();\n };\n\n // ── Lifecycle ─────────────────────────────────────────────────────────────\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener(`pointerdown`, this._onPointerDown);\n this.addEventListener(`pointermove`, this._onPointerMove);\n this.addEventListener(`pointerup`, this._onPointerUp);\n this.addEventListener(`keydown`, this._onKeyDown);\n this.addEventListener(`click`, this._interceptClick, { capture: true });\n this.addEventListener(`mouseenter`, this._handleMouseEnter);\n this.addEventListener(`mouseleave`, this._handleMouseLeave);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener(`pointerdown`, this._onPointerDown);\n this.removeEventListener(`pointermove`, this._onPointerMove);\n this.removeEventListener(`pointerup`, this._onPointerUp);\n this.removeEventListener(`keydown`, this._onKeyDown);\n this.removeEventListener(`click`, this._interceptClick);\n this.removeEventListener(`mouseenter`, this._handleMouseEnter);\n this.removeEventListener(`mouseleave`, this._handleMouseLeave);\n }\n\n private _handleMouseEnter = (): void => {\n if (this.displayTextLogic !== `transient` || this._editing)\n return;\n this._hovering = true;\n this._clearTransientTimer();\n this._transientTimer = window.setTimeout(() => {\n this._transientShowingValue = true;\n this._requestDisplayUpdate();\n }, this.appearDelay);\n };\n\n private _handleMouseLeave = (): void => {\n if (this.displayTextLogic !== `transient` || this._editing)\n return;\n this._hovering = false;\n this._clearTransientTimer();\n if (this._transientShowingValue) {\n this._transientTimer = window.setTimeout(() => {\n if (!this._hovering) {\n this._transientShowingValue = false;\n this._requestDisplayUpdate();\n }\n }, this.disappearDelay);\n }\n };\n\n // ── Override parent interaction — focus only, edit via keypress ───────────\n\n /** Click just focuses; edit mode is entered by pressing a key while focused. */\n protected _handleClick = (): void => {\n if (this.disabled)\n return;\n this.renderRoot?.querySelector<HTMLElement>(`.number`)?.focus();\n };\n\n /** Suppress auto-edit-on-focus from editor mode; keydown handles it instead. */\n protected override _handleFocus = (): void => { /* intentional no-op */ };\n\n /** Override to use .number instead of .content for text display */\n protected get _contentEl(): HTMLElement | undefined {\n const el = this.renderRoot?.querySelector<HTMLElement>(`.number`);\n return el ?? undefined;\n }\n\n override firstUpdated(changedProperties: Map<string, unknown>): void {\n super.firstUpdated(changedProperties);\n // For 'show' mode, start by showing displayText at rest\n if (this.displayTextLogic === `show`) {\n this._showModeWaitingToHide = true;\n }\n this._updateValueCss(this._normalizedValue());\n this._requestDisplayUpdate();\n }\n\n protected _onUserInteraction(): void {\n if (this.displayTextLogic === `show` && !this._editing) {\n this._clearTransientTimer();\n this._showModeWaitingToHide = false;\n this._requestDisplayUpdate();\n this._transientTimer = window.setTimeout(() => {\n this._showModeWaitingToHide = true;\n this._requestDisplayUpdate();\n }, this.disappearDelay);\n return;\n }\n if (this.displayTextLogic === `transient` && !this._editing) {\n this._clearTransientTimer();\n this._transientShowingValue = true;\n this._requestDisplayUpdate();\n this._transientTimer = window.setTimeout(() => {\n if (!this._hovering) {\n this._transientShowingValue = false;\n this._requestDisplayUpdate();\n }\n }, this.disappearDelay);\n return;\n }\n super._onUserInteraction();\n }\n\n private _onValueChange(): void {\n if (this.displayTextLogic !== `show` || this._editing)\n return;\n\n this._clearTransientTimer();\n this._showModeWaitingToHide = false;\n this._requestDisplayUpdate();\n this._transientTimer = window.setTimeout(() => {\n this._showModeWaitingToHide = true;\n this._requestDisplayUpdate();\n }, this.disappearDelay);\n }\n\n override updated(changedProperties: Map<string, unknown>): void {\n super.updated(changedProperties);\n // Note: We do NOT call _onValueChange here for 'show' mode.\n // The parent class handles display updates via _requestDisplayUpdate\n // in firstUpdated. Additional value changes are handled via\n // drag/keyboard events that call _onValueChange directly.\n if (!this._editing) {\n this._updateValueCss(this._normalizedValue());\n }\n }\n\n private _updateValueCss(normalized: number): void {\n this.style.setProperty(`--value`, String(normalized));\n\n let valueStart = 0;\n let valueEnd = normalized;\n\n if (this.linearStyle === `bipolar`) {\n if (normalized <= 0.5) {\n valueStart = normalized;\n valueEnd = 0.5;\n } else {\n valueStart = 0.5;\n valueEnd = normalized;\n }\n } else if (this.linearStyle === `unipolar`) {\n valueStart = 0.5 - normalized * 0.5;\n valueEnd = 0.5 + normalized * 0.5;\n }\n\n this.style.setProperty(`--value-start`, String(valueStart));\n this.style.setProperty(`--value-end`, String(valueEnd));\n\n // For circular offset mode, compute pixel offset from center\n // and set component dimensions for radius calculation\n if (this.fillStyle === `circular` && this.circularStyle === `offset`) {\n const h = this.offsetHeight;\n const w = this.offsetWidth;\n const r = h / 2 - 2; // radius with margin to prevent clipping at top/bottom\n // Circle edges must stay 2px inside component edges:\n // - at value=0: circle left edge at 2px\n // - at value=1: circle right edge at w-2px\n const leftEdge = 2;\n const rightEdge = w - 2;\n const valueCenterPx = leftEdge + r + normalized * (rightEdge - leftEdge - 2 * r);\n this.style.setProperty(`--radius`, `${r}px`);\n this.style.setProperty(`--value-center-px`, `${valueCenterPx}px`);\n this.style.setProperty(`--component-width-px`, `${w}px`);\n this.style.setProperty(`--component-height-px`, `${h}px`);\n }\n }\n\n protected override _getDisplayText(): string {\n // In override mode, always show displayText (even when dragging or editing)\n if (this._shouldUseDisplayText()) {\n return this.displayText ?? ``;\n }\n // For transient mode, show the drag value while dragging\n if (this.#dragging) {\n const formatted = this.step !== undefined\n ? this._formatNumber(this.#dragCurrentValue)\n : this.#dragCurrentValue.toFixed(this.precision);\n return this.formatter ? this.formatter(formatted) : formatted;\n }\n // Normal case: when a custom formatter is set, pass raw value so formatter\n // can apply its own precision logic (e.g. \"0.5\" → \"50%\" without precision loss)\n if (this.formatter) {\n const raw = Number.parseFloat(this.value);\n return this.formatter(Number.isNaN(raw) ? this.value : String(raw));\n }\n return this._formatDisplay();\n }\n\n // ── Clamp before parent commits (overrides parent's private _tryCommit) ──\n\n protected override _tryCommit(): void {\n const el = this.renderRoot?.querySelector<HTMLElement>(`.number`);\n if (el) {\n const n = Number.parseFloat(el.textContent?.trim() ?? ``);\n if (!Number.isNaN(n)) {\n el.textContent = this._formatNumber(this._clamp(this._snap(n)));\n }\n }\n super._tryCommit();\n }\n\n // ── Override parent's input handling — fire 'input' events on each keypress ──\n\n protected override _handleBeforeInput = (e: InputEvent): void => {\n if (e.inputType !== `insertText` || !e.data) {\n return;\n }\n\n if (!this._isAllowedInput(e.data)) {\n e.preventDefault();\n return;\n }\n\n const contentEl = this._contentEl;\n if (!contentEl) {\n return;\n }\n\n const currentContent = contentEl.textContent ?? ``;\n const insertPosition = (contentEl as HTMLInputElement).selectionStart ?? currentContent.length;\n const newValue = currentContent.slice(0, insertPosition) + e.data + currentContent.slice(insertPosition);\n\n if (newValue !== this.#lastInputValue) {\n this.#lastInputValue = newValue;\n this.dispatchEvent(new CustomEvent(`input`, {\n detail: { value: newValue },\n bubbles: true,\n composed: true,\n }));\n }\n };\n\n protected override _handleKeydown = (e: KeyboardEvent): void => {\n if (!this._editing) {\n return;\n }\n\n if (e.key === `Enter`) {\n e.preventDefault();\n this._tryCommit();\n if (this.mode === `editor`)\n this._contentEl?.blur();\n } else if (e.key === `Escape`) {\n e.preventDefault();\n this.dispatchEvent(new CustomEvent(`cancelled`, {\n detail: { value: this._prevValue },\n bubbles: true,\n composed: true,\n }));\n this._cancelEdit();\n this.dispatchEvent(new CustomEvent(`change`, {\n detail: { value: this._prevValue },\n bubbles: true,\n composed: true,\n }));\n if (this.mode === `editor`)\n this._contentEl?.blur();\n }\n };\n\n // ── Drag event handlers ───────────────────────────────────────────────────\n\n private _onKeyDown = (e: KeyboardEvent): void => {\n if (this._editing || this.disabled)\n return;\n\n if (this._handleArrowKey(e)) {\n return;\n }\n\n // Printable characters while focused → enter edit mode.\n // Enter is intentionally excluded: the parent handles Enter for commit,\n // and including it here would re-enter edit mode immediately after commit.\n if (e.key.length === 1) {\n this._onUserInteraction();\n this._beginEdit();\n }\n };\n\n private _handleArrowKey(e: KeyboardEvent): boolean {\n const range = (this.max ?? 100) - (this.min ?? 0);\n if (range === 0)\n return false;\n\n const effectiveStep = resolveAxisStep(range, this.stops, this.step, e.shiftKey);\n\n let delta = 0;\n let handled = false;\n\n switch (e.key) {\n case `ArrowUp`:\n case `ArrowRight`:\n delta = effectiveStep;\n handled = true;\n break;\n case `ArrowDown`:\n case `ArrowLeft`:\n delta = -effectiveStep;\n handled = true;\n break;\n case `Home`:\n delta = -(this._parseValue() - (this.min ?? 0));\n handled = true;\n break;\n case `End`:\n delta = (this.max ?? 0) - this._parseValue();\n handled = true;\n break;\n }\n\n if (handled) {\n e.preventDefault();\n this._applyDelta(delta);\n return true;\n }\n\n return false;\n }\n\n /**\n * Apply a signed delta to the current value, clamp/snap/format, and fire\n * `input`/`change`. Shared between arrow-key handler and the wheel handler.\n */\n private _applyDelta(delta: number): void {\n const prev = this.value;\n const current = this._parseValue();\n const newValue = this._clamp(this._snap(current + delta));\n\n const newValueStr = this.step !== undefined\n ? this._formatNumber(newValue)\n : newValue.toFixed(this.precision);\n\n this.value = newValueStr;\n\n this._requestDisplayUpdate();\n this._updateValueCss(this._normalizedValue(newValue));\n\n if (newValueStr !== prev) {\n this.dispatchEvent(new CustomEvent(`input`, {\n detail: { value: newValueStr },\n bubbles: true,\n composed: true,\n }));\n }\n\n requestAnimationFrame(() => {\n if (this.value !== prev) {\n this.dispatchEvent(new CustomEvent<EditableLabelChangeDetail>(`change`, {\n detail: { value: this.value },\n bubbles: true,\n composed: true,\n }));\n }\n });\n }\n\n // Wheel handler — installed by WheelNudgeMixin on the host. Skipped during\n // text edit so wheel-scrolling the value doesn't fight with the user's typing.\n override _shouldHandleWheel(): boolean {\n if (this._editing)\n return false;\n return super._shouldHandleWheel();\n }\n\n override _applyWheelDelta(direction: WheelDirection, event: WheelEvent): void {\n const range = (this.max ?? 100) - (this.min ?? 0);\n if (range === 0)\n return;\n const effectiveStep = resolveAxisStep(range, this.stops, this.step, event.shiftKey);\n this._applyDelta(direction * effectiveStep);\n }\n\n private _onPointerDown = (e: PointerEvent): void => {\n if (e.button !== 0)\n return; // left button only\n if (this._editing)\n return; // let contenteditable handle it\n if (this.disabled || this.noDrag)\n return;\n e.preventDefault(); // suppress browser text-select / native drag\n this.renderRoot?.querySelector<HTMLElement>(`.number`)?.focus(); // restore focus manually\n\n this.#dragStartY = e.clientY;\n this.#dragStartValue = this._parseValue();\n this.#dragCurrentValue = this.#dragStartValue;\n this.#dragging = false;\n this.#hasDragged = false;\n this.setPointerCapture(e.pointerId);\n };\n\n private _onPointerMove = (e: PointerEvent): void => {\n if (!(e.buttons & 1))\n return; // left button must be held\n if (this._editing)\n return;\n if (this.disabled || this.noDrag)\n return;\n\n const deltaY = this.#dragStartY - e.clientY; // up = positive\n if (!this.#dragging && Math.abs(deltaY) < DRAG_THRESHOLD_PX)\n return;\n\n this.#dragging = true;\n this.#hasDragged = true;\n this.toggleAttribute(`dragging`, true);\n this._onUserInteraction();\n\n const raw = this.#dragStartValue + deltaY * this.dragSensitivity * (this.step || 1);\n const snapped = this._clamp(this._snap(raw));\n // When step is set, snapping already gives the right precision.\n // When step is unset, round to `precision` decimal places.\n this.#dragCurrentValue = this.step !== undefined\n ? snapped\n : Number.parseFloat(snapped.toFixed(this.precision));\n\n const dragValueStr = this.step !== undefined\n ? this._formatNumber(this.#dragCurrentValue)\n : this.#dragCurrentValue.toFixed(this.precision);\n\n if (dragValueStr !== this.#lastInputValue) {\n this.#lastInputValue = dragValueStr;\n this.dispatchEvent(new CustomEvent(`input`, {\n detail: { value: dragValueStr },\n bubbles: true,\n composed: true,\n }));\n }\n\n // Update display using parent's displayTextLogic handling\n this._requestDisplayUpdate();\n this._updateValueCss(this._normalizedValue(this.#dragCurrentValue));\n };\n\n private _onPointerUp = (e: PointerEvent): void => {\n if (this.hasPointerCapture(e.pointerId))\n this.releasePointerCapture(e.pointerId);\n if (!this.#dragging)\n return;\n if (this.disabled || this.noDrag)\n return;\n\n this.#dragging = false;\n this.toggleAttribute(`dragging`, false);\n // Format with step-based or precision-based dp so trailing zeros are preserved\n // in the stored string (e.g. \"5.0\" when precision=1, not \"5\").\n const finalStr = this.step !== undefined\n ? this._formatNumber(this.#dragCurrentValue)\n : this.#dragCurrentValue.toFixed(this.precision);\n const prev = this.value;\n this.value = finalStr;\n if (finalStr !== prev) {\n this.dispatchEvent(new CustomEvent<EditableLabelChangeDetail>(`change`, {\n detail: { value: finalStr },\n bubbles: true,\n composed: true,\n }));\n }\n };\n\n private _interceptClick = (e: MouseEvent): void => {\n if (this.#hasDragged) {\n e.stopImmediatePropagation();\n this.#hasDragged = false;\n }\n };\n\n // ── Number helpers ────────────────────────────────────────────────────────\n\n private _parseValue(): number {\n return Number.parseFloat(this.value) || 0;\n }\n\n /**\n * Formats the stored value for display, inferring decimal places from the value\n * string itself. This preserves typed precision (e.g. \"0.1234\" stays \"0.1234\")\n * and also respects trailing zeros written by drag storage (e.g. \"5.0\" stays \"5.0\").\n */\n private _formatDisplay(): string {\n const n = Number.parseFloat(this.value);\n if (Number.isNaN(n))\n return this.value;\n if (this.precision !== undefined) {\n return n.toFixed(this.precision);\n }\n const dot = this.value.indexOf(`.`);\n const dp = dot >= 0 ? this.value.length - dot - 1 : 0;\n return n.toFixed(dp);\n }\n\n private _clamp(n: number): number {\n if (this.min !== undefined)\n n = Math.max(this.min, n);\n if (this.max !== undefined)\n n = Math.min(this.max, n);\n return n;\n }\n\n private _snap(n: number): number {\n if (this.stops && this.stops > 1) {\n const min = this.min ?? 0;\n const range = (this.max ?? 100) - min;\n const stopStep = range / this.stops;\n return Math.round((n - min) / stopStep) * stopStep + min;\n }\n if (!this.step)\n return n;\n return Math.round(n / this.step) * this.step;\n }\n\n private _inferDecimals(n?: number): number {\n if (this.step !== undefined) {\n const s = String(this.step);\n const dot = s.indexOf(`.`);\n return dot >= 0 ? s.length - dot - 1 : 0;\n }\n // No step set: infer from the value being formatted so floats are preserved\n const s = String(n ?? this._parseValue());\n const dot = s.indexOf(`.`);\n return dot >= 0 ? s.length - dot - 1 : 0;\n }\n\n private _formatNumber(n: number): string {\n return n.toFixed(this._inferDecimals(n));\n }\n\n /** Returns a 0..1 fraction for the given value within [min, max]. */\n private _normalizedValue(n = this._parseValue()): number {\n if (this.min === undefined || this.max === undefined)\n return 0;\n if (this.max === this.min)\n return 0;\n return Math.max(0, Math.min(1, (n - this.min) / (this.max - this.min)));\n }\n\n // ── Styles ───────────────────────────────────────────────────────────────\n\n static override styles: CSSResult[] = [\n themeFallbacks,\n prominenceStyles,\n ...EditableLabel.styles,\n css`\n :host {\n font-size: var(--text-s,11px);\n --value: 0;\n --value-start: 0;\n --value-end: 0;\n --_fill-color-alpha: color-mix(\n in oklch,\n var(--fill-color, var(--accent, oklch(60% 0.15 140))) calc(var(--fill-opacity, 0.25) * 100%),\n transparent\n );\n }\n\n /* ── Layout (when fill-style is enabled) ── */\n :host([fill-style]) {\n display: grid;\n position: relative;\n grid-template-columns: 1fr;\n grid-template-rows: 1fr;\n min-height: 1.5em;\n min-width: 5em;\n }\n\n :host([fill-style]) .track,\n :host([fill-style]) .value {\n grid-area: 1 / 1;\n position: absolute;\n inset: 0;\n }\n\n /* Track background styling */\n :host([fill-style]) .track {\n z-index: 0;\n background: var(--surface-4, oklch(22% 0.02 240));\n border: var(--border, 1px solid oklch(25% 0.02 240));\n }\n\n :host([fill-style]) .value {\n z-index: 1;\n }\n\n :host([fill-style=\"linear\"]) .track {\n border-radius: var(--radius-s, 3px);\n }\n\n :host([fill-style=\"circular\"]) .track {\n border-radius: 50%;\n overflow: hidden;\n }\n\n /* Linear: all linear-styles use .bar positioned via --value-start and --value-end */\n :host([fill-style=\"linear\"]) .value {\n overflow: hidden;\n }\n\n :host([fill-style=\"linear\"]) .bar {\n position: absolute;\n top: 0;\n bottom: 0;\n left: calc(var(--value-start, 0) * 100%);\n width: calc((var(--value-end, 0) - var(--value-start, 0)) * 100%);\n background: var(--fill-image, var(--_fill-color-alpha));\n }\n\n /* Circular grow: filled circle growing from center */\n :host([fill-style=\"circular\"][circular-style=\"grow\"]) .value,\n :host([fill-style=\"circular\"]:not([circular-style])) .value {\n background: var(--fill-image, var(--_fill-color-alpha));\n clip-path: circle(calc(var(--value) * 50%) at 50% 50%);\n }\n\n /* Circular offset: value circle slides left/right from center.\n Track circle is centered, filling the height.\n Value circle is same size, offset by --value-offset-px.\n At value=0.5: value circle centered on track (invisible when overlaid)\n At value=0: value circle at far left\n At value=1: value circle at far right\n */\n :host([fill-style=\"circular\"][circular-style=\"offset\"]) {\n min-width: 80px;\n min-height: 26px;\n overflow: hidden;\n }\n\n :host([fill-style=\"circular\"][circular-style=\"offset\"]) .track {\n position: absolute;\n top: 50%;\n border-radius: 50%;\n background: var(--surface-4, oklch(22% 0.02 240));\n border: var(--border, 1px solid oklch(25% 0.02 240));\n width: calc(var(--radius, 11px) * 2);\n height: calc(var(--radius, 11px) * 2);\n left: 50%;\n transform: translate(-50%, -50%);\n }\n\n :host([fill-style=\"circular\"][circular-style=\"offset\"]) .value {\n position: absolute;\n top: 50%;\n background: var(--fill-image, var(--_fill-color-alpha));\n border-radius: 50%;\n width: calc(var(--radius, 11px) * 2);\n height: calc(var(--radius, 11px) * 2);\n transform: translate(calc(var(--value-center-px, 13px) - var(--radius, 11px)), -50%);\n }\n\n :host([fill-style=\"circular\"][circular-style=\"offset\"]) .number {\n border-radius: 0;\n }\n\n /* Circular dot: full circle */\n :host([fill-style=\"circular\"][circular-style=\"dot\"]) .value {\n background: var(--fill-image, var(--_fill-color-alpha));\n }\n\n /* ── Number (top layer - text display) ── */\n :host([fill-style]) .number {\n position: absolute;\n inset: 0;\n z-index: 2;\n display: flex;\n align-items: center;\n justify-content: center;\n font-family: inherit;\n font-size: inherit;\n color: inherit;\n padding: var(--space-xs, 3px) var(--space-s, 4px);\n }\n\n :host([fill-style=\"circular\"]) .number {\n border-radius: 50%;\n }\n\n /* Drag cursor + no text selection while not in text-edit mode */\n :host(:not([disabled]):not([no-drag])) .number:not([contenteditable=\"plaintext-only\"]) {\n cursor: ns-resize;\n user-select: none;\n -webkit-user-select: none;\n touch-action: none;\n }\n\n /* Focus outline */\n :host .number {\n outline: none;\n }\n\n :host .number:focus-visible {\n outline: 2px solid var(--accent);\n outline-offset: 2px;\n }\n\n /* ── Circular host sizing ── */\n :host([fill-style=\"circular\"][circular-style=\"grow\"]),\n :host([fill-style=\"circular\"]:not([circular-style])) {\n aspect-ratio: 1;\n }\n `,\n ];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-editable-number': EditableNumber;\n }\n}\n","/* eslint-disable ts/no-unsafe-declaration-merging */\nimport type { CommandId } from '@clinth/ui-commands';\nimport type { PropertyValues } from 'lit';\nimport type { IDataProvider } from '../common/data-provider.js';\nimport type {\n GroupedItemListerElementEventMap,\n GroupedSelectDetail,\n IGroupedSubComponent,\n SubComponentFactory,\n} from './types.js';\nimport { html, LitElement, nothing } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { repeat } from 'lit/directives/repeat.js';\nimport { DataController } from '../common/data-controller.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport '../panel/panel.js';\n\nexport type {\n GroupedItemListerElementEventMap,\n GroupedSelectDetail,\n GroupedSelectEvent,\n IGroupedSubComponent,\n IGroupedSubComponentEventMap,\n SubComponentActivateDetail,\n SubComponentActivateEvent,\n SubComponentFactory,\n SubComponentItemClickDetail,\n SubComponentItemClickEvent,\n SubComponentSelectDetail,\n SubComponentSelectEvent,\n SubComponentTickleDetail,\n SubComponentTickleEvent,\n} from './types.js';\n\nconst UNGROUPED_KEY = `__ungrouped__`;\n\n@customElement(`ixfx-grouped-item-lister`)\nexport class GroupedItemListerElement<T = unknown> extends LitElement {\n @property({ type: Boolean, reflect: true }) grouped = false;\n\n @property({ type: Boolean, attribute: `cross-group-selection`, reflect: true })\n crossGroupSelection = false;\n\n #groupBy: ((item: T) => string) | undefined;\n #factory: SubComponentFactory<T> | undefined;\n #subComponents = new Map<string, HTMLElement & IGroupedSubComponent<T>>();\n // Computed in render() and reused in updated() to avoid a second groupBy pass\n #renderedGroups: Map<string, T[]> | undefined;\n // Guard against re-entrant select events when we call clearSelection() on siblings\n #clearingSelection = false;\n\n readonly #data = new DataController<void, T>(this);\n\n // ---------------------------------------------------------------------------\n // JS-only properties (not HTML attributes — carry function/type information)\n // ---------------------------------------------------------------------------\n\n get groupBy(): ((item: T) => string) | undefined {\n return this.#groupBy;\n }\n\n set groupBy(value: ((item: T) => string) | undefined) {\n this.#groupBy = value;\n this.requestUpdate();\n }\n\n get factory(): SubComponentFactory<T> | undefined {\n return this.#factory;\n }\n\n set factory(value: SubComponentFactory<T> | undefined) {\n if (value === this.#factory)\n return;\n this.#clearSubComponents();\n this.#factory = value;\n this.requestUpdate();\n }\n\n get provider(): IDataProvider<void, T> | undefined {\n return this.#data.provider;\n }\n\n set provider(value: IDataProvider<void, T> | undefined) {\n this.#data.provider = value;\n if (value)\n this.#data.request(undefined);\n }\n\n // ---------------------------------------------------------------------------\n // Public API\n // ---------------------------------------------------------------------------\n\n /** The union of all selected items across every sub-component. */\n get selectedItems(): ReadonlySet<T> {\n const all = new Set<T>();\n for (const subEl of this.#subComponents.values()) {\n for (const item of subEl.selectedItems) {\n all.add(item);\n }\n }\n return all;\n }\n\n /**\n * Forward a command to all live sub-components.\n * Use this to propagate changes like sort order, filter state, or view mode.\n */\n dispatch(commandId: CommandId, args?: Record<string, unknown>): void {\n for (const subEl of this.#subComponents.values()) {\n subEl.dispatch(commandId, args);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Lit lifecycle\n // ---------------------------------------------------------------------------\n\n protected override createRenderRoot() {\n return this;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener(`select`, this.#onSelect as EventListener);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener(`select`, this.#onSelect as EventListener);\n }\n\n protected override updated(changed: PropertyValues): void {\n super.updated(changed);\n if (changed.has(`grouped`)) {\n this.#clearSubComponents();\n }\n this.#syncSubComponents();\n }\n\n protected override render() {\n if (!this.#factory)\n return nothing;\n\n if (!this.grouped) {\n return html`<div class=\"ungrouped-host\"></div>`;\n }\n\n if (!this.#groupBy)\n return nothing;\n\n // Store computed groups so updated() can reuse them without a second pass\n this.#renderedGroups = this.#computeGroups();\n return html`${repeat(\n this.#renderedGroups.keys(),\n key => key,\n key => html`<ixfx-panel data-group-key=${key} .title=${key}></ixfx-panel>`,\n )}`;\n }\n\n // ---------------------------------------------------------------------------\n // Internal — DOM management\n // ---------------------------------------------------------------------------\n\n #computeGroups(): Map<string, T[]> {\n const groups = new Map<string, T[]>();\n if (!this.#groupBy)\n return groups;\n for (const item of this.#data.items) {\n const key = this.#groupBy(item);\n let bucket = groups.get(key);\n if (!bucket) {\n bucket = [];\n groups.set(key, bucket);\n }\n bucket.push(item);\n }\n return groups;\n }\n\n #clearSubComponents(): void {\n for (const subEl of this.#subComponents.values()) {\n subEl.remove();\n }\n this.#subComponents.clear();\n }\n\n #syncSubComponents(): void {\n if (!this.#factory)\n return;\n\n if (!this.grouped) {\n this.#syncUngrouped();\n return;\n }\n\n if (!this.#groupBy)\n return;\n this.#syncGrouped();\n }\n\n #syncUngrouped(): void {\n const host = this.querySelector<HTMLElement>(`.ungrouped-host`);\n if (!host)\n return;\n\n let subEl = this.#subComponents.get(UNGROUPED_KEY);\n if (!subEl) {\n subEl = this.#factory!(undefined);\n host.appendChild(subEl);\n this.#subComponents.set(UNGROUPED_KEY, subEl);\n }\n subEl.setItems(this.#data.items);\n }\n\n #syncGrouped(): void {\n const groups = this.#renderedGroups ?? this.#computeGroups();\n\n // Remove sub-components for groups that no longer exist\n for (const key of [...this.#subComponents.keys()]) {\n if (!groups.has(key)) {\n this.#subComponents.get(key)?.remove();\n this.#subComponents.delete(key);\n }\n }\n\n // Mount or update sub-components per group.\n // Panels are already in the DOM at this point (rendered by Lit's repeat above).\n for (const [key, items] of groups) {\n const panel = [...this.children].find(\n el => el instanceof HTMLElement && (el as HTMLElement).dataset.groupKey === key,\n ) as HTMLElement | undefined;\n if (!panel)\n continue;\n\n let subEl = this.#subComponents.get(key);\n if (!subEl) {\n subEl = this.#factory!(key);\n panel.appendChild(subEl);\n this.#subComponents.set(key, subEl);\n }\n subEl.setItems(items);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Internal — selection coordination\n // ---------------------------------------------------------------------------\n\n #onSelect = (event: Event): void => {\n if (this.#clearingSelection)\n return;\n\n // Identify which sub-component fired the event.\n // With composed:true events from shadow-DOM sub-components, event.target is\n // retargeted to the shadow host (the sub-component element itself).\n const sourceEl = event.target as HTMLElement;\n let sourceKey: string | undefined;\n for (const [key, subEl] of this.#subComponents) {\n if (subEl === sourceEl) {\n sourceKey = key;\n break;\n }\n }\n\n // Not from a known sub-component — ignore\n if (sourceKey === undefined)\n return;\n\n if (this.grouped && !this.crossGroupSelection) {\n this.#clearingSelection = true;\n for (const [key, subEl] of this.#subComponents) {\n if (key !== sourceKey)\n subEl.clearSelection();\n }\n this.#clearingSelection = false;\n }\n\n this.dispatchEvent(\n new CustomEvent<GroupedSelectDetail<T>>(`grouped-select`, {\n detail: {\n selected: this.selectedItems,\n groupKey: sourceKey === UNGROUPED_KEY ? undefined : sourceKey,\n },\n bubbles: true,\n composed: true,\n }),\n );\n };\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-grouped-item-lister': GroupedItemListerElement;\n }\n}\n\nexport interface GroupedItemListerElement<T> {\n addEventListener: (<K extends keyof GroupedItemListerElementEventMap<T>>(\n type: K,\n listener: (this: GroupedItemListerElement<T>, event: GroupedItemListerElementEventMap<T>[K]) => void,\n options?: boolean | AddEventListenerOptions,\n ) => void) & ((\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ) => void);\n}\n","import type { CommandId } from '@clinth/ui-commands';\nimport type { TreeExclusivity, TreeInteractionMode, TreeItem, TreeNode, TreeSelectionFilter } from '../common/types.js';\nimport type { TreeBaseElement } from '../tree/tree-base.js';\nimport type { ListSelectionMode } from '../vertical-list/types.js';\nimport type {\n IGroupedSubComponent,\n SubComponentActivateDetail,\n SubComponentItemClickDetail,\n SubComponentSelectDetail,\n SubComponentTickleDetail,\n} from './types.js';\nimport '../tree/tree-list.js';\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport type TreeListAdapterOptions<T> = {\n /**\n * Returns the direct children of an item to build the tree hierarchy.\n * Omit for flat item lists — all items become leaf nodes at the root level.\n */\n getChildren?: (item: T) => readonly T[];\n\n /** Forwarded to the inner ixfx-tree-list. Default: `'standard'`. */\n interactionMode?: TreeInteractionMode;\n\n /**\n * Controls which node types are selectable.\n * Forwarded to the inner ixfx-tree-list. Default: `'all'`.\n */\n selectionFilter?: TreeSelectionFilter;\n\n /**\n * Controls how expanding one node affects its siblings.\n * Forwarded to the inner ixfx-tree-list. Default: `'none'`.\n */\n exclusivity?: TreeExclusivity;\n\n /**\n * Called when a command is dispatched via `ixfx-grouped-item-lister.dispatch()`.\n * Receives the inner `TreeBaseElement` (undefined until the first `setItems()` call)\n * so the handler can sort, filter, or otherwise manipulate the tree directly.\n */\n onDispatch?: (\n commandId: CommandId,\n args: Record<string, unknown> | undefined,\n tree: TreeBaseElement | undefined,\n ) => void;\n};\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\n/**\n * Creates an `HTMLElement` that implements `IGroupedSubComponent<T>` by wrapping\n * an `ixfx-tree-list` internally.\n *\n * `toTreeItem` converts each item `T` to display metadata (`key`, `label`, etc).\n * The adapter stores the original `T` in `TreeItem.data` and uses it to map\n * tree-node selections back to typed values.\n *\n * Unlike `createVerticalListAdapter`, items can be hierarchical: provide\n * `options.getChildren` to return each item's children and the adapter will\n * recursively build the `TreeNode` tree. Omit it for a flat list of leaf nodes.\n *\n * The four interface events (`select`, `activate`, `item-click`, `tickle`) are\n * intercepted at the tree level, re-typed from `TreeNode` → `T`, and re-dispatched\n * on the adapter element so `ixfx-grouped-item-lister` can identify the source.\n *\n * @example Flat item list:\n * ```ts\n * lister.factory = () =>\n * createTreeListAdapter<FileItem>(item => ({ key: item.id, label: item.name, isLeaf: true }));\n * ```\n *\n * @example Hierarchical items:\n * ```ts\n * lister.factory = () =>\n * createTreeListAdapter<Category>(\n * cat => ({ key: cat.id, label: cat.name }),\n * { getChildren: cat => cat.subCategories },\n * );\n * ```\n */\nexport function createTreeListAdapter<T>(\n toTreeItem: (item: T) => Omit<TreeItem, `data`>,\n options?: TreeListAdapterOptions<T>,\n): HTMLElement & IGroupedSubComponent<T> {\n const container = document.createElement(`div`);\n container.style.cssText = `display:contents;`;\n\n let treeEl: TreeBaseElement | undefined;\n\n // ---- Tree building ----\n\n function buildNode(item: T): TreeNode {\n const treeItem: TreeItem = { ...toTreeItem(item), data: item };\n const children = options?.getChildren?.(item);\n return {\n item: treeItem,\n // If getChildren is provided, recurse. For known leaves (isLeaf:true or\n // no getChildren), use [] to signal \"confirmed leaf\" to the tree.\n children: children ? children.map(buildNode) : (treeItem.isLeaf ? [] : undefined),\n };\n }\n\n function getOrCreateTree(): TreeBaseElement {\n if (treeEl)\n return treeEl;\n\n treeEl = document.createElement(`ixfx-tree-list`) as TreeBaseElement;\n treeEl.interactionMode = options?.interactionMode ?? `standard`;\n treeEl.selectionFilter = options?.selectionFilter ?? `all`;\n treeEl.exclusivity = options?.exclusivity ?? `none`;\n treeEl.style.cssText = `display:block;width:100%;`;\n\n container.appendChild(treeEl);\n attachBridgeListeners();\n\n return treeEl;\n }\n\n // ---- Node → T mapping (via TreeItem.data) ----\n\n function mapNodes(nodes: ReadonlySet<TreeNode>): ReadonlySet<T> {\n const result = new Set<T>();\n for (const node of nodes) {\n if (node.item.data !== undefined)\n result.add(node.item.data as T);\n }\n return result;\n }\n\n // ---- Event bridge ----\n //\n // The tree fires the same event names as IGroupedSubComponent ('select',\n // 'activate', etc.). We must intercept them at the tree level and re-dispatch\n // on the container so grouped-item-lister can identify the correct source\n // element (the container, not the inner tree).\n\n function attachBridgeListeners(): void {\n treeEl!.addEventListener(`select`, (e) => {\n e.stopPropagation();\n const detail: SubComponentSelectDetail<T> = {\n selected: mapNodes(e.detail.selected),\n previous: mapNodes(e.detail.previous),\n };\n container.dispatchEvent(\n new CustomEvent(`select`, { detail, bubbles: true, composed: true }),\n );\n });\n\n treeEl!.addEventListener(`activate`, (e) => {\n e.stopPropagation();\n const item = (e.detail.node as TreeNode).item.data as T | undefined;\n if (item === undefined)\n return;\n const detail: SubComponentActivateDetail<T> = { item };\n container.dispatchEvent(\n new CustomEvent(`activate`, { detail, bubbles: true, composed: true }),\n );\n });\n\n treeEl!.addEventListener(`item-click`, (e) => {\n e.stopPropagation();\n const item = (e.detail.node as TreeNode).item.data as T | undefined;\n if (item === undefined)\n return;\n const detail: SubComponentItemClickDetail<T> = { item };\n container.dispatchEvent(\n new CustomEvent(`item-click`, { detail, bubbles: true, composed: true }),\n );\n });\n\n treeEl!.addEventListener(`tickle`, (e) => {\n e.stopPropagation();\n const item = (e.detail.node as TreeNode).item.data as T | undefined;\n if (item === undefined)\n return;\n const detail: SubComponentTickleDetail<T> = { item };\n container.dispatchEvent(\n new CustomEvent(`tickle`, { detail, bubbles: true, composed: true }),\n );\n });\n }\n\n // ---- IGroupedSubComponent implementation ----\n\n let selectionMode: ListSelectionMode = `single`;\n\n const adapter = Object.assign(container, {\n setItems(items: readonly T[]): void {\n const tree = getOrCreateTree();\n tree.root = {\n item: { key: `__adapter_root__`, label: ``, isLeaf: false },\n children: items.map(buildNode),\n };\n },\n\n clearSelection(): void {\n treeEl?.clearSelection();\n },\n\n dispatch(commandId: CommandId, args?: Record<string, unknown>): void {\n options?.onDispatch?.(commandId, args, treeEl);\n },\n });\n\n Object.defineProperties(adapter, {\n selectedItems: {\n get(): ReadonlySet<T> {\n return treeEl ? mapNodes(treeEl.selectedNodes) : new Set<T>();\n },\n enumerable: true,\n configurable: true,\n },\n selectionMode: {\n get(): ListSelectionMode {\n return selectionMode;\n },\n set(v: ListSelectionMode) {\n selectionMode = v;\n if (!treeEl)\n return;\n if (v === `none`) {\n treeEl.selectionFilter = `none`;\n } else if (v === `single`) {\n treeEl.selectionFilter = options?.selectionFilter ?? `all`;\n treeEl.interactionMode = `implicit`;\n } else {\n treeEl.selectionFilter = options?.selectionFilter ?? `all`;\n treeEl.interactionMode = options?.interactionMode ?? `standard`;\n }\n },\n enumerable: true,\n configurable: true,\n },\n });\n\n return adapter as unknown as HTMLElement & IGroupedSubComponent<T>;\n}\n","import type { CommandId } from '@clinth/ui-commands';\nimport type { PropertyValues } from 'lit';\nimport type { ElementIncrSearch } from '../incr-search/element-search.js';\nimport type {\n ListActivateDetail,\n ListElementEventMap,\n ListInteractionMode,\n ListItemClickDetail,\n ListSelectDetail,\n ListSelectionMode,\n ListTickleDetail,\n} from './types.js';\nimport { css, html, LitElement } from 'lit';\nimport { property, query, state } from 'lit/decorators.js';\nimport { createElementIncrSearch } from '../incr-search/element-search.js';\nimport { TickledController } from '../interaction/tickled-controller.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\n\nexport type {\n ListActivateDetail,\n ListActivateEvent,\n ListElementEventMap,\n ListInteractionMode,\n ListItemClickDetail,\n ListItemClickEvent,\n ListSelectDetail,\n ListSelectEvent,\n ListSelectionMode,\n ListTickleDetail,\n ListTickleEvent,\n} from './types.js';\n\nconst ITEM_SELECTOR = `li, [data-list-item]`;\n\n// Whether the mode allows building a multi-item selection\nfunction isMultiMode(mode: ListInteractionMode): boolean {\n return mode === `checked` || mode === `vscode` || mode === `standard`;\n}\n\n@customElement(`ixfx-vertical-list`)\nexport class VerticalListElement extends LitElement {\n @property({ type: String, attribute: `selection-mode` })\n selectionMode: ListSelectionMode = `single`;\n\n @property({ type: String, attribute: `interaction-mode` })\n interactionMode: ListInteractionMode = `standard`;\n\n @property({ attribute: false })\n filterPredicate: ((el: Element) => boolean) | undefined;\n\n @state() private _selectedItems: ReadonlySet<Element> = new Set();\n @state() private _searchVisible = false;\n @state() private _searchQuery = ``;\n\n @query(`.search-input`)\n private _searchInputEl!: HTMLInputElement;\n\n #search: ElementIncrSearch | undefined;\n // Anchor for range/shift selection — updated on plain-click or plain-keyboard select\n #selectionAnchor: Element | undefined;\n #customWrappers = new Map<HTMLLIElement, Element>();\n\n private tickled = new TickledController<Element>(this, {\n getItems: () => this._getVisibleItems().map(el => ({ id: el, enabled: true })),\n onTickle: (id) => {\n if (id !== undefined) {\n this._dispatch<ListTickleDetail>(`list-tickle`, { item: id });\n }\n },\n onStateChange: () => this._syncItemStates(),\n });\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (!this.hasAttribute(`tabindex`))\n this.tabIndex = 0;\n this.addEventListener(`pointerover`, this._onPointerOver);\n this.addEventListener(`pointerleave`, this._onPointerLeave);\n this.addEventListener(`keydown`, this._onKeyDown);\n this.addEventListener(`click`, this._onClick);\n this.addEventListener(`dblclick`, this._onDblClick);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener(`pointerover`, this._onPointerOver);\n this.removeEventListener(`pointerleave`, this._onPointerLeave);\n this.removeEventListener(`keydown`, this._onKeyDown);\n this.removeEventListener(`click`, this._onClick);\n this.removeEventListener(`dblclick`, this._onDblClick);\n this.#search?.dispose();\n this.#search = undefined;\n }\n\n override firstUpdated(): void {\n this.#search = createElementIncrSearch({\n container: this,\n itemSelector: ITEM_SELECTOR,\n getLabel: el => el.getAttribute(`data-search-label`) ?? el.textContent?.trim() ?? ``,\n getKey: el =>\n el.getAttribute(`data-key`)\n ?? el.getAttribute(`data-search-label`)\n ?? el.textContent?.trim()\n ?? ``,\n highlightKey: `vertical-list-search`,\n });\n }\n\n override updated(changed: PropertyValues): void {\n super.updated(changed);\n if (changed.has(`interactionMode`)) {\n this.#selectionAnchor = undefined;\n const previousSelected = this._selectedItems;\n // Save wrapper→inner map before _syncCheckboxes() clears it on unwrap\n const leavingChecked = (changed.get(`interactionMode`) as ListInteractionMode) === `checked`;\n const savedWrappers = leavingChecked ? new Map(this.#customWrappers) : null;\n\n this._syncCheckboxes();\n\n // Remap _selectedItems across the wrap/unwrap element-reference boundary\n if (previousSelected.size > 0) {\n let remapped: Set<Element>;\n if (savedWrappers && savedWrappers.size > 0) {\n // Leaving checked: wrapper refs → inner element refs\n remapped = new Set([...previousSelected].map(el => savedWrappers.get(el as HTMLLIElement) ?? el));\n } else if (this.#customWrappers.size > 0) {\n // Entering checked: inner element refs → wrapper refs\n const innerToWrapper = new Map([...this.#customWrappers].map(([w, i]) => [i, w]));\n remapped = new Set([...previousSelected].map(el => innerToWrapper.get(el) ?? el));\n } else {\n remapped = new Set(previousSelected);\n }\n this._selectedItems = remapped;\n }\n\n this._syncItemStates();\n }\n }\n\n // --- Public API ---\n\n /** The most recently selected item, or `undefined` if nothing is selected. */\n get selectedItem(): Element | undefined {\n return [...this._selectedItems].at(-1);\n }\n\n /** The full current selection set (read-only). */\n get selectedItems(): ReadonlySet<Element> {\n return this._selectedItems;\n }\n\n addItem(item: Element | string): void {\n if (typeof item === `string`) {\n const li = document.createElement(`li`);\n li.textContent = item;\n this.appendChild(li);\n } else {\n this.appendChild(item);\n }\n if (this.interactionMode === `checked`)\n this._syncCheckboxes();\n }\n\n removeItem(item: Element): void {\n item.remove();\n }\n\n clearItems(): void {\n this.#customWrappers.clear();\n this.replaceChildren();\n this.#selectionAnchor = undefined;\n this._selectedItems = new Set();\n this._syncItemStates();\n }\n\n /**\n * Replace the entire item list in one call.\n * Equivalent to `clearItems()` followed by `addItem()` for each element.\n * Preserves `interactionMode` checkbox wrapping.\n */\n setItems(items: readonly Element[]): void {\n this.clearItems();\n for (const item of items) {\n this.appendChild(item);\n }\n if (this.interactionMode === `checked`)\n this._syncCheckboxes();\n }\n\n /**\n * Dispatch a command to this list. No-op by default.\n * Intended for use with `ixfx-grouped-item-lister`'s `dispatch()` method,\n * which forwards commands to all sub-components.\n */\n dispatch(_commandId: CommandId, _args?: Record<string, unknown>): void {}\n\n select(item: Element): void {\n this._replaceSelection(item);\n }\n\n selectMany(items: Iterable<Element>): void {\n if (this.selectionMode !== `multiple`) {\n throw new Error(`selectMany requires selectionMode=\"multiple\" (current: \"${this.selectionMode}\")`);\n }\n const previous = this._selectedItems;\n const next = new Set(items);\n if (next.size === 0)\n return;\n this._selectedItems = next;\n this.#selectionAnchor = [...next].at(-1);\n this._syncItemStates();\n this._dispatch<ListSelectDetail>(`list-select`, { selected: next, previous });\n }\n\n deselect(item: Element): void {\n if (!this._selectedItems.has(item))\n return;\n const previous = this._selectedItems;\n const next = new Set(this._selectedItems);\n next.delete(item);\n this._selectedItems = next;\n this._syncItemStates();\n this._dispatch<ListSelectDetail>(`list-select`, { selected: next, previous });\n }\n\n clearSelection(): void {\n this._clearSelection();\n }\n\n selectAll(): void {\n const canMulti = this.selectionMode === `multiple` || isMultiMode(this.interactionMode);\n if (canMulti && this.selectionMode !== `none`)\n this._selectAll();\n }\n\n // --- Private selection primitives ---\n\n // Replace entire selection with one item; updates anchor. Used for plain clicks and Enter.\n private _replaceSelection(item: Element): void {\n if (this.selectionMode === `none`)\n return;\n const previous = this._selectedItems;\n const next = new Set([item]);\n this._selectedItems = next;\n this.#selectionAnchor = item;\n this._syncItemStates();\n this._dispatch<ListSelectDetail>(`list-select`, { selected: next, previous });\n }\n\n // Toggle a single item in/out of the selection without replacing. Does not update anchor.\n private _toggleItem(item: Element): void {\n // checked/vscode modes imply multiple selection capacity\n const effectiveMultiple\n = this.selectionMode === `multiple` || isMultiMode(this.interactionMode);\n if (this.selectionMode === `none` && this.interactionMode !== `checked`)\n return;\n\n const previous = this._selectedItems;\n const next = new Set(this._selectedItems);\n if (next.has(item)) {\n next.delete(item);\n } else {\n if (!effectiveMultiple)\n next.clear();\n next.add(item);\n }\n this._selectedItems = next;\n this._syncItemStates();\n this._dispatch<ListSelectDetail>(`list-select`, { selected: next, previous });\n }\n\n // Select the contiguous range from anchor to item. Anchor is not changed.\n private _rangeSelectTo(item: Element): void {\n if (this.selectionMode === `none`)\n return;\n if (!this.#selectionAnchor) {\n this._replaceSelection(item);\n return;\n }\n const visible = this._getVisibleItems();\n const anchorIdx = visible.indexOf(this.#selectionAnchor);\n const targetIdx = visible.indexOf(item);\n if (anchorIdx === -1 || targetIdx === -1) {\n this._replaceSelection(item);\n return;\n }\n const start = Math.min(anchorIdx, targetIdx);\n const end = Math.max(anchorIdx, targetIdx);\n const previous = this._selectedItems;\n const next = new Set(visible.slice(start, end + 1));\n this._selectedItems = next;\n this._syncItemStates();\n this._dispatch<ListSelectDetail>(`list-select`, { selected: next, previous });\n }\n\n private _clearSelection(): void {\n if (this._selectedItems.size === 0)\n return;\n const previous = this._selectedItems;\n this._selectedItems = new Set();\n this._syncItemStates();\n this._dispatch<ListSelectDetail>(`list-select`, { selected: new Set(), previous });\n }\n\n private _selectAll(): void {\n const visible = this._getVisibleItems();\n if (visible.length === 0)\n return;\n const previous = this._selectedItems;\n const next = new Set(visible);\n this._selectedItems = next;\n this._syncItemStates();\n this._dispatch<ListSelectDetail>(`list-select`, { selected: next, previous });\n }\n\n // --- Click interaction routing per interactionMode ---\n\n private _handleClickSelection(item: Element, e: MouseEvent): void {\n const mode = this.interactionMode;\n if (mode === `manual`)\n return;\n if (this.selectionMode === `none` && mode !== `checked`)\n return;\n\n switch (mode) {\n case `implicit`:\n // Single-select only; modifier keys have no effect\n this._replaceSelection(item);\n break;\n\n case `standard`:\n case `vscode`:\n if (e.ctrlKey || e.metaKey) {\n // Ctrl/Cmd+click: toggle item; requires effective multi-select\n if (this.selectionMode === `multiple` || mode === `vscode`) {\n this._toggleItem(item);\n }\n } else if (e.shiftKey && (this.selectionMode === `multiple` || mode === `vscode`)) {\n // Shift+click: range-select from anchor\n this._rangeSelectTo(item);\n } else {\n // Plain click: replace selection, update anchor\n this._replaceSelection(item);\n }\n break;\n\n case `checked`:\n // Body clicks do nothing — use the injected checkbox (li items) or Space key\n break;\n }\n }\n\n // --- Space key routing per interactionMode ---\n\n private _handleSpaceKey(item: Element): void {\n const mode = this.interactionMode;\n if (mode === `manual`)\n return;\n if (mode === `implicit`) {\n // Space selects (same as click) in implicit mode\n this._replaceSelection(item);\n } else {\n // standard / vscode / checked: Space toggles\n this._toggleItem(item);\n }\n }\n\n // --- Helpers ---\n\n private _getVisibleItems(): Element[] {\n return Array.from(this.querySelectorAll(ITEM_SELECTOR)).filter((el) => {\n if ((el as HTMLElement).hidden)\n return false;\n if (this.filterPredicate && !this.filterPredicate(el))\n return false;\n return true;\n });\n }\n\n private _syncItemStates(): void {\n for (const el of this.querySelectorAll(ITEM_SELECTOR)) {\n el.toggleAttribute(`data-tickled`, this.tickled.isTickled(el));\n el.toggleAttribute(`data-selected`, this._selectedItems.has(el));\n if (this.interactionMode === `checked`) {\n el.toggleAttribute(`data-checked`, this._selectedItems.has(el));\n } else {\n el.removeAttribute(`data-checked`);\n }\n }\n this.dataset.inputMode = this.tickled.inputMode;\n this._syncCheckboxes();\n }\n\n private _syncCheckboxes(): void {\n const inCheckedMode = this.interactionMode === `checked`;\n\n if (inCheckedMode) {\n for (const inner of Array.from(this.children)) {\n if (!inner.hasAttribute(`data-list-item`))\n continue;\n if (inner.parentElement !== this)\n continue; // idempotency: already wrapped\n const wrapper = document.createElement(`li`);\n wrapper.className = `ixfx-custom-row`;\n const key = inner.getAttribute(`data-key`);\n const label = inner.getAttribute(`data-search-label`);\n if (key !== null)\n wrapper.setAttribute(`data-key`, key);\n if (label !== null)\n wrapper.setAttribute(`data-search-label`, label);\n inner.removeAttribute(`data-list-item`);\n this.insertBefore(wrapper, inner);\n wrapper.appendChild(inner);\n this.#customWrappers.set(wrapper, inner);\n }\n } else {\n for (const [wrapper, inner] of this.#customWrappers) {\n if (wrapper.parentElement !== this)\n continue;\n inner.setAttribute(`data-list-item`, ``);\n this.insertBefore(inner, wrapper);\n wrapper.remove();\n }\n this.#customWrappers.clear();\n }\n\n for (const el of this.querySelectorAll<HTMLElement>(`li`)) {\n let cb = el.querySelector<HTMLInputElement>(`input.ixfx-list-checkbox`);\n if (inCheckedMode) {\n if (!cb) {\n cb = document.createElement(`input`);\n cb.type = `checkbox`;\n cb.className = `ixfx-list-checkbox`;\n cb.style.cssText = `flex-shrink:0;margin:0 6px 0 0;cursor:pointer;accent-color:var(--accent,#60a5fa);pointer-events:auto`;\n cb.tabIndex = -1;\n cb.addEventListener(`click`, (e) => {\n e.stopPropagation();\n this._toggleItem(el);\n });\n el.prepend(cb);\n }\n cb.checked = this._selectedItems.has(el);\n } else if (cb) {\n cb.remove();\n }\n }\n }\n\n private _findListItem(path: EventTarget[]): Element | undefined {\n for (const target of path) {\n if (!(target instanceof Element))\n continue;\n if (target === this)\n break;\n if (target.parentElement === this && target.matches(ITEM_SELECTOR))\n return target;\n }\n return undefined;\n }\n\n private _dispatch<T>(name: keyof ListElementEventMap, detail: T): void {\n this.dispatchEvent(new CustomEvent<T>(name as string, {\n detail,\n bubbles: true,\n composed: true,\n }));\n }\n\n private _openSearch(): void {\n this._searchVisible = true;\n void this.updateComplete.then(() => this._searchInputEl?.focus());\n }\n\n private _closeSearch(): void {\n this._searchVisible = false;\n this._searchQuery = ``;\n void this.#search?.clearQuery();\n this.focus();\n }\n\n // --- Event handlers ---\n\n private _onPointerOver = (e: PointerEvent): void => {\n const item = this._findListItem(e.composedPath());\n if (item)\n this.tickled.handlePointerEnter(item);\n };\n\n private _onPointerLeave = (e: PointerEvent): void => {\n this.tickled.handlePointerLeave(e);\n };\n\n private _onKeyDown = (e: KeyboardEvent): void => {\n if ((e.ctrlKey || e.metaKey) && e.key === `f`) {\n e.preventDefault();\n this._openSearch();\n return;\n }\n if ((e.ctrlKey || e.metaKey) && e.key === `a`) {\n const canMulti\n = this.selectionMode === `multiple` || isMultiMode(this.interactionMode);\n if (canMulti && this.selectionMode !== `none`) {\n e.preventDefault();\n this._selectAll();\n }\n return;\n }\n if (this._searchVisible)\n return;\n\n switch (e.key) {\n case `ArrowDown`: {\n e.preventDefault();\n this.tickled.handleKeyboardNavigation(`next`);\n // vscode: Shift+Arrow extends range from anchor\n if (e.shiftKey && this.interactionMode === `vscode`) {\n const cur = this.tickled.tickledId;\n if (cur)\n this._rangeSelectTo(cur);\n }\n break;\n }\n case `ArrowUp`: {\n e.preventDefault();\n this.tickled.handleKeyboardNavigation(`previous`);\n if (e.shiftKey && this.interactionMode === `vscode`) {\n const cur = this.tickled.tickledId;\n if (cur)\n this._rangeSelectTo(cur);\n }\n break;\n }\n case `Enter`: {\n const id = this.tickled.tickledId;\n if (id) {\n e.preventDefault();\n this._dispatch<ListItemClickDetail>(`list-item-click`, { item: id });\n this._activateItem(id);\n }\n break;\n }\n case ` `: {\n const id = this.tickled.tickledId;\n if (id) {\n e.preventDefault();\n this._handleSpaceKey(id);\n }\n break;\n }\n case `Escape`:\n this._clearSelection();\n break;\n }\n };\n\n private _onClick = (e: MouseEvent): void => {\n const item = this._findListItem(e.composedPath());\n if (!item)\n return;\n this._dispatch<ListItemClickDetail>(`list-item-click`, { item });\n this._handleClickSelection(item, e);\n };\n\n private _onDblClick = (e: MouseEvent): void => {\n const item = this._findListItem(e.composedPath());\n if (item)\n this._activateItem(item);\n };\n\n private _activateItem(item: Element): void {\n // manual mode: never auto-select; just fire the event\n if (this.interactionMode !== `manual`) {\n this._replaceSelection(item);\n }\n this._dispatch<ListActivateDetail>(`list-activate`, { item });\n }\n\n private _onSearchInput = (e: Event): void => {\n const input = e.target as HTMLInputElement;\n this._searchQuery = input.value;\n void this.#search?.setQuery(this._searchQuery);\n };\n\n private _onSearchKeydown = (e: KeyboardEvent): void => {\n if (e.key === `Escape`) {\n e.stopPropagation();\n this._closeSearch();\n } else if (e.key === `ArrowDown`) {\n e.preventDefault();\n this.tickled.handleKeyboardNavigation(`next`);\n } else if (e.key === `ArrowUp`) {\n e.preventDefault();\n this.tickled.handleKeyboardNavigation(`previous`);\n } else if (e.key === `Enter`) {\n e.preventDefault();\n e.stopPropagation();\n const id = this.tickled.tickledId ?? this._getVisibleItems()[0];\n if (id) {\n this._dispatch<ListItemClickDetail>(`list-item-click`, { item: id });\n this._activateItem(id);\n this._closeSearch();\n }\n }\n };\n\n // --- Styles ---\n\n static override styles = [themeFallbacks, css`\n :host {\n display: block;\n position: relative;\n background: var(--list-bg, var(--surface-3));\n color: var(--list-text, var(--surface-3-text));\n border-radius: var(--list-radius, var(--radius-s));\n border: 1px solid var(--list-border, var(--border));\n width: 100%;\n height: 100%;\n overflow: hidden;\n box-sizing: border-box;\n outline: none;\n }\n\n :host(:focus-visible) {\n outline: 2px solid var(--accent);\n outline-offset: 2px;\n }\n\n .container {\n position: relative;\n width: 100%;\n height: 100%;\n }\n\n ul {\n list-style: none;\n margin: 0;\n padding: 0;\n width: 100%;\n height: 100%;\n overflow-y: auto;\n box-sizing: border-box;\n }\n\n ::slotted([hidden]) {\n display: none !important;\n }\n\n ::slotted(li) {\n display: flex;\n align-items: center;\n padding: var(--list-item-padding, 4px var(--space-m, 8px));\n min-height: var(--list-item-height, 28px);\n cursor: pointer;\n user-select: none;\n transition: background var(--transition, 0.1s ease-out),\n outline-color var(--transition, 0.1s ease-out);\n box-sizing: border-box;\n outline: 1px solid transparent;\n }\n\n /* Custom shadow-DOM components handle their own internal layout/padding */\n ::slotted([data-list-item]) {\n display: block;\n cursor: pointer;\n user-select: none;\n transition: background var(--transition, 0.1s ease-out),\n outline-color var(--transition, 0.1s ease-out);\n outline: 1px solid transparent;\n }\n\n ::slotted([data-tickled]) {\n background: var(--item-bg-tickled);\n outline: var(--item-border-tickled);\n }\n\n ::slotted([data-selected]) {\n background: var(--item-bg-selected);\n color: var(--item-text-selected);\n outline: 1px solid transparent;\n }\n\n ::slotted([data-selected][data-tickled]) {\n background: var(--item-bg-selected-tickled);\n outline: 2px dashed var(--surface-3);\n outline-offset: -2px;\n }\n\n /* checked mode: checkbox (injected into li) communicates selection — suppress bg highlight */\n :host([interaction-mode=\"checked\"]) ::slotted([data-selected]) {\n background: transparent;\n color: inherit;\n outline: 1px solid transparent;\n }\n\n :host([interaction-mode=\"checked\"]) ::slotted([data-selected][data-tickled]) {\n background: var(--item-bg-tickled);\n color: inherit;\n outline: var(--item-border-tickled);\n }\n\n .search-overlay {\n position: absolute;\n top: 8px;\n right: 8px;\n z-index: 10;\n display: flex;\n align-items: center;\n gap: 4px;\n background: var(--surface-4, #2a2a2a);\n border: 1px solid var(--border, #444);\n border-radius: var(--radius-m, 4px);\n padding: 4px 6px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);\n }\n\n .search-overlay[hidden] {\n display: none;\n }\n\n .search-input {\n background: transparent;\n border: none;\n outline: none;\n color: inherit;\n font-size: var(--text-m, 0.875em);\n min-width: 140px;\n }\n\n .search-close {\n background: transparent;\n border: none;\n color: var(--surface-muted-text, #888);\n cursor: pointer;\n font-size: 1.1em;\n line-height: 1;\n padding: 0 2px;\n }\n\n .search-close:hover {\n color: inherit;\n }\n `];\n\n // --- Render ---\n\n override render() {\n return html`\n <div class=\"container\">\n <ul part=\"list\">\n <slot></slot>\n </ul>\n <div\n class=\"search-overlay\"\n part=\"search-overlay\"\n ?hidden=${!this._searchVisible}\n >\n <input\n type=\"text\"\n class=\"search-input\"\n placeholder=\"Search…\"\n .value=${this._searchQuery}\n @input=${this._onSearchInput}\n @keydown=${this._onSearchKeydown}\n />\n <button class=\"search-close\" @click=${this._closeSearch} title=\"Close search (Esc)\">×</button>\n </div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-vertical-list': VerticalListElement;\n }\n\n interface HTMLElementEventMap extends ListElementEventMap {}\n}\n","import type { CommandId } from '@clinth/ui-commands';\nimport type { ListInteractionMode, ListSelectionMode } from '../vertical-list/types.js';\nimport type { VerticalListElement } from '../vertical-list/vertical-list.js';\nimport type { IGroupedSubComponent, SubComponentSelectDetail } from './types.js';\nimport '../vertical-list/vertical-list.js';\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport type VerticalListAdapterOptions = {\n /** Initial selection mode forwarded to the inner ixfx-vertical-list. Default: `'single'`. */\n selectionMode?: ListSelectionMode;\n\n /** Interaction mode forwarded to the inner ixfx-vertical-list. Default: `'standard'`. */\n interactionMode?: ListInteractionMode;\n\n /**\n * Called when a command is dispatched via `ixfx-grouped-item-lister.dispatch()`.\n *\n * Receives the current inner `VerticalListElement` (undefined until the first\n * `setItems()` call) so the handler can sort, filter, or otherwise mutate the\n * list directly.\n *\n * @example Sort items alphabetically by text content:\n * ```ts\n * onDispatch: (id, _args, list) => {\n * if (id !== 'sort-alpha' || !list) return;\n * const rows = [...list.querySelectorAll<HTMLElement>('li')];\n * rows.sort((a, b) => (a.textContent ?? '').localeCompare(b.textContent ?? ''));\n * for (const row of rows) list.appendChild(row);\n * }\n * ```\n */\n onDispatch?: (\n commandId: CommandId,\n args: Record<string, unknown> | undefined,\n list: VerticalListElement | undefined,\n ) => void;\n};\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\n/**\n * Creates an `HTMLElement` that implements `IGroupedSubComponent<T>` by wrapping\n * an `ixfx-vertical-list` internally.\n *\n * Items are typed as `T`. The `renderItem` function converts each item to a DOM\n * element (typically an `<li>`) that `ixfx-vertical-list` renders and handles\n * pointer/keyboard interaction for.\n *\n * The returned element bridges the `list-*` event names fired by\n * `ixfx-vertical-list` to the `select / activate / item-click / tickle` names\n * required by `IGroupedSubComponent`, and maps element-based selection sets back\n * to typed `T` values.\n *\n * @example Basic usage with ixfx-grouped-item-lister:\n * ```ts\n * lister.factory = () =>\n * createVerticalListAdapter<MyItem>(item => {\n * const li = document.createElement('li');\n * li.textContent = item.label;\n * return li;\n * });\n * ```\n */\nexport function createVerticalListAdapter<T>(\n renderItem: (item: T) => Element,\n options?: VerticalListAdapterOptions,\n): HTMLElement & IGroupedSubComponent<T> {\n // Plain div — not a custom element, so appendChild is safe at any time.\n // display:contents makes it invisible in layout; the inner list is treated\n // as if it were a direct child of whatever the adapter is placed inside.\n const container = document.createElement(`div`);\n container.style.cssText = `display:contents;`;\n\n let listEl: VerticalListElement | undefined;\n let selectionMode: ListSelectionMode = options?.selectionMode ?? `single`;\n let elToItem = new WeakMap<Element, T>();\n\n // ---- Internal helpers ----\n\n function getOrCreateList(): VerticalListElement {\n if (listEl)\n return listEl;\n\n listEl = document.createElement(`ixfx-vertical-list`) as VerticalListElement;\n // Override :host { height:100% } so the list sizes to its content\n // when placed inside a panel with no explicit height.\n listEl.style.cssText = `height:auto;width:100%;`;\n listEl.selectionMode = selectionMode;\n if (options?.interactionMode)\n listEl.interactionMode = options.interactionMode;\n\n container.appendChild(listEl);\n attachBridgeListeners();\n\n return listEl;\n }\n\n function attachBridgeListeners(): void {\n listEl!.addEventListener(`list-select`, (e) => {\n const detail: SubComponentSelectDetail<T> = {\n selected: mapEls(e.detail.selected),\n previous: mapEls(e.detail.previous),\n };\n container.dispatchEvent(\n new CustomEvent(`select`, { detail, bubbles: true, composed: true }),\n );\n });\n\n listEl!.addEventListener(`list-activate`, (e) => {\n const item = elToItem.get(e.detail.item);\n if (item !== undefined) {\n container.dispatchEvent(\n new CustomEvent(`activate`, { detail: { item }, bubbles: true, composed: true }),\n );\n }\n });\n\n listEl!.addEventListener(`list-item-click`, (e) => {\n const item = elToItem.get(e.detail.item);\n if (item !== undefined) {\n container.dispatchEvent(\n new CustomEvent(`item-click`, { detail: { item }, bubbles: true, composed: true }),\n );\n }\n });\n\n listEl!.addEventListener(`list-tickle`, (e) => {\n const item = elToItem.get(e.detail.item);\n if (item !== undefined) {\n container.dispatchEvent(\n new CustomEvent(`tickle`, { detail: { item }, bubbles: true, composed: true }),\n );\n }\n });\n }\n\n function applyItems(items: readonly T[]): void {\n const list = getOrCreateList();\n list.clearItems();\n elToItem = new WeakMap();\n for (const item of items) {\n const el = renderItem(item);\n elToItem.set(el, item);\n list.addItem(el);\n }\n }\n\n function mapEls(els: ReadonlySet<Element>): ReadonlySet<T> {\n const result = new Set<T>();\n for (const el of els) {\n const item = elToItem.get(el);\n if (item !== undefined)\n result.add(item);\n }\n return result;\n }\n\n // ---- IGroupedSubComponent methods ----\n\n const adapter = Object.assign(container, {\n setItems(items: readonly T[]): void {\n applyItems(items);\n },\n\n clearSelection(): void {\n listEl?.clearSelection();\n },\n\n dispatch(commandId: CommandId, args?: Record<string, unknown>): void {\n options?.onDispatch?.(commandId, args, listEl);\n },\n });\n\n // Getters/setters require defineProperties — Object.assign would invoke them\n Object.defineProperties(adapter, {\n selectedItems: {\n get(): ReadonlySet<T> {\n return listEl ? mapEls(listEl.selectedItems) : new Set<T>();\n },\n enumerable: true,\n configurable: true,\n },\n selectionMode: {\n get(): ListSelectionMode {\n return listEl?.selectionMode ?? selectionMode;\n },\n set(v: ListSelectionMode) {\n selectionMode = v;\n if (listEl)\n listEl.selectionMode = v;\n },\n enumerable: true,\n configurable: true,\n },\n });\n\n return adapter as unknown as HTMLElement & IGroupedSubComponent<T>;\n}\n","import type { PanelElement, PanelOrientation, PanelToggleInteraction, PanelVariant } from './panel.js';\nimport { css, html, LitElement } from 'lit';\nimport { property, queryAssignedElements } from 'lit/decorators.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\n\nexport type PanelGroupOrientation = `horizontal` | `vertical`;\n\n@customElement(`ixfx-panel-group`)\nexport class PanelGroupElement extends LitElement {\n @property({ type: String, reflect: true }) orientation: PanelGroupOrientation = `horizontal`;\n @property({ type: String }) variant: PanelVariant = `titlebar`;\n @property({ type: String, attribute: `toggle-interaction` }) toggleInteraction: PanelToggleInteraction = `implicit`;\n @property({ type: Boolean, attribute: `allow-multiple` }) allowMultiple = false;\n @property() gap = `var(--space-m)`;\n\n @queryAssignedElements({ slot: `` }) private _panels!: PanelElement[];\n\n private _onPanelToggle(e: Event) {\n const panel = e.target as PanelElement;\n if (panel.collapsed) {\n return;\n }\n\n if (this.allowMultiple) {\n return;\n }\n\n for (const p of this._panels) {\n if (p !== panel) {\n p.collapsed = true;\n }\n }\n }\n\n protected override firstUpdated(): void {\n this.updateComplete.then(() => {\n this._propagateAll();\n });\n }\n\n protected override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (changed.has(`variant`) || changed.has(`toggleInteraction`) || changed.has(`orientation`)) {\n this.updateComplete.then(() => {\n this._propagateAll();\n });\n }\n }\n\n private _propagateAll(): void {\n const invertedOrientation: PanelOrientation\n = this.orientation === `horizontal` ? `vertical` : `horizontal`;\n\n for (const panel of this._panels) {\n panel.setAttribute(`variant`, this.variant);\n panel.setAttribute(`toggle-interaction`, this.toggleInteraction);\n panel.setAttribute(`orientation`, invertedOrientation);\n }\n }\n\n protected override render() {\n return html`\n <slot\n @toggle=${this._onPanelToggle}\n ></slot>\n `;\n }\n\n static override styles = css`\n :host {\n display: flex;\n flex-direction: column;\n gap: var(--group-gap, var(--space-m));\n }\n\n :host([orientation=\"horizontal\"]) {\n flex-direction: row;\n align-items: flex-start;\n flex-wrap: wrap;\n }\n\n :host([orientation=\"vertical\"]) {\n flex-direction: column;\n }\n\n ::slotted(ixfx-panel) {\n flex-shrink: 1;\n }\n\n :host([orientation=\"horizontal\"]) ::slotted(ixfx-panel) {\n flex-basis: content;\n min-width: 0;\n }\n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-panel-group': PanelGroupElement;\n }\n}\n","export type DragLogicCoordinates = {\n client: { x: number; y: number };\n offset: { x: number; y: number };\n};\nexport type DragLogicHandler = {\n progress: (current: DragLogicCoordinates, start: DragLogicCoordinates) => void;\n complete: (final: DragLogicCoordinates, start: DragLogicCoordinates) => void;\n};\n\nfunction getCoordinates(event: PointerEvent): DragLogicCoordinates {\n return {\n client: { x: event.clientX, y: event.clientY },\n offset: { x: event.offsetX, y: event.offsetY },\n };\n}\n\nexport function dragLogicStart(downEvent: PointerEvent, handler: DragLogicHandler) {\n const start = getCoordinates(downEvent);\n const onMove = (event: PointerEvent) => {\n handler.progress(\n getCoordinates(event),\n start,\n );\n };\n\n const onUp = (event: PointerEvent) => {\n document.removeEventListener(`pointermove`, onMove);\n document.removeEventListener(`pointerup`, onUp);\n handler.complete(\n getCoordinates(event),\n start,\n );\n };\n\n document.addEventListener(`pointermove`, onMove);\n document.addEventListener(`pointerup`, onUp);\n}\n","export function near(target: number, range: number) {\n const min = target - range;\n const max = target + range;\n return (v: number) => (v >= min && v <= max);\n}\n","import type { NumberScaler } from \"@ixfx/numbers\";\nimport type { PropertyValues } from \"lit\";\nimport type { TooltipOrientations } from \"../util/tooltip.js\";\nimport { clamper, scaler } from \"@ixfx/numbers\";\nimport { css, html, LitElement, nothing } from \"lit\";\nimport { eventOptions, property } from \"lit/decorators.js\";\nimport { themeFallbacks } from \"../styles/fallbacks.js\";\nimport { prominenceStyles } from \"../styles/prominence.js\";\nimport { tooltipValueStyles } from \"../styles/tooltip.js\";\nimport { safeCustomElement as customElement } from \"../util/custom-elements.js\";\nimport { dragLogicStart } from \"../util/drag.js\";\n// import type { ClampFn } from \"../util/clamp.js\";\nimport { near } from \"../util/near.js\";\n\nexport type Endpoints = `a` | `b`;\n\nexport type CrossoverBehaviour = `stop` | `allow`;\n\nexport type ResizeMode = `dual` | `none` | `bipolar` | `bipolar-flex`;\n\nexport type RangeMultiInputDetail = {\n readonly a: number;\n readonly b: number;\n readonly changed: `a` | `b` | `both`;\n};\n\nexport type RangeMultiInputEvent = CustomEvent<RangeMultiInputDetail>;\n\n/**\n *\n * Attributes\n * crossover: How thumbs can cross over. Default: 'allow' ('allow'/'stop')\n * a/b: Initial A/B values on 0...100 scale\n * step: Increments of input on 0...100 scale. Use 'any' for maximum precision. Default: 1 (number|'any')\n * tooltip: Whether tooltip is shown. Default: true (boolean)\n * tooltip-orientation: Orientation of tooltip if used. Default: 'top' ('top'|'right')\n *\n * CSS variables\n * --range-background: AccentColor\n * --range-height: 1.5em;\n * --range-thickness: 1em;\n * --thumb-background: ButtonFace;\n * --thumb-radius: 50%;\n * --thumb-width: 1em;\n * --thumb-height: 1em;\n */\n@customElement(`ixfx-range-multi`)\nexport class RangeMultiElement extends LitElement {\n @property({ type: Boolean })\n tooltip = true;\n\n @property({ type: String, attribute: `tooltip-orientation` })\n tooltipOrientation: TooltipOrientations = `top`;\n\n @property({ type: String })\n crossover: CrossoverBehaviour = `allow`;\n\n @property({ type: String, attribute: `resize-mode` })\n resizeMode: ResizeMode = `dual`;\n\n @property({ type: String, reflect: true })\n orientation: `horizontal` | `vertical` = `horizontal`;\n\n @property()\n step: number | `any` = 1;\n\n @property({ type: Number })\n a = 0;\n\n @property({ type: Number })\n b = 50;\n\n #userMax = 100;\n #userMin = 0;\n\n #scaleTo100: NumberScaler = (v: number) => v;\n #scaleFrom100: NumberScaler = (v: number) => v;\n #userClamp: NumberScaler = (v: number) => v;\n\n #updateScale() {\n this.#scaleTo100 = scaler(this.#userMin, this.#userMax, 0, 100);\n this.#scaleFrom100 = scaler(0, 100, this.#userMin, this.#userMax);\n this.#userClamp = clamper(this.#userMin, this.#userMax);\n this.a = this.#userClamp(this.a);\n this.b = this.#userClamp(this.b);\n }\n\n @property({ type: Number })\n set max(v: number) {\n this.#userMax = v;\n this.#updateScale();\n }\n\n get max() {\n return this.#userMax;\n }\n\n @property({ type: Number })\n set min(v: number) {\n this.#userMin = v;\n this.#updateScale();\n }\n\n get min() {\n return this.#userMin;\n }\n\n valuesAtPointerDown: undefined | { a: number; b: number };\n draggingThumb: `a` | `b` | `none` = `none`;\n\n @eventOptions({ capture: true })\n _onInput(event: Event) {\n event.stopPropagation();\n const t = event.target as HTMLInputElement;\n const v = this.#scaleFrom100(t.valueAsNumber);\n const which = t.id as Endpoints;\n let a = this.a;\n let b = this.b;\n\n if (this.resizeMode === `none`) {\n const rawDelta = v - (which === `a` ? this.a : this.b);\n let panDelta = rawDelta;\n const newA = this.a + panDelta;\n const newB = this.b + panDelta;\n if (newA < this.min) {\n panDelta = this.min - this.a;\n }\n if (newB > this.max) {\n panDelta = this.max - this.b;\n }\n\n if (panDelta === 0) {\n t.valueAsNumber = this.#scaleTo100(which === `a` ? this.a : this.b);\n return;\n }\n\n a = this.a + panDelta;\n b = this.b + panDelta;\n } else if (this.resizeMode === `bipolar`) {\n let newA: number;\n let newB: number;\n if (which === `a`) {\n const delta = v - this.a;\n newA = v;\n newB = this.b - delta;\n } else {\n const delta = v - this.b;\n newA = this.a - delta;\n newB = v;\n }\n\n if (newA < this.min || newB > this.max || newA > this.max || newB < this.min) {\n t.valueAsNumber = this.#scaleTo100(which === `a` ? this.a : this.b);\n return;\n }\n\n a = newA;\n b = newB;\n } else if (this.resizeMode === `bipolar-flex`) {\n let newA: number;\n let newB: number;\n if (which === `a`) {\n newA = v;\n if (this.b <= this.min) {\n newB = this.min;\n } else if (this.b >= this.max) {\n newB = this.max;\n } else {\n const delta = v - this.a;\n newB = this.b - delta;\n }\n } else {\n newB = v;\n if (this.a <= this.min) {\n newA = this.min;\n } else if (this.a >= this.max) {\n newA = this.max;\n } else {\n const delta = v - this.b;\n newA = this.a - delta;\n }\n }\n\n if (newA < this.min)\n newA = this.min;\n if (newA > this.max)\n newA = this.max;\n if (newB < this.min)\n newB = this.min;\n if (newB > this.max)\n newB = this.max;\n\n if (newA > newB) {\n t.valueAsNumber = this.#scaleTo100(which === `a` ? this.a : this.b);\n return;\n }\n\n a = newA;\n b = newB;\n } else {\n if (which === `a`) {\n if (v > this.b && this.crossover === `stop`) {\n t.valueAsNumber = this.#scaleTo100(this.a);\n } else {\n a = v;\n }\n } else if (which === `b`) {\n if (v < a && this.crossover === `stop`) {\n t.valueAsNumber = this.#scaleTo100(this.b);\n } else {\n b = v;\n }\n } else {\n throw new Error(`Expected 'a' or 'b', got: '${t.id}'`);\n }\n }\n\n this.setPoles(a, b);\n }\n\n setPoles(a: number, b: number) {\n const aDiff = a !== this.a;\n const bDiff = b !== this.b;\n // a = clamp(a, this.min, this.max);\n // b = clamp(b, this.min, this.max);\n this.a = this.#userClamp(a);\n this.b = this.#userClamp(b);\n this.dispatchEvent(new CustomEvent<RangeMultiInputDetail>(`input`, {\n detail: { a: this.a, b: this.b, changed: aDiff && bDiff ? `both` : aDiff ? `a` : `b` },\n }));\n }\n\n @eventOptions({ capture: true })\n _onPointerDown(event: PointerEvent) {\n const startA = this.a;\n const startB = this.b;\n this.valuesAtPointerDown = { a: startA, b: startB };\n const rect = (event.target as HTMLInputElement).getBoundingClientRect();\n const isVertical = this.orientation === `vertical`;\n const dim = isVertical ? rect.height : rect.width;\n const valuePerPix = dim / (this.max - this.min);\n const pos = isVertical ? event.offsetY : event.offsetX;\n\n const valueFromPos = (p: number): number => {\n return isVertical ? this.max - p * valuePerPix : p * valuePerPix;\n };\n const posFromValue = (v: number): number => {\n return isVertical ? dim - (v * valuePerPix) : v * valuePerPix;\n };\n\n const aPosPx = posFromValue(startA);\n const bPosPx = posFromValue(startB);\n\n const outsideClick = isVertical\n ? (this.b < this.a ? pos > bPosPx : pos < bPosPx)\n || (this.b < this.a ? pos < aPosPx : pos > aPosPx)\n : (this.b < this.a && pos < bPosPx) || (this.b > this.a && pos > bPosPx)\n || (this.a < this.b && pos < aPosPx) || (this.a > this.b && pos > aPosPx);\n\n if (outsideClick) {\n if (this.resizeMode === `none` || this.resizeMode === `bipolar` || this.resizeMode === `bipolar-flex`) {\n const newB = valueFromPos(pos);\n let panDelta = newB - this.b;\n if (this.a + panDelta < this.min) {\n panDelta = this.min - this.a;\n }\n if (this.b + panDelta > this.max) {\n panDelta = this.max - this.b;\n }\n const finalA = this.a + panDelta;\n const finalB = this.b + panDelta;\n if (finalA >= this.min && finalB <= this.max) {\n this.setPoles(finalA, finalB);\n }\n } else {\n this.b = valueFromPos(pos);\n }\n return;\n }\n\n const aPosPxNear = near(aPosPx, 10);\n const bPosPxNear = near(bPosPx, 10);\n\n const handleDrag = (draggingWhich: `a` | `b` | `none`) => {\n const setPoles = this.setPoles.bind(this);\n const resizeMode = this.resizeMode;\n const min = this.min;\n const max = this.max;\n const startPos = isVertical ? event.offsetY : event.offsetX;\n let polesChanged = false;\n dragLogicStart(event, {\n progress(current, _start) {\n const currentPos = isVertical ? current.offset.y : current.offset.x;\n const delta = isVertical ? startPos - currentPos : currentPos - startPos;\n const amt = delta / valuePerPix;\n polesChanged = true;\n\n if (draggingWhich === `a`) {\n if (resizeMode === `bipolar`) {\n const calcA = startA + amt;\n const calcB = startB - amt;\n if (calcA < min || calcB > max || calcA > max || calcB < min) {\n return;\n }\n setPoles(calcA, calcB);\n } else if (resizeMode === `bipolar-flex`) {\n let calcA = startA + amt;\n let calcB = startB;\n\n if (startB <= min) {\n calcB = min;\n } else if (startB >= max) {\n calcB = max;\n } else {\n calcA = startA + amt;\n calcB = startB - amt;\n }\n\n if (calcA < min)\n calcA = min;\n if (calcA > max)\n calcA = max;\n if (calcB < min)\n calcB = min;\n if (calcB > max)\n calcB = max;\n\n if (calcA > calcB) {\n return;\n }\n setPoles(calcA, calcB);\n } else {\n let constrainedAmt = amt;\n if (startA + amt < min) {\n constrainedAmt = min - startA;\n }\n if (startB + constrainedAmt > max) {\n constrainedAmt = max - startB;\n }\n const finalA = startA + constrainedAmt;\n const finalB = startB + constrainedAmt;\n if (finalA >= min && finalB <= max) {\n setPoles(finalA, finalB);\n }\n }\n } else if (draggingWhich === `b`) {\n if (resizeMode === `bipolar`) {\n const calcA = startA - amt;\n const calcB = startB + amt;\n if (calcA < min || calcB > max || calcA > max || calcB < min) {\n return;\n }\n setPoles(calcA, calcB);\n } else if (resizeMode === `bipolar-flex`) {\n let calcA = startA;\n let calcB = startB + amt;\n\n if (startA <= min) {\n calcA = min;\n } else if (startA >= max) {\n calcA = max;\n } else {\n calcA = startA - amt;\n calcB = startB + amt;\n }\n\n if (calcA < min)\n calcA = min;\n if (calcA > max)\n calcA = max;\n if (calcB < min)\n calcB = min;\n if (calcB > max)\n calcB = max;\n\n if (calcA > calcB) {\n return;\n }\n setPoles(calcA, calcB);\n } else {\n let constrainedAmt = amt;\n if (startA + amt < min) {\n constrainedAmt = min - startA;\n }\n if (startB + constrainedAmt > max) {\n constrainedAmt = max - startB;\n }\n const finalA = startA + constrainedAmt;\n const finalB = startB + constrainedAmt;\n if (finalA >= min && finalB <= max) {\n setPoles(finalA, finalB);\n }\n }\n } else {\n if (resizeMode === `bipolar`) {\n const calcA = startA + amt;\n const calcB = startB + amt;\n if (calcA < min || calcB > max) {\n return;\n }\n setPoles(calcA, calcB);\n } else if (resizeMode === `bipolar-flex`) {\n let calcA = startA + amt;\n let calcB = startB + amt;\n if (calcA < min) {\n calcA = min;\n calcB = min + (startB - startA);\n } else if (calcB > max) {\n calcB = max;\n calcA = max - (startB - startA);\n }\n if (calcA < min || calcB > max || calcA > calcB) {\n return;\n }\n setPoles(calcA, calcB);\n } else {\n let constrainedAmt = amt;\n if (startA + amt < min) {\n constrainedAmt = min - startA;\n }\n if (startB + constrainedAmt > max) {\n constrainedAmt = max - startB;\n }\n const finalA = startA + constrainedAmt;\n const finalB = startB + constrainedAmt;\n if (finalA >= min && finalB <= max) {\n setPoles(finalA, finalB);\n }\n }\n }\n },\n complete(_final, _start) {\n if (!polesChanged) {\n const currentPos = isVertical ? event.offsetY : event.offsetX;\n const closestA = Math.abs(currentPos - aPosPx) < Math.abs(currentPos - bPosPx);\n if (closestA) {\n setPoles(valueFromPos(currentPos), startB);\n } else {\n setPoles(startA, valueFromPos(currentPos));\n }\n }\n },\n });\n };\n\n if (aPosPxNear(pos)) {\n this.draggingThumb = `a`;\n if (this.resizeMode === `dual`) {\n return false;\n }\n event.preventDefault();\n (event.target as HTMLElement).setPointerCapture(event.pointerId);\n handleDrag(`a`);\n return;\n } else if (bPosPxNear(pos)) {\n this.draggingThumb = `b`;\n if (this.resizeMode === `dual`) {\n return false;\n }\n event.preventDefault();\n (event.target as HTMLElement).setPointerCapture(event.pointerId);\n handleDrag(`b`);\n return;\n } else {\n this.draggingThumb = `none`;\n }\n\n event.preventDefault();\n (event.target as HTMLElement).setPointerCapture(event.pointerId);\n handleDrag(`none`);\n }\n\n protected firstUpdated(_changedProperties: PropertyValues): void {\n this.#updateScale();\n }\n\n protected render(): unknown {\n const ttA = this.tooltip ? html`<ixfx-tooltip style=\"--tooltip-background: var(--surface-5); --tooltip-color: var(--surface-5-text)\" anchor=\"--a-tooltip\" .orientation=${this.tooltipOrientation} .value=${this.a}></ixfx-tooltip>` : nothing;\n const ttB = this.tooltip ? html`<ixfx-tooltip style=\"--tooltip-background: var(--surface-5); --tooltip-color: var(--surface-5-text)\" anchor=\"--b-tooltip\" .orientation=${this.tooltipOrientation} .value=${this.b}></ixfx-tooltip>` : nothing;\n\n const scaledA = this.#scaleTo100(this.a);\n const scaledB = this.#scaleTo100(this.b);\n const verticalStyle = this.orientation === `vertical`\n ? `writing-mode: vertical-lr; direction: rtl;`\n : nothing;\n // console.log(`a->b ${ this.a }->${ this.b } scaled: ${ scaledA }->${ scaledB }`)\n return html`\n <div @pointerdown=${this._onPointerDown} @input=${this._onInput} style=\"--a: ${scaledA}; --b: ${scaledB}\">\n <input class=\"thumb-round\" .value=${scaledA} id=\"a\" step=${this.step} type=\"range\" style=\"${verticalStyle}\" anchor=\"--a-tooltip\" />\n ${ttA}\n\n <input class=\"thumb-round\" .value=${scaledB} id=\"b\" step=${this.step} type=\"range\" style=\"${verticalStyle}\" anchor=\"--b-tooltip\" />\n ${ttB}\n </div>`;\n }\n\n static styles = [\n themeFallbacks,\n tooltipValueStyles,\n prominenceStyles,\n css`\n :host {\n display: grid;\n --value-label-color: unset;\n \n --range-background: AccentColor;\n --range-height: 1.5em;\n --range-thickness: 1em;\n --thumb-background: ButtonFace;\n --thumb-radius: 50%;\n --thumb-width: 1em;\n --thumb-height: 1em;\n --js:1;\n }\n\n :host([orientation=\"vertical\"]) {\n display: block;\n width: 1.5em;\n height: 200px;\n }\n\n * {\n margin: 0;\n padding: 0;\n font: inherit;\n }\n\n div {\n --j: var(--js, 0);\n display:inline grid;\n align-content: end;\n grid-gap: 0.25em;\n place-self: center;\n min-width: 8em;\n width: calc(100% - 1.5em);\n height: 1.5rem;\n }\n\n :host([orientation=\"vertical\"]) div {\n width: 1.5rem;\n height: calc(100% - 1.5em);\n min-width: unset;\n min-height: 8em;\n }\n\n div::before, div::after {\n margin: 0.5rem 0.6875rem;\n border-radius: 0.25rem;\n box-shadow: none;\n background: var(--surface-4);\n content: \"\";\n }\n :host([orientation=\"vertical\"]) div::before,\n :host([orientation=\"vertical\"]) div::after {\n margin: 0.5rem 0;\n }\n div::after {\n --or: calc((100 - Max(var(--a), var(--b)))*1%);\n --ol: calc(Min(var(--a), var(--b))*1%);\n box-shadow: none;\n background: var(--accent);\n clip-path: inset(0 var(--or) 0 var(--ol));\n }\n :host([orientation=\"vertical\"]) div::after {\n clip-path: inset(var(--or) 0 var(--ol) 0);\n }\n div input, div::before, div::after {\n grid-area: calc(1 + var(--j))/1;\n }\n div output, div::after {\n display:'none';\n }\n\n [type=range] {\n width: 100%;\n height: var(--range-height);\n background: transparent;\n pointer-events: none;\n }\n\n :host([orientation=\"vertical\"]) [type=range] {\n writing-mode: vertical-lr;\n direction: rtl;\n width: var(--range-height);\n height: 100%;\n }\n\n [type=range], [type=range]::-webkit-slider-runnable-track, [type=range]::-webkit-slider-thumb {\n -webkit-appearance: none;\n }\n [type=range], [type=range] + ixfx-tooltip {\n --sel: 0;\n z-index: calc(1 + var(--sel));\n }\n [type=range]::-webkit-slider-runnable-track {\n background: transparent;\n }\n [type=range]::-moz-range-track {\n background: transparent;\n }\n\n input.thumb-round::-webkit-slider-thumb {\n width: var(--thumb-width);\n height: var(--thumb-height);\n border-radius: var(--thumb-radius);\n }\n\n [type=range]::-webkit-slider-thumb {\n box-sizing: border-box;\n border: solid calc(0.5rem + -1px) transparent;\n\n /* box-shadow: var(--shadow-m); */\n background: var(--thumb-background);\n pointer-events: auto;\n cursor: ew-resize;\n }\n\n :host([orientation=\"vertical\"]) [type=range]::-webkit-slider-thumb {\n width: var(--thumb-height);\n height: var(--thumb-width);\n cursor: ns-resize;\n }\n\n [type=range]::-moz-range-thumb {\n box-sizing: border-box;\n border: solid calc(0.5rem + -1px) transparent;\n width: 1.375rem;\n height: 1.375rem;\n border-radius: 50%;\n box-shadow: var(--shadow-m);\n background: var(--thumb-background);\n pointer-events: auto;\n cursor: ew-resize;\n }\n\n :host([orientation=\"vertical\"]) [type=range]::-moz-range-thumb {\n cursor: ns-resize;\n }\n\n [type=range]:focus {\n outline: none;\n }\n [type=range]:focus, [type=range]:focus + ixfx-tooltip, [type=range]:hover, [type=range]:hover + ixfx-tooltip {\n --sel: 1 ;\n }\n `,\n ];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ixfx-range-multi\": RangeMultiElement;\n }\n}\n","import type { CommandRegistry } from \"@clinth/ui-commands\";\nimport type { PropertyValues } from \"lit\";\nimport { css, html, LitElement, nothing } from \"lit\";\nimport { property, state } from \"lit/decorators.js\";\nimport { themeFallbacks } from \"../styles/fallbacks.js\";\nimport { prominenceStyles } from \"../styles/prominence.js\";\nimport { safeCustomElement as customElement } from \"../util/custom-elements.js\";\nimport \"../icons/icon.js\";\n\n/**\n * CSS vars (can be overridden per-instance):\n * --selected-colour: text colour when selected\n * --selected-border-width: border width\n * --padding\n */\n@customElement(`ixfx-tab-list-item`)\nexport class TabListItemElement extends LitElement {\n @property({ type: Boolean })\n closeable = false;\n\n @property({ type: String, attribute: `icon-name` })\n iconName: string | undefined = undefined;\n\n @property({ type: String })\n description: string | undefined = undefined;\n\n @property({ type: String, attribute: `command-active` })\n commandActive: string | undefined = undefined;\n\n @property({ attribute: false })\n registry: CommandRegistry<unknown> | undefined = undefined;\n\n @state() private _compact = false;\n private _resizeObserver?: ResizeObserver;\n private _commandCleanup?: () => void;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this._resizeObserver = new ResizeObserver(([entry]) => {\n this._compact = entry.contentRect.width < 64;\n });\n this._resizeObserver.observe(this);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this._resizeObserver?.disconnect();\n this._resizeObserver = undefined;\n this._commandCleanup?.();\n this._commandCleanup = undefined;\n }\n\n override updated(changed: PropertyValues): void {\n super.updated(changed);\n this._syncTooltipAttrs();\n if (changed.has(`registry`) || changed.has(`commandActive`)) {\n this._syncCommandListener();\n }\n }\n\n private _syncTooltipAttrs(): void {\n if (this.description) {\n this.setAttribute(`data-tooltip`, this.description);\n this.setAttribute(`data-tooltip-anchor`, `top`);\n } else {\n this.removeAttribute(`data-tooltip`);\n this.removeAttribute(`data-tooltip-anchor`);\n }\n }\n\n private _syncCommandListener(): void {\n this._commandCleanup?.();\n this._commandCleanup = undefined;\n if (this.registry && this.commandActive) {\n this._commandCleanup = this.registry.addOnInvokeHandler((id) => {\n if (id === this.commandActive)\n this.click();\n });\n }\n }\n\n override render() {\n const showLabel = !this._compact || !this.iconName;\n return html`\n <div>\n ${this.iconName ? html`<ixfx-icon name=\"${this.iconName}\"></ixfx-icon>` : nothing}\n ${showLabel ? html`<span class=\"label\"><slot></slot></span>` : nothing}\n <div class=\"actions\">\n <div class=\"toolbar\"><slot name=\"toolbar\"></slot></div>\n ${this.closeable\n ? html`\n <button\n class=\"close-btn\"\n type=\"button\"\n aria-label=\"Close tab\"\n @click=${this._onCloseClick}\n >\n <ixfx-icon name=\"close\"></ixfx-icon>\n </button>\n `\n : nothing}\n </div>\n </div>\n `;\n }\n\n private _onCloseClick(e: Event) {\n e.stopPropagation();\n this.dispatchEvent(\n new CustomEvent<void>(`close`, {\n bubbles: true,\n composed: true,\n }),\n );\n this.remove();\n }\n\n static override styles = [\n themeFallbacks,\n prominenceStyles,\n css`\n :host {\n --selected-colour: var(--accent);\n --selected-border-width: 1px;\n --padding: var(--space-m);\n display: inline-flex;\n min-width: 0;\n user-select: none;\n box-sizing: border-box;\n }\n\n :host > div {\n display: flex;\n align-items: center;\n gap: var(--space-s, 4px);\n padding: var(--padding) calc(2 * var(--padding));\n min-width: 0;\n width: 100%;\n font-weight: 500;\n border: var(--selected-border-width) solid transparent;\n }\n\n :host([selected]) > div {\n color: var(--selected-colour);\n border-top-color: var(--indicator-color-top, transparent);\n border-bottom-color: var(--indicator-color-bottom, transparent);\n border-left-color: var(--indicator-color-left, transparent);\n border-right-color: var(--indicator-color-right, transparent);\n }\n\n .label {\n overflow: var(--allow-overflow, hidden);\n text-overflow: ellipsis;\n white-space: nowrap;\n min-width: 0;\n flex: 1 1 auto;\n }\n\n ixfx-icon {\n flex-shrink: 0;\n }\n\n .actions {\n display: flex;\n align-items: center;\n gap: var(--space-xs);\n margin-left: auto;\n flex-shrink: 0;\n }\n\n .toolbar {\n /* Always laid out (display: flex) so the tab's width doesn't shift when\n the toolbar appears on selection. visibility: hidden keeps the\n toolbar from receiving pointer events or painting, while preserving\n the space its contents take up. */\n display: flex;\n align-items: center;\n gap: var(--space-xs);\n visibility: hidden;\n }\n\n :host([selected]) .toolbar {\n visibility: visible;\n }\n\n slot[name=\"toolbar\"] {\n display: contents;\n }\n\n .close-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n background: none;\n border: none;\n padding: var(--space-xs);\n cursor: pointer;\n color: inherit;\n border-radius: var(--radius-s);\n opacity: var(--prominence-idle-opacity);\n transition: opacity var(--transition), background var(--transition);\n }\n\n .close-btn:hover {\n background: var(--surface-5);\n opacity: var(--prominence-tickled-opacity);\n }\n\n .close-btn:focus-visible {\n outline: 2px solid var(--accent);\n outline-offset: 1px;\n }\n\n :host([selected]) .close-btn,\n :host(:hover) .close-btn {\n opacity: var(--prominence-tickled-opacity);\n }\n `,\n ];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ixfx-tab-list-item\": TabListItemElement;\n }\n}\n","import { css, html, LitElement } from \"lit\";\nimport { themeFallbacks } from \"../styles/fallbacks.js\";\nimport { safeCustomElement as customElement } from \"../util/custom-elements.js\";\n\n@customElement(`ixfx-tab-panel`)\nexport class TabPanelElement extends LitElement {\n render() {\n return html`<slot></slot>`;\n }\n\n static styles = [themeFallbacks, css`\n :host {\n display:none;\n height:100%;\n width:100%;\n }\n\n :host([selected]) {\n background: var(--surface-3);\n display:block;\n }\n `];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ixfx-tab-panel\": TabPanelElement;\n }\n}\n","import type { TabListElement } from \"./tab-list.js\";\nimport type { TabPanelElement } from \"./tab-panel.js\";\nimport { css, html, LitElement } from \"lit\";\nimport { queryAssignedElements } from \"lit/decorators.js\";\nimport { safeCustomElement as customElement } from \"../util/custom-elements.js\";\n\n@customElement(`ixfx-tab-panels`)\nexport class TabPanelsElement extends LitElement {\n @queryAssignedElements()\n _listItems!: TabPanelElement[];\n\n /**\n * Triggered when a panel is being de-selected\n */\n onUnselectedPanel?: (id: string, el: TabPanelElement) => void;\n /**\n * Triggered before panel is selected\n */\n onSelectingPanel?: (id: string, el: TabPanelElement) => void;\n /**\n * Triggered after panel is selected\n */\n onSelectedPanel?: (id: string, el: TabPanelElement) => void;\n render() {\n return html`<slot></slot>`;\n }\n\n getSelectedElement() {\n for (const el of this._listItems) {\n if (this.#isSelected(el))\n return el;\n }\n }\n\n #isSelected(el: TabPanelElement) {\n // const v = el.getAttribute(`selected`);\n // console.log(`id: ${ el.id } v: ${ v }`);\n return el.hasAttribute(`selected`);\n }\n\n #unselect(el: TabPanelElement) {\n el.removeAttribute(`selected`);\n if (this.onUnselectedPanel) {\n this.onUnselectedPanel(el.id, el);\n }\n }\n\n #select(el: TabPanelElement) {\n if (this.onSelectingPanel) {\n this.onSelectingPanel(el.id, el);\n }\n el.setAttribute(`selected`, ``);\n if (this.onSelectedPanel) {\n this.onSelectedPanel(el.id, el);\n }\n }\n\n syncWithList(el: TabListElement) {\n const doSync = () => {\n const t = el.getSelectedElement();\n if (!t)\n return;\n const forEl = t.getAttribute(`for`);\n if (forEl)\n this.selectPanel(forEl);\n };\n // Wait for both the list and ourselves to be fully rendered\n // so that getSelectedElement() and _listItems both work.\n Promise.all([el.updateComplete, this.updateComplete]).then(doSync);\n }\n\n selectPanel(id: string) {\n const current = this.getSelectedElement();\n if (current) {\n if (current.id === id)\n return;\n this.#unselect(current);\n }\n\n let found = false;\n for (const el of this._listItems) {\n if (el.id === id) {\n this.#select(el);\n found = true;\n }\n }\n return found;\n }\n\n static styles = css`\n :host {\n display: block;\n }\n \n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ixfx-tab-panels\": TabPanelsElement;\n }\n}\n","import type { PropertyValues } from 'lit';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { keyed } from 'lit/directives/keyed.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\n\nexport type Effect = `slide-right` | `slide-left` | `slide-up` | `slide-down` | `fade` | `character-swap`;\n\ntype QueueEntry = { text: string; effect: Effect };\n\n@customElement(`ixfx-transitory-label`)\nexport class TransitoryLabelElement extends LitElement {\n @property({ type: String }) text = ``;\n @property({ type: String }) effect: Effect = `fade`;\n @property({ type: Number }) duration = 300;\n @property({ type: String }) easing = `ease`;\n\n @state() private _currentText = ``;\n @state() private _outgoingText = ``;\n @state() private _activeEffect: Effect | undefined;\n @state() private _transitionId = 0;\n\n private _queue: QueueEntry[] = [];\n private _pendingEffect: Effect | undefined;\n\n setText(msg: string, effect: Effect): void {\n this._pendingEffect = effect;\n this.text = msg;\n }\n\n protected override updated(changed: PropertyValues): void {\n if (changed.has(`text`) && this.text !== this._currentText) {\n const effect = this._pendingEffect ?? this.effect;\n this._pendingEffect = undefined;\n\n if (this._activeEffect !== undefined) {\n this._queue.push({ text: this.text, effect });\n } else {\n this._startTransition(this.text, effect);\n }\n }\n }\n\n private _startTransition(newText: string, effect: Effect): void {\n const prevText = this._currentText;\n this._currentText = newText;\n this._outgoingText = prevText;\n\n if (prevText !== ``) {\n this._transitionId++;\n this._activeEffect = effect;\n }\n }\n\n private _onTransitionEnd(): void {\n this._outgoingText = ``;\n this._activeEffect = undefined;\n\n if (this._queue.length > 0) {\n const next = this._queue.shift()!;\n this._startTransition(next.text, next.effect);\n }\n }\n\n #onOutgoingEnd = (): void => {\n this._onTransitionEnd();\n };\n\n #onLastCharOut = (): void => {\n this._onTransitionEnd();\n };\n\n #renderCharSwap() {\n const charDuration = Math.round(this.duration * 0.3);\n const charStagger = Math.round(this.duration * 0.1);\n const currentChars = this._currentText.split(``);\n const outgoingChars = this._outgoingText.split(``);\n const lastIdx = outgoingChars.length - 1;\n\n const charStyle = (i: number) =>\n `animation-duration:${charDuration}ms;animation-delay:${i * charStagger}ms;animation-timing-function:${this.easing}`;\n\n return html`\n ${keyed(`cc${this._transitionId}`, html`\n <span class=\"layer current char-swap\">\n ${currentChars.map((ch, i) => html`<span class=\"char in\" style=${charStyle(i)}>${ch}</span>`)}\n </span>\n `)}\n ${this._outgoingText\n ? keyed(this._transitionId, html`\n <span class=\"layer outgoing char-swap\">\n ${outgoingChars.map((ch, i) => html`<span\n class=\"char out\"\n style=${charStyle(i)}\n @animationend=${i === lastIdx ? this.#onLastCharOut : undefined}\n >${ch}</span>`)}\n </span>\n `)\n : nothing}\n `;\n }\n\n protected override render() {\n if (this._activeEffect === `character-swap`) {\n return html`<span class=\"container\">${this.#renderCharSwap()}</span>`;\n }\n\n const effect = this._activeEffect ?? ``;\n const durStyle = this._activeEffect\n ? `animation-duration:${this.duration}ms;animation-timing-function:${this.easing}`\n : ``;\n\n return html`\n <span class=\"container\">\n ${this._outgoingText\n ? keyed(this._transitionId, html`\n <span class=\"layer outgoing ${effect}\" style=${durStyle} @animationend=${this.#onOutgoingEnd}>\n ${this._outgoingText}\n </span>\n `)\n : nothing}\n ${keyed(`c${this._transitionId}`, html`\n <span class=\"layer current ${effect}\" style=${durStyle}>\n ${this._currentText}\n </span>\n `)}\n </span>\n `;\n }\n\n static override styles = css`\n :host {\n display: inline-block;\n --transitory-label-easing: ease;\n }\n\n .container {\n display: inline-grid;\n overflow: hidden;\n }\n\n .layer {\n grid-area: 1 / 1;\n white-space: nowrap;\n }\n\n .layer.outgoing {\n pointer-events: none;\n }\n\n /* slide-right */\n .layer.current.slide-right {\n transform: translateX(-100%);\n animation: tl-slide-in-left var(--transitory-label-easing) forwards;\n }\n .layer.outgoing.slide-right {\n animation: tl-slide-out-right var(--transitory-label-easing) forwards;\n }\n\n @keyframes tl-slide-in-left {\n from { transform: translateX(-100%); }\n to { transform: translateX(0); }\n }\n @keyframes tl-slide-out-right {\n from { transform: translateX(0); }\n to { transform: translateX(100%); }\n }\n\n /* slide-left */\n .layer.current.slide-left {\n transform: translateX(100%);\n animation: tl-slide-in-right var(--transitory-label-easing) forwards;\n }\n .layer.outgoing.slide-left {\n animation: tl-slide-out-left var(--transitory-label-easing) forwards;\n }\n\n @keyframes tl-slide-in-right {\n from { transform: translateX(100%); }\n to { transform: translateX(0); }\n }\n @keyframes tl-slide-out-left {\n from { transform: translateX(0); }\n to { transform: translateX(-100%); }\n }\n\n /* slide-up */\n .layer.current.slide-up {\n transform: translateY(100%);\n animation: tl-slide-in-bottom var(--transitory-label-easing) forwards;\n }\n .layer.outgoing.slide-up {\n animation: tl-slide-out-top var(--transitory-label-easing) forwards;\n }\n\n @keyframes tl-slide-in-bottom {\n from { transform: translateY(100%); }\n to { transform: translateY(0); }\n }\n @keyframes tl-slide-out-top {\n from { transform: translateY(0); }\n to { transform: translateY(-100%); }\n }\n\n /* slide-down */\n .layer.current.slide-down {\n transform: translateY(-100%);\n animation: tl-slide-in-top var(--transitory-label-easing) forwards;\n }\n .layer.outgoing.slide-down {\n animation: tl-slide-out-bottom var(--transitory-label-easing) forwards;\n }\n\n @keyframes tl-slide-in-top {\n from { transform: translateY(-100%); }\n to { transform: translateY(0); }\n }\n @keyframes tl-slide-out-bottom {\n from { transform: translateY(0); }\n to { transform: translateY(100%); }\n }\n\n /* fade */\n .layer.current.fade {\n opacity: 0;\n animation: tl-fade-in var(--transitory-label-easing) forwards;\n }\n .layer.outgoing.fade {\n animation: tl-fade-out var(--transitory-label-easing) forwards;\n }\n\n @keyframes tl-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n @keyframes tl-fade-out {\n from { opacity: 1; }\n to { opacity: 0; }\n }\n\n /* character-swap */\n .char {\n display: inline-block;\n }\n\n .char.in {\n opacity: 0;\n animation: tl-char-in var(--transitory-label-easing) forwards;\n }\n\n .char.out {\n animation: tl-char-out var(--transitory-label-easing) forwards;\n }\n\n @keyframes tl-char-in {\n from { opacity: 0; transform: translateY(-0.3em) scale(0.8); }\n to { opacity: 1; transform: translateY(0) scale(1); }\n }\n @keyframes tl-char-out {\n from { opacity: 1; transform: translateY(0) scale(1); }\n to { opacity: 0; transform: translateY(0.3em) scale(0.8); }\n }\n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-transitory-label': TransitoryLabelElement;\n }\n}\n","interface CheckboxLike extends HTMLElement {\n checked: boolean;\n indeterminate?: boolean;\n}\n\nfunction isCheckboxLike(el: unknown): el is CheckboxLike {\n if (!(el instanceof HTMLElement))\n return false;\n return `checked` in el;\n}\n\nfunction resolveElement(elOrQuery: string | HTMLElement): HTMLElement {\n if (typeof elOrQuery === `string`) {\n const found = document.querySelector(elOrQuery);\n if (!(found instanceof HTMLElement))\n throw new Error(`Element not found or not HTMLElement: ${elOrQuery}`);\n return found;\n }\n return elOrQuery;\n}\n\nexport function monitorIndeterminate(\n targetElOrQuery: string | HTMLElement,\n watchedElsOrQueries: Array<string | HTMLElement>,\n): () => void {\n const target = resolveElement(targetElOrQuery);\n if (!isCheckboxLike(target)) {\n throw new Error(`Target element is not a checkbox-like element`);\n }\n\n const watched: CheckboxLike[] = [];\n for (const elOrQuery of watchedElsOrQueries) {\n const el = resolveElement(elOrQuery);\n if (isCheckboxLike(el)) {\n watched.push(el);\n }\n }\n\n const updateTarget = () => {\n if (watched.length === 0) {\n target.checked = false;\n target.indeterminate = false;\n return;\n }\n\n let checkedCount = 0;\n let uncheckedCount = 0;\n\n for (const el of watched) {\n if (el.checked) {\n checkedCount++;\n } else {\n uncheckedCount++;\n }\n }\n\n if (checkedCount > 0 && uncheckedCount > 0) {\n target.checked = false;\n target.indeterminate = true;\n } else if (checkedCount === watched.length) {\n target.checked = true;\n target.indeterminate = false;\n } else {\n target.checked = false;\n target.indeterminate = false;\n }\n };\n\n const handleChange = () => {\n updateTarget();\n };\n\n for (const el of watched) {\n el.addEventListener(`change`, handleChange);\n }\n\n updateTarget();\n\n return () => {\n for (const el of watched) {\n el.removeEventListener(`change`, handleChange);\n }\n };\n}\n","import \"./style.css\";\n\nexport * from './ac-text/ac-text.js';\nexport * from './ac-token/ac-token.js';\nexport * from './button/button.js';\nexport * from './button/radio-group.js';\nexport * from './button/split-button.js';\nexport * from './button/types.js';\nexport * from './checkbox/checkbox.js';\nexport * from './colour-picker/index.js';\nexport * from './common/data-controller.js';\nexport * from './common/data-provider.js';\nexport * from './common/searchable.js';\nexport * from './common/tree-component.js';\nexport * from './common/tree-data-model.js';\nexport * from './common/types.js';\nexport * from './crumbs/crumb-navigation.js';\nexport * from './crumbs/crumb-path-controller.js';\nexport * from './crumbs/crumb-path.js';\n\nexport * from './data-display/data-display.js';\nexport * from './editable-label/editable-label.js';\nexport * from './editable-label/editable-number.js';\nexport * from './grouped-item-lister/grouped-item-lister.js';\nexport * from './grouped-item-lister/tree-list-adapter.js';\nexport * from './grouped-item-lister/vertical-list-adapter.js';\nexport * from './hex/hex-editor.js';\nexport * from './icons/index.js';\nexport * from './incr-search/index.js';\nexport * from './labelled-radial-input/index.js';\nexport * from './labelled-range-input/index.js';\nexport * from './led/led.js';\nexport * as Menu from './menu';\nexport * from './miller/index.js';\nexport * from './narrowed-text/index.js';\nexport * from './panel/panel-group.js';\nexport * from './panel/panel.js';\nexport * from './plots/colour-map.js';\nexport * from './plots/data.js';\nexport * from './plots/multi-axis.js';\nexport * from './plots/plot-histogram.js';\nexport * from './plots/single-axis.js';\nexport * from './plots/xy-axis.js';\nexport * from './polar-pad/polar-pad.js';\nexport * from './radial-input/radial-input.js';\nexport * from './radial-input/types.js';\nexport * from './range-input/index.js';\nexport * from './range/range-multi.js';\nexport * from './range/range.js';\nexport * from './selecthorizontal.js';\nexport * from './slider-input/slider-input.js';\nexport * from './slider-input/types.js';\nexport * from './snap-container/snap-container.js';\nexport * from './split-layout/split-layout.js';\nexport * from './swipe/index.js';\nexport * from './tabs/tab-list-item.js';\nexport * from './tabs/tab-list.js';\nexport * from './tabs/tab-panel.js';\nexport * from './tabs/tab-panels.js';\nexport * from './timeline/index.js';\nexport * from './transitory-label/transitory-label.js';\nexport * from './tree/index.js';\nexport * from './util/checkbox.js';\nexport * from './util/tooltip.js';\nexport * from './vertical-list/vertical-list.js';\nexport * from './xy-pad/xy-pad.js';\nexport function init() {\n console.log(`Init`);\n}"],"mappings":"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"}
|