@ixfx/components 0.5.15 → 0.5.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/bundle/index.d.ts +17 -4
  2. package/bundle/index.d.ts.map +1 -1
  3. package/bundle/index.js +482 -103
  4. package/bundle/index.js.map +1 -1
  5. package/dist/ac-text.js +2 -2
  6. package/dist/checkbox.js +1 -1
  7. package/dist/{colour-picker-DGso9ZOp.js → colour-picker-DbypcEp6.js} +2 -2
  8. package/dist/{colour-picker-DGso9ZOp.js.map → colour-picker-DbypcEp6.js.map} +1 -1
  9. package/dist/colour-picker.js +1 -1
  10. package/dist/crumb-navigation-DFqTzElw.js +1149 -0
  11. package/dist/crumb-navigation-DFqTzElw.js.map +1 -0
  12. package/dist/crumbs.d.ts +16 -3
  13. package/dist/crumbs.d.ts.map +1 -1
  14. package/dist/crumbs.js +1 -821
  15. package/dist/data-display.js +1 -1
  16. package/dist/editable-label.js +1 -1
  17. package/dist/{fallbacks-pNMOMx38.js → fallbacks-DPgPEqo8.js} +51 -1
  18. package/dist/{fallbacks-pNMOMx38.js.map → fallbacks-DPgPEqo8.js.map} +1 -1
  19. package/dist/{icon-B22XVlCt.js → icon-DG9Lm3LT.js} +2 -2
  20. package/dist/{icon-B22XVlCt.js.map → icon-DG9Lm3LT.js.map} +1 -1
  21. package/dist/icons.js +1 -1
  22. package/dist/index.d.ts +1 -1
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +16 -14
  25. package/dist/index.js.map +1 -1
  26. package/dist/labelled-radial-input.js +2 -2
  27. package/dist/{menu-nuOIUD9K.js → menu-B8gE2MSo.js} +4 -4
  28. package/dist/{menu-nuOIUD9K.js.map → menu-B8gE2MSo.js.map} +1 -1
  29. package/dist/{menu-item-BBTZnjAR.js → menu-item-BYRvfyXK.js} +5 -4
  30. package/dist/menu-item-BYRvfyXK.js.map +1 -0
  31. package/dist/menu-item-DSyf9f_L.d.ts.map +1 -1
  32. package/dist/menu.js +2 -2
  33. package/dist/miller.js +1 -1
  34. package/dist/narrowed-text.js +1 -1
  35. package/dist/panel.js +2 -2
  36. package/dist/polar-pad.js +1 -1
  37. package/dist/{radial-input-DxCrt_NE.js → radial-input-CVxGH-Cp.js} +2 -2
  38. package/dist/{radial-input-DxCrt_NE.js.map → radial-input-CVxGH-Cp.js.map} +1 -1
  39. package/dist/radial-input.js +1 -1
  40. package/dist/range-input.js +1 -1
  41. package/dist/range.js +1 -1
  42. package/dist/selecthorizontal.js +1 -1
  43. package/dist/{slider-input-DFpG23bS.js → slider-input-CzmSVgm7.js} +2 -2
  44. package/dist/{slider-input-DFpG23bS.js.map → slider-input-CzmSVgm7.js.map} +1 -1
  45. package/dist/slider-input.js +1 -1
  46. package/dist/split-layout.js +1 -1
  47. package/dist/swipe.js +1 -1
  48. package/dist/{tab-list-DhkVhRQc.js → tab-list-6W5CgXix.js} +2 -2
  49. package/dist/{tab-list-DhkVhRQc.js.map → tab-list-6W5CgXix.js.map} +1 -1
  50. package/dist/{tab-list-BohmbvqF.d.ts → tab-list-ih-0I0NE.d.ts} +2 -2
  51. package/dist/{tab-list-BohmbvqF.d.ts.map → tab-list-ih-0I0NE.d.ts.map} +1 -1
  52. package/dist/tabs.d.ts +1 -1
  53. package/dist/tabs.js +1 -1
  54. package/dist/{tree-CL-txefQ.js → tree-BtiiDX1a.js} +2 -2
  55. package/dist/{tree-CL-txefQ.js.map → tree-BtiiDX1a.js.map} +1 -1
  56. package/dist/tree.js +1 -1
  57. package/dist/xy-pad.js +1 -1
  58. package/docs-user/crumbs.md +38 -9
  59. package/docs-user/tabs.md +19 -2
  60. package/package.json +1 -1
  61. package/dist/crumbs.js.map +0 -1
  62. package/dist/menu-item-BBTZnjAR.js.map +0 -1
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","#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","#wrappedElements","customElement","#emitTap","#handleClick","#handleKeyDown","#renderIcon","customElement","customElement","#scaleTo100","#userMin","#userMax","#scaleFrom100","#userClamp","#updateScale","customElement","customElement","customElement","customElement","#list","#panels","#opts","#commands","#signal","#onChange","#onReorder","#onClose","#observer","#rebuild","#tabs","#registerCommand","#unregisterCommand","#registeredCommands","#resolveTab","#selectOffset","#idsFor","#fillContent","#insertElement","#adjacentTab","#removeFromIndex","#reregisterCommand","#tabByItem","#slug","#uniqueId","#labelOf","#isSelected","#list","#unselect","#select","#findTabItem","#labelOf","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/form/form-group.ts","../src/form/form-part.ts","../src/form/form-values.ts","../src/form/form.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/notifier/notification-pill.ts","../src/notifier/pill-renderer.ts","../src/notifier/manager.ts","../src/panel/panel-group.ts","../src/util/drag.ts","../src/util/near.ts","../src/range/range-multi.ts","../src/snackbar/snackbar.ts","../src/tabs/tab-list-item.ts","../src/tabs/tab-panel.ts","../src/tabs/tab-controller.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-4, transparent);\n background: oklch(from var(--surface-4) l calc(c*0.2) h / 0.4);\n\n border: var(--border, none);\n border-radius: var(--radius-xl, 8px);\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 justify-content: center;\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: color-mix(in oklch, var(--surface-4) 80%, transparent);\n }\n\n .radio-item.selected {\n font-weight: bold;\n color: var(--color-fg-accent, var(--surface-2-text));\n background: var(--surface-5, 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 _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 // ── Lifecycle ──────────────────────────────────────────────────────────\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\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 if ((changedProperties.has(`items`) || changedProperties.has(`mode`)) && this.items && !this.itemsProvider) {\n this._applyItems(this.items);\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 /** Invokes the primary button action as if clicked by the user. */\n invoke(): boolean {\n if (this.disabled)\n return false;\n const primaryBtn = this.shadowRoot?.querySelector(`.split button.primary`);\n if (!primaryBtn)\n return false;\n if (this.mode === `switcher` && this._selectedCommand) {\n this.dispatchEvent(new CustomEvent(`menu-command`, {\n detail: { command: this._selectedCommand },\n bubbles: true,\n composed: true,\n }));\n return true;\n }\n primaryBtn.dispatchEvent(new MouseEvent(`click`, { bubbles: true }));\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 label = this.hideLabel\n ? nothing\n : html`<span class=\"button-label\"><slot></slot></span>`;\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 primaryIcon = this._selectedIcon\n ? html`<ixfx-icon class=\"button-icon\" name=\"${this._selectedIcon}\"></ixfx-icon>`\n : nothing;\n\n const primaryLabel = this.hideLabel\n ? nothing\n : html`<span class=\"button-label\">${this._selectedLabel}</span>`;\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 min-width: var(--ixfx-split-button-min-width, 0);\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 min-width: 0;\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.primary .button-label {\n flex: 0 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\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 :host([subtle]) button.primary,\n :host([subtle]) button.caret,\n :host([subtle]) button.primary:hover:not(:disabled),\n :host([subtle]) button.caret:hover:not(:disabled) {\n background: none;\n }\n\n :host([subtle]) .split {\n background: color-mix(in oklch, var(--surface-3, #ccc) 40%, transparent);\n }\n\n :host([subtle]) .split:has(button:hover:not(:disabled)),\n :host([subtle]) .split:has(button:focus-visible:not(:disabled)) {\n background: color-mix(in oklch, var(--surface-3, #ccc) 70%, transparent);\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","import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { safeCustomElement } from '../util/custom-elements.js';\nimport \"./form.css\";\n\n@safeCustomElement(`ixfx-form-group`)\nexport class FormGroupElement extends LitElement {\n @property({ type: String })\n label = ``;\n\n private _fieldset?: HTMLFieldSetElement;\n private _observer?: MutationObserver;\n\n protected override createRenderRoot() {\n return this;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this._observer = new MutationObserver(() => this._moveChildren());\n }\n\n override firstUpdated(): void {\n this._fieldset = this.querySelector(`fieldset`) ?? undefined;\n if (this._fieldset) {\n this._observer?.observe(this, { childList: true });\n this._moveChildren();\n }\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this._observer?.disconnect();\n }\n\n private _moveChildren(): void {\n if (!this._fieldset) {\n return;\n }\n\n const toMove = Array.from(this.children).filter(el => el.tagName !== `FIELDSET`);\n toMove.forEach((el) => {\n this._fieldset!.appendChild(el);\n });\n }\n\n protected override render() {\n return html`<fieldset><legend>${this.label}</legend></fieldset>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-form-group': FormGroupElement;\n }\n}","import { html, LitElement } from \"lit\";\nimport { property } from \"lit/decorators.js\";\nimport { safeCustomElement } from \"../util/custom-elements.js\";\nimport \"./form.css\";\n\nlet idCounter = 0;\n\n@safeCustomElement(`ixfx-form-part`)\nexport class FormPartElement extends LitElement {\n @property({ type: String })\n label = ``;\n\n private _id?: string;\n\n protected override createRenderRoot() {\n return this;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this._ensureId();\n }\n\n private _ensureId(): void {\n const control = this.querySelector(`input, select, textarea, [name]`) as HTMLElement | null;\n if (!control) {\n return;\n }\n\n if (!control.id) {\n this._id = `ixfx-form-part-${++idCounter}`;\n control.id = this._id;\n } else {\n this._id = control.id;\n }\n }\n\n protected override render() {\n if (!this._id) {\n this._ensureId();\n }\n\n return html`<label for=${this._id ?? ``}>${this.label}</label>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ixfx-form-part\": FormPartElement;\n }\n}","export function collectFormValues(root: ParentNode): Record<string, unknown> {\n const values: Record<string, unknown> = {};\n const elements = root.querySelectorAll(`[name]`);\n\n elements.forEach((el) => {\n const name = el.getAttribute(`name`);\n if (!name) {\n return;\n }\n\n if (el instanceof HTMLInputElement) {\n if (el.type === `radio`) {\n if (el.checked) {\n values[name] = el.value;\n }\n } else if (el.type === `checkbox`) {\n values[name] = el.checked;\n } else {\n values[name] = el.value;\n }\n } else if (el instanceof HTMLSelectElement) {\n if (el.multiple) {\n values[name] = Array.from(el.selectedOptions).map(opt => opt.value);\n } else {\n values[name] = el.value;\n }\n } else if (el instanceof HTMLTextAreaElement) {\n values[name] = el.value;\n } else if (`value` in el) {\n values[name] = (el as { value: unknown }).value;\n }\n });\n\n return values;\n}\n\nexport function applyFormValues(root: ParentNode, data: Record<string, unknown>): void {\n const elements = root.querySelectorAll(`[name]`);\n\n elements.forEach((el) => {\n const name = el.getAttribute(`name`);\n if (!name || !(name in data)) {\n return;\n }\n\n const value = data[name];\n\n if (el instanceof HTMLInputElement) {\n if (el.type === `radio`) {\n el.checked = el.value === value;\n } else if (el.type === `checkbox`) {\n el.checked = Boolean(value);\n } else {\n el.value = String(value ?? ``);\n }\n el.dispatchEvent(new Event(`input`, { bubbles: true }));\n el.dispatchEvent(new Event(`change`, { bubbles: true }));\n } else if (el instanceof HTMLSelectElement) {\n if (el.multiple && Array.isArray(value)) {\n Array.from(el.options).forEach((opt) => {\n opt.selected = value.includes(opt.value);\n });\n } else {\n el.value = String(value ?? ``);\n }\n el.dispatchEvent(new Event(`input`, { bubbles: true }));\n el.dispatchEvent(new Event(`change`, { bubbles: true }));\n } else if (el instanceof HTMLTextAreaElement) {\n el.value = String(value ?? ``);\n el.dispatchEvent(new Event(`input`, { bubbles: true }));\n el.dispatchEvent(new Event(`change`, { bubbles: true }));\n } else if (`value` in el) {\n (el as { value: unknown }).value = value;\n }\n });\n}","import { LitElement } from 'lit';\nimport { safeCustomElement } from '../util/custom-elements.js';\nimport { applyFormValues, collectFormValues } from './form-values.js';\nimport './form.css';\n\n@safeCustomElement(`ixfx-form`)\nexport class FormElement extends LitElement {\n protected override createRenderRoot() {\n return this;\n }\n\n getValues(): Record<string, unknown> {\n return collectFormValues(this);\n }\n\n setValues(data: Record<string, unknown>): void {\n applyFormValues(this, data);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-form': FormElement;\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, render } 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\nexport interface CustomCheckboxOptions {\n renderer: (checked: boolean) => unknown;\n margin?: string;\n width?: string;\n}\n\nexport interface AddItemOptions {\n /**\n * In `checked` interaction mode, adds the item without a checkbox column and\n * without the ability to be checked/selected. Equivalent to setting the\n * `not-checked` attribute on the item. Ignored outside `checked` mode.\n */\n notChecked?: boolean;\n}\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 === `sticky` || 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 /**\n * Optional renderer for the checkbox shown in `checked` interactionMode.\n * Receives the current `checked` state and returns a Lit template result.\n *\n * When set, the per-row checkbox becomes a `<span role=\"checkbox\">` whose\n * contents are whatever this returns (rendered with `lit`'s `render()`).\n * When unset, a native `<input type=\"checkbox\">` is used.\n *\n * @example\n * list.checkboxRenderer = (checked) => checked\n * ? html`<svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\"\n * fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n * stroke-linecap=\"round\" stroke-linejoin=\"round\"\n * style=\"opacity:0.5\">\n * <polyline points=\"3,8 7,12 13,4\" />\n * </svg>`\n * : html``;\n */\n @property({ attribute: false })\n checkboxRenderer: ((checked: boolean) => unknown) | CustomCheckboxOptions | 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 #wrappedElements = new Set<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 } else if (changed.has(`checkboxRenderer`) && this.interactionMode === `checked`) {\n this._syncCheckboxes();\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, options?: AddItemOptions): void {\n let el: Element;\n if (typeof item === `string`) {\n const li = document.createElement(`li`);\n li.textContent = item;\n el = li;\n } else {\n el = item;\n }\n if (options?.notChecked)\n el.setAttribute(`not-checked`, ``);\n this.appendChild(el);\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].filter(el => this._isCheckable(el)));\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 *selectedFilter(kind: `selected` | `checked` | `either`): Generator<Element> {\n const wanted = (el: Element) => {\n switch (kind) {\n case `selected`: return el.hasAttribute(`data-selected`);\n case `checked`: return el.hasAttribute(`data-checked`);\n case `either`: return el.hasAttribute(`data-selected`) || el.hasAttribute(`data-checked`);\n }\n };\n\n for (const el of this.querySelectorAll(ITEM_SELECTOR)) {\n if (this.#wrappedElements.has(el))\n continue;\n if ((el as HTMLElement).hidden)\n continue;\n if (wanted(el))\n yield el;\n }\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 if (!this._isCheckable(item))\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 if (!this._isCheckable(item))\n return;\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` && this.interactionMode !== `sticky`)\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).filter(el => this._isCheckable(el)));\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.filter(el => this._isCheckable(el)));\n if (next.size === 0)\n return;\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` && mode !== `sticky`)\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 — only the full-height checkbox column toggles.\n break;\n\n case `sticky`:\n // Every tap/click toggles — multi-select without modifier keys (touchscreens).\n this._toggleItem(item);\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 / sticky: 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 (this.#wrappedElements.has(el))\n return false;\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 // Whether an item participates in checked-mode selection. Items carrying the\n // `not-checked` attribute are skipped; outside `checked` mode it has no effect.\n // For wrapped custom elements the flag lives on the inner element, so resolve\n // through the wrapper map.\n private _isCheckable(item: Element): boolean {\n if (this.interactionMode !== `checked`)\n return true;\n const real = this.#customWrappers.get(item as HTMLLIElement) ?? item;\n return !real.hasAttribute(`not-checked`);\n }\n\n private _syncItemStates(): void {\n for (const el of this.querySelectorAll(ITEM_SELECTOR)) {\n if (this.#wrappedElements.has(el))\n continue;\n const item = this.#customWrappers.get(el as HTMLLIElement) ?? el;\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`, !item.hasAttribute(`not-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 const wantsCustom = typeof this.checkboxRenderer === `function`;\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 this.#wrappedElements.add(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 this.#wrappedElements.clear();\n }\n\n for (const el of this.querySelectorAll<HTMLElement>(`li`)) {\n const existing = el.querySelector<HTMLElement>(`.ixfx-list-checkbox`);\n if (!inCheckedMode) {\n if (existing)\n existing.remove();\n continue;\n }\n // Rows marked `not-checked` get no checkbox column and can't be checked\n const itemEl = this.#customWrappers.get(el as HTMLLIElement) ?? el;\n if (itemEl.hasAttribute(`not-checked`)) {\n if (existing)\n existing.remove();\n continue;\n }\n\n // In checked mode: if the existing checkbox is the wrong variant, drop it.\n const existingIsCustom = existing?.classList.contains(`ixfx-list-checkbox-custom`) ?? false;\n if (existing && existingIsCustom !== wantsCustom)\n existing.remove();\n\n let cb: HTMLElement | null = el.querySelector<HTMLElement>(`.ixfx-list-checkbox`);\n if (!cb) {\n if (wantsCustom) {\n const opts = this.checkboxRenderer as CustomCheckboxOptions;\n const margin = opts.margin ?? `0`;\n const width = opts.width ?? `24px`;\n cb = this._createCustomCheckbox(el, margin, width);\n } else {\n cb = this._createNativeCheckboxCell(el);\n }\n el.prepend(cb);\n }\n\n const checked = this._selectedItems.has(el);\n if (wantsCustom) {\n cb.setAttribute(`aria-checked`, String(checked));\n cb.toggleAttribute(`data-checked`, checked);\n if (this.checkboxRenderer) {\n const renderer = typeof this.checkboxRenderer === `function`\n ? this.checkboxRenderer\n : (this.checkboxRenderer as CustomCheckboxOptions).renderer;\n render(renderer(checked), cb);\n }\n } else {\n const input = cb.querySelector<HTMLInputElement>(`input.ixfx-list-checkbox`);\n if (input)\n input.checked = checked;\n }\n }\n }\n\n /**\n * Native checkbox cell: a span that stretches to the row's full cross-axis\n * (so the entire column height is a click target) with a real `<input>`\n * centred inside. The span owns the click; the input is purely visual and\n * has `pointer-events:none` so a single click produces one toggle.\n */\n private _createNativeCheckboxCell(el: HTMLElement): HTMLSpanElement {\n const cell = document.createElement(`span`);\n cell.className = `ixfx-list-checkbox ixfx-list-checkbox-native`;\n cell.style.cssText = `display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;align-self:stretch;width:18px;margin:0 6px 0 0;cursor:pointer;pointer-events:auto`;\n cell.tabIndex = -1;\n cell.setAttribute(`role`, `checkbox`);\n cell.setAttribute(`part`, `checkbox`);\n cell.addEventListener(`click`, (e) => {\n e.stopPropagation();\n this._toggleItem(el);\n });\n const input = document.createElement(`input`);\n input.type = `checkbox`;\n input.className = `ixfx-list-checkbox`;\n input.style.cssText = `pointer-events:none;cursor:pointer;margin:0`;\n cell.appendChild(input);\n return cell;\n }\n\n /**\n * Custom checkbox cell: same shape as the native cell (a stretching span)\n * so behaviour is identical. The renderer's content goes inside.\n */\n private _createCustomCheckbox(el: HTMLElement, margin: string, width: string): HTMLSpanElement {\n const span = document.createElement(`span`);\n span.className = `ixfx-list-checkbox ixfx-list-checkbox-custom`;\n span.style.cssText = `display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;align-self:stretch;width:${width};margin:${margin};cursor:pointer;pointer-events:auto`;\n span.tabIndex = -1;\n span.setAttribute(`role`, `checkbox`);\n span.setAttribute(`part`, `checkbox`);\n span.addEventListener(`click`, (e) => {\n e.stopPropagation();\n this._toggleItem(el);\n });\n return span;\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-x: hidden;\n overflow-y: auto;\n box-sizing: border-box;\n /* Scrollbar theming: end users override these CSS variables to control\n the native scrollbar (scrollbar-width, scrollbar-gutter, scrollbar-color). */\n scrollbar-width: var(--list-scrollbar-width, auto);\n scrollbar-gutter: var(--list-scrollbar-gutter, auto);\n scrollbar-color: var(--list-scrollbar-color, auto);\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 /* In checked mode, only the checkbox column is clickable; the row body\n gets a default cursor so it doesn't suggest otherwise. */\n :host([interaction-mode=\"checked\"]) ::slotted(li),\n :host([interaction-mode=\"checked\"]) ::slotted([data-list-item]) {\n cursor: default;\n }\n\n /* Wrapper inserted around custom [data-list-item] elements in checked mode.\n Provides the flex layout so the injected checkbox can stretch to the\n row's full height via align-self:stretch. */\n .ixfx-custom-row {\n display: flex;\n align-items: center;\n min-height: var(--list-item-height, 28px);\n box-sizing: border-box;\n cursor: default;\n user-select: none;\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","/* eslint-disable ts/no-unsafe-declaration-merging */\nimport type { NotificationType } from \"./types.js\";\nimport { css, html, LitElement, nothing } from \"lit\";\nimport { property } from \"lit/decorators.js\";\nimport { unsafeHTML } from \"lit/directives/unsafe-html.js\";\nimport { getIcon } from \"../icons/index.js\";\nimport { themeFallbacks } from \"../styles/fallbacks.js\";\nimport { safeCustomElement as customElement } from \"../util/custom-elements.js\";\n\nexport type PillTapDetail = { readonly id: string };\nexport type PillTapEvent = CustomEvent<PillTapDetail>;\n\nexport interface NotificationPillElementEventMap {\n 'pill-tap': PillTapEvent;\n}\n\n@customElement(`ixfx-notification-pill`)\nexport class NotificationPillElement extends LitElement {\n @property({ type: String, attribute: `notification-type` })\n notificationType: NotificationType = `info`;\n\n @property({ type: String })\n message = ``;\n\n @property({ type: String })\n icon?: string;\n\n @property({ type: Boolean, reflect: true })\n dismissing = false;\n\n @property({ type: String, attribute: `notification-id` })\n notificationId = ``;\n\n #handleClick(): void {\n this.#emitTap();\n }\n\n #handleKeyDown(e: KeyboardEvent): void {\n if (e.key === `Enter` || e.key === ` `) {\n e.preventDefault();\n this.#emitTap();\n }\n }\n\n #emitTap(): void {\n this.dispatchEvent(\n new CustomEvent<PillTapDetail>(`pill-tap`, {\n detail: { id: this.notificationId },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n #renderIcon() {\n if (!this.icon)\n return nothing;\n\n if (this.icon.startsWith(`<svg`)) {\n return html`<span class=\"pill-icon\">${unsafeHTML(this.icon)}</span>`;\n }\n\n const svg = getIcon(this.icon);\n if (!svg)\n return nothing;\n\n return html`<ixfx-icon class=\"pill-icon\" name=\"${this.icon}\"></ixfx-icon>`;\n }\n\n protected render() {\n return html`\n <button\n type=\"button\"\n class=\"pill\"\n notification-type=\"${this.notificationType}\"\n @click=${this.#handleClick}\n @keydown=${this.#handleKeyDown}\n aria-label=\"${this.message}\"\n >\n ${this.#renderIcon()}\n <span class=\"pill-message\">${this.message}</span>\n </button>\n `;\n }\n\n static styles = [\n themeFallbacks,\n css`\n :host {\n display: block;\n }\n\n .pill {\n appearance: none;\n cursor: pointer;\n font-family: var(--font-family, inherit);\n font-size: var(--text-m, 12px);\n padding: var(--space-s, 4px) var(--space-m, 8px);\n border-radius: var(--radius-l, 6px);\n border: 1px solid var(--surface-6, #666);\n display: inline-flex;\n align-items: center;\n gap: var(--space-s, 4px);\n max-width: 300px;\n box-shadow: var(--shadow-m);\n transition: opacity 0.2s ease-out, transform 0.2s ease-out;\n pointer-events: auto;\n }\n\n :host([dismissing]) .pill {\n opacity: 0;\n transform: translateX(20px);\n }\n\n .pill[notification-type=\"info\"] {\n background: var(--surface-5, #555);\n color: var(--surface-5-text, #fff);\n }\n\n .pill[notification-type=\"warning\"] {\n background: color-mix(in oklch, oklch(65% 0.18 70) 30%, var(--surface-5));\n border-color: oklch(65% 0.18 70);\n color: var(--surface-5-text, #fff);\n }\n\n .pill[notification-type=\"error\"] {\n background: var(--error, #c00);\n border-color: var(--error, #c00);\n color: var(--error-text, #fff);\n }\n\n .pill-icon {\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n }\n\n .pill-icon ixfx-icon {\n font-size: var(--text-m, 12px);\n }\n\n .pill-message {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .pill:focus-visible {\n outline: 2px solid var(--accent, #4a9);\n outline-offset: 2px;\n }\n\n @media (prefers-reduced-motion: reduce) {\n .pill {\n transition: opacity 0.1s ease-out;\n transform: none !important;\n }\n }\n `,\n ];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-notification-pill': NotificationPillElement;\n }\n}\n\nexport interface NotificationPillElement {\n addEventListener: (<K extends keyof NotificationPillElementEventMap>(\n type: K,\n listener: (this: NotificationPillElement, event: NotificationPillElementEventMap[K]) => void,\n options?: boolean | AddEventListenerOptions,\n ) => void) & ((\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ) => void);\n}\n","import type { Notification, NotificationRenderer, NotificationRendererHooks } from './types.js';\nimport './notification-pill.js';\n\nexport type PillPosition = `top-left` | `top-middle` | `top-right` | `bottom-left` | `bottom-middle` | `bottom-right`;\nexport type PillQueueDisplay = `list` | `stack`;\n\nexport interface PillSafeArea {\n readonly top?: number;\n readonly right?: number;\n readonly bottom?: number;\n readonly left?: number;\n}\n\nexport interface PillRendererOptions {\n position?: PillPosition;\n /** `list`: one row per message, oldest nearest the anchor edge. `stack`: only the front message is fully shown, the rest peek out behind it. Default `list`. */\n queueDisplay?: PillQueueDisplay;\n /** Extra margin (px) added to the default spacing on each side, letting pills avoid eg. a fixed header/footer/notch. */\n safeArea?: PillSafeArea;\n}\n\ntype PillEntry = {\n element: HTMLElement;\n notification: Notification;\n};\n\ntype Edges = { vertical: `top` | `bottom`; horizontal: `left` | `middle` | `right` };\n\nconst ROW_SPACING = 8;\nconst DEFAULT_ROW_HEIGHT = 40;\nconst STACK_OFFSET_STEP = 4;\nconst STACK_OPACITY_BASE = 0.7;\nconst STACK_OPACITY_DECAY = 0.15;\nconst STACK_OPACITY_MIN = 0.2;\n\nfunction edgesOf(position: PillPosition): Edges {\n const vertical = position.startsWith(`top`) ? `top` : `bottom`;\n const horizontal = position.endsWith(`-left`) ? `left` : position.endsWith(`-right`) ? `right` : `middle`;\n return { vertical, horizontal };\n}\n\nfunction anchorStyles(position: PillPosition, safeArea: PillSafeArea): string {\n const { vertical, horizontal } = edgesOf(position);\n const vMargin = `calc(var(--space-l, 12px) + ${(vertical === `top` ? safeArea.top : safeArea.bottom) ?? 0}px)`;\n let css = `position: fixed; `;\n css += vertical === `top` ? `top: ${vMargin}; bottom: auto; ` : `bottom: ${vMargin}; top: auto; `;\n\n if (horizontal === `left`) {\n const hMargin = `calc(var(--space-l, 12px) + ${safeArea.left ?? 0}px)`;\n css += `left: ${hMargin}; right: auto;`;\n } else if (horizontal === `right`) {\n const hMargin = `calc(var(--space-l, 12px) + ${safeArea.right ?? 0}px)`;\n css += `right: ${hMargin}; left: auto;`;\n } else {\n css += `left: 50%; right: auto;`;\n }\n return css;\n}\n\n/** Entry-animation starting transform: pills slide in from the edge they're anchored to. */\nfunction entryTransform(edges: Edges): string {\n const dy = edges.vertical === `top` ? -20 : 20;\n if (edges.horizontal === `middle`) {\n return `translateX(-50%) translate(0, ${dy}px)`;\n }\n const dx = edges.horizontal === `left` ? -20 : 20;\n return `translate(${dx}px, ${dy}px)`;\n}\n\nfunction restingTransform(edges: Edges, dx: number, dy: number): string {\n if (edges.horizontal === `middle`) {\n return `translateX(-50%) translate(${dx}px, ${dy}px)`;\n }\n return `translate(${dx}px, ${dy}px)`;\n}\n\nexport function createPillRenderer(options: PillRendererOptions = {}): NotificationRenderer {\n const position: PillPosition = options.position ?? `top-right`;\n const queueDisplay: PillQueueDisplay = options.queueDisplay ?? `list`;\n const safeArea: PillSafeArea = options.safeArea ?? {};\n const edges = edgesOf(position);\n\n let container: HTMLDivElement | null = null;\n let hooks: NotificationRendererHooks | null = null;\n const pills: Map<string, PillEntry> = new Map();\n let rowHeight = DEFAULT_ROW_HEIGHT;\n let measured = false;\n\n function ensureContainer(): HTMLDivElement {\n if (container)\n return container;\n\n container = document.createElement(`div`);\n container.className = `ixfx-notification-container`;\n container.setAttribute(`role`, `region`);\n container.setAttribute(`aria-label`, `Notifications`);\n document.body.appendChild(container);\n return container;\n }\n\n function updateAttributes(el: HTMLElement, notification: Notification): void {\n el.setAttribute(`notification-type`, notification.type);\n el.setAttribute(`message`, notification.message);\n if (notification.icon) {\n el.setAttribute(`icon`, notification.icon);\n } else {\n el.removeAttribute(`icon`);\n }\n }\n\n function createPillElement(notification: Notification): HTMLElement {\n const el = document.createElement(`ixfx-notification-pill`) as HTMLElement;\n el.setAttribute(`notification-id`, notification.id);\n el.style.cssText = anchorStyles(position, safeArea);\n updateAttributes(el, notification);\n\n el.style.opacity = `0`;\n el.style.transform = entryTransform(edges);\n\n el.addEventListener(`pill-tap`, (e: Event) => {\n const customEvent = e as CustomEvent<{ id: string }>;\n hooks?.onTap(customEvent.detail.id);\n });\n\n return el;\n }\n\n function measureRowHeight(el: HTMLElement): void {\n if (measured)\n return;\n requestAnimationFrame(() => {\n const height = el.getBoundingClientRect().height;\n if (height > 0) {\n rowHeight = height;\n measured = true;\n }\n });\n }\n\n /** Positions every currently-visible pill for its rank in `order` (index 0 = front/oldest). */\n function applyLayout(order: readonly Notification[]): void {\n const total = order.length;\n order.forEach((notification, index) => {\n const entry = pills.get(notification.id);\n if (!entry)\n return;\n\n const el = entry.element;\n let dx = 0;\n let dy = 0;\n let opacity = 1;\n let pointerEvents = `auto`;\n let filter = `none`;\n\n if (queueDisplay === `list`) {\n const step = index * (rowHeight + ROW_SPACING);\n dy = edges.vertical === `top` ? step : -step;\n } else {\n const step = index * STACK_OFFSET_STEP;\n dy = edges.vertical === `top` ? step : -step;\n dx = edges.horizontal === `left` ? step : edges.horizontal === `right` ? -step : 0;\n if (index > 0) {\n const hintIndex = index - 1;\n opacity = Math.max(STACK_OPACITY_MIN, STACK_OPACITY_BASE - hintIndex * STACK_OPACITY_DECAY);\n pointerEvents = `none`;\n filter = `saturate(0.6)`;\n }\n }\n\n el.style.transition = `opacity 0.2s ease-out, transform 0.2s ease-out`;\n el.style.opacity = `${opacity}`;\n el.style.zIndex = `${total - index}`;\n el.style.pointerEvents = pointerEvents;\n el.style.filter = filter;\n el.style.transform = restingTransform(edges, dx, dy);\n });\n }\n\n function dismiss(id: string): void {\n const entry = pills.get(id);\n if (!entry)\n return;\n\n const el = entry.element as HTMLElement;\n el.setAttribute(`dismissing`, `true`);\n\n const cleanup = () => {\n el.removeEventListener(`transitionend`, cleanup);\n el.remove();\n pills.delete(id);\n\n if (container && pills.size === 0) {\n container.remove();\n container = null;\n measured = false;\n rowHeight = DEFAULT_ROW_HEIGHT;\n }\n };\n\n el.addEventListener(`transitionend`, cleanup);\n setTimeout(cleanup, 300);\n }\n\n function setNotifications(notifications: Notification[], _queueSize: number): void {\n const cont = ensureContainer();\n const idsToKeep = new Set(notifications.map(n => n.id));\n\n for (const notification of notifications) {\n const existing = pills.get(notification.id);\n if (existing) {\n existing.notification = notification;\n updateAttributes(existing.element, notification);\n continue;\n }\n\n const el = createPillElement(notification);\n pills.set(notification.id, { element: el, notification });\n cont.appendChild(el);\n measureRowHeight(el);\n }\n\n for (const [id] of pills) {\n if (!idsToKeep.has(id)) {\n dismiss(id);\n }\n }\n\n requestAnimationFrame(() => applyLayout(notifications));\n }\n\n return {\n attach(newHooks: NotificationRendererHooks): void {\n hooks = newHooks;\n },\n\n detach(): void {\n for (const [id] of pills) {\n dismiss(id);\n }\n if (container) {\n container.remove();\n container = null;\n }\n },\n\n setNotifications,\n };\n}\n","import type {\n Notification,\n NotificationContent,\n NotificationRenderer,\n NotificationRendererHooks,\n NotifierOptions,\n} from './types.js';\nimport { createPillRenderer } from './pill-renderer.js';\n\ntype Managed = { -readonly [K in keyof Notification]: Notification[K] } & { timer: number | null; wasQueued: boolean };\n\nconst options: {\n renderer: NotificationRenderer;\n timeout: number;\n timeoutError: number;\n queue: boolean;\n queueSize: number;\n tapBehaviour: `none` | `dismiss`;\n tapHandlerDefault: NotifierOptions[`tapHandlerDefault`];\n} = {\n renderer: undefined as unknown as NotificationRenderer,\n timeout: 4000,\n timeoutError: 8000,\n queue: true,\n queueSize: 3,\n tapBehaviour: `dismiss`,\n tapHandlerDefault: undefined,\n};\n\n/** Rank-ordered, index 0 = oldest/first (next to be evicted or timed out). Length never exceeds queueSize (or 1 when queuing is disabled). */\nconst visible: Managed[] = [];\nlet renderer: NotificationRenderer | null = null;\nlet defaultRenderer: NotificationRenderer | null = null;\n\nfunction getDefaultRenderer(): NotificationRenderer {\n defaultRenderer ??= createPillRenderer({ position: `top-right` });\n return defaultRenderer;\n}\n\nfunction getRenderer(): NotificationRenderer {\n return renderer ?? getDefaultRenderer();\n}\n\nfunction syncRenderer(): void {\n getRenderer().setNotifications([ ...visible ], options.queueSize);\n}\n\nfunction clearTimer(managed: Managed): void {\n if (managed.timer !== null) {\n clearTimeout(managed.timer);\n managed.timer = null;\n }\n}\n\n/**\n * A message shown alone takes the full timeout. A message that joined a\n * non-empty queue at arrival time is permanently \"wasQueued\" and gets\n * 1/queueSize of the timeout once it reaches the front. The timer for a\n * given message is only ever started once - when it first becomes front.\n */\nfunction startTimer(managed: Managed): void {\n const base = managed.type === `error` ? options.timeoutError : options.timeout;\n const duration = managed.wasQueued ? base / options.queueSize : base;\n managed.timer = window.setTimeout(() => dismiss(managed.id), duration);\n}\n\nfunction ensureFrontTimer(): void {\n const front = visible[0];\n if (front && front.timer === null) {\n startTimer(front);\n }\n}\n\nexport const NotificationManager = {\n configure(opts: NotifierOptions): void {\n if (opts.renderer !== undefined) {\n const old = renderer;\n old?.detach?.();\n renderer = opts.renderer;\n renderer.attach({\n onTap(id: string) {\n const notification = visible.find(n => n.id === id);\n if (!notification)\n return;\n if (notification.onTap) {\n notification.onTap(id);\n } else {\n options.tapHandlerDefault?.(notification);\n }\n if (options.tapBehaviour === `dismiss`) {\n dismiss(id);\n }\n },\n });\n syncRenderer();\n }\n if (opts.timeout !== undefined)\n options.timeout = opts.timeout;\n if (opts.timeoutError !== undefined)\n options.timeoutError = opts.timeoutError;\n if (opts.queue !== undefined)\n options.queue = opts.queue;\n if (opts.queueSize !== undefined) {\n options.queueSize = Math.max(1, opts.queueSize);\n while (visible.length > options.queueSize) {\n clearTimer(visible.shift()!);\n }\n ensureFrontTimer();\n syncRenderer();\n }\n if (opts.tapBehaviour !== undefined)\n options.tapBehaviour = opts.tapBehaviour;\n if (opts.tapHandlerDefault !== undefined)\n options.tapHandlerDefault = opts.tapHandlerDefault;\n },\n\n notify(content: NotificationContent): string {\n const id = crypto.randomUUID();\n const now = Date.now();\n const icon = content.icon ?? (content.type === `error` ? `error` : undefined);\n const managed: Managed = {\n ...content,\n icon,\n id,\n createdAt: now,\n updatedAt: now,\n timer: null,\n wasQueued: false,\n };\n\n if (options.queue) {\n if (visible.length >= options.queueSize) {\n clearTimer(visible.shift()!);\n }\n managed.wasQueued = visible.length > 0;\n visible.push(managed);\n } else {\n while (visible.length > 0) {\n clearTimer(visible.pop()!);\n }\n visible.push(managed);\n }\n\n ensureFrontTimer();\n syncRenderer();\n return id;\n },\n\n update(id: string, content: Partial<NotificationContent>): void {\n const managed = visible.find(n => n.id === id);\n if (!managed)\n return;\n\n Object.assign(managed, content);\n managed.updatedAt = Date.now();\n\n if (visible[0] === managed) {\n clearTimer(managed);\n startTimer(managed);\n }\n syncRenderer();\n },\n\n dismiss(id: string): void {\n dismiss(id);\n },\n\n dismissAll(): void {\n for (const m of visible)\n clearTimer(m);\n visible.length = 0;\n syncRenderer();\n },\n};\n\nfunction dismiss(id: string): void {\n const idx = visible.findIndex(m => m.id === id);\n if (idx === -1)\n return;\n\n clearTimer(visible.splice(idx, 1)[0]);\n ensureFrontTimer();\n syncRenderer();\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 { css, html, LitElement } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { popupSurfaceStyles } from '../styles/popup.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\n\nexport type SnackbarMode = `explicit` | `manual` | `implicit`;\nexport type SnackbarPlacement = `top` | `bottom` | `left` | `right`;\nexport type SnackbarDismiss = `auto` | `manual`;\n\nlet _instanceCounter = 0;\n\n/**\n * `ixfx-snackbar` is itself the popover panel (`popover=\"auto\"` set on the host) -\n * unlike `ixfx-menu-trigger`/`ixfx-colour-picker-popup` there's no separate always-visible\n * trigger living inside the component to keep out of the top layer; the trigger is the\n * external `for` target, so the whole host can be the popover content.\n */\n@customElement(`ixfx-snackbar`)\nexport class SnackbarElement extends LitElement {\n @property({ type: String }) for = ``;\n @property({ type: String }) mode: SnackbarMode = `explicit`;\n @property({ type: String, reflect: true }) placement: SnackbarPlacement = `top`;\n @property({ type: String }) dismiss: SnackbarDismiss = `auto`;\n @property({ type: Number, attribute: `show-delay` }) showDelay = 150;\n @property({ type: Number, attribute: `hide-delay` }) hideDelay = 500;\n\n @state() private _isOpen = false;\n\n // When a close wasn't initiated by our own code (light-dismiss: click outside or\n // Escape) the popover is already closed before the click that triggered it dispatches.\n // toggle() consults this to avoid immediately re-opening via togglePopover(). The\n // timestamp window is deliberately tiny — light-dismiss and the ensuing click happen\n // in the same event dispatch, microseconds apart, so it can't swallow a later, real\n // toggle (e.g. clicking a toggle button after having dismissed the popover earlier).\n private _recentCloseAt: number | undefined;\n\n private readonly _anchorName = `--ixfx-snackbar-anchor-${++_instanceCounter}`;\n\n private _target: HTMLElement | undefined;\n private _addedTabindex = false;\n private _addedRole = false;\n private _showTimeout: number | undefined;\n private _hideTimeout: number | undefined;\n\n private readonly _onTargetClick = (): void => this.toggle();\n private readonly _onTargetKeydown = (e: KeyboardEvent): void => {\n if (e.key !== `Enter` && e.key !== ` `)\n return;\n e.preventDefault();\n this.toggle();\n };\n\n // Shared by both the target and the panel itself - hovering/focusing either keeps it open.\n private readonly _onTickleIn = (): void => this._scheduleShow();\n private readonly _onTickleOut = (): void => this._scheduleHide();\n private readonly _onPanelClick = (): void => {\n if (this.dismiss === `auto`)\n this.hide();\n };\n\n private readonly _onToggle = (e: Event): void => {\n const { newState } = e as ToggleEvent;\n this._isOpen = newState === `open`;\n if (newState === `closed` && this.contains(document.activeElement)) {\n this._target?.focus();\n }\n };\n\n private readonly _onBeforeToggle = (e: Event): void => {\n const { newState } = e as ToggleEvent;\n this._recentCloseAt = newState === `closed` ? performance.now() : undefined;\n };\n\n get isOpen(): boolean {\n return this._isOpen;\n }\n\n show(): void {\n if (!this.popover)\n return;\n try {\n this.showPopover();\n } catch {\n // already open, or popover API unsupported\n }\n }\n\n hide(): void {\n if (!this.popover)\n return;\n try {\n this.hidePopover();\n } catch {\n // already closed\n }\n }\n\n toggle(): void {\n if (!this.popover)\n return;\n // If the popover was just closed by light-dismiss as part of this same click\n // (click outside closes an `auto` popover before the click event dispatches),\n // togglePopover() would re-open it. Honour the dismiss instead: the popover is\n // already closed, so the toggle is a no-op.\n if (this._recentCloseAt !== undefined && performance.now() - this._recentCloseAt < 50) {\n this._recentCloseAt = undefined;\n return;\n }\n try {\n this.togglePopover();\n } catch {\n // popover API unsupported\n }\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (!this.hasAttribute(`popover`))\n this.popover = `auto`;\n this.classList.add(`popup-surface`);\n this.addEventListener(`toggle`, this._onToggle);\n this.addEventListener(`beforetoggle`, this._onBeforeToggle);\n this.addEventListener(`click`, this._onPanelClick);\n this.style.setProperty(`position-anchor`, this._anchorName);\n this._attachToTarget();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener(`toggle`, this._onToggle);\n this.removeEventListener(`beforetoggle`, this._onBeforeToggle);\n this.removeEventListener(`click`, this._onPanelClick);\n this._detachFromTarget();\n this._cancelShow();\n this._cancelHide();\n }\n\n override updated(changed: Map<PropertyKey, unknown>): void {\n super.updated(changed);\n if (changed.has(`for`) || changed.has(`mode`)) {\n this._attachToTarget();\n }\n }\n\n private _resolveTarget(): HTMLElement | undefined {\n if (!this.for)\n return undefined;\n const root = this.getRootNode() as Document | ShadowRoot;\n return root.getElementById(this.for) ?? undefined;\n }\n\n private _attachToTarget(): void {\n this._detachFromTarget();\n\n const target = this._resolveTarget();\n if (!target) {\n if (this.for)\n console.warn(`ixfx-snackbar: no element found with id \"${this.for}\"`);\n return;\n }\n this._target = target;\n target.style.setProperty(`anchor-name`, this._anchorName);\n\n if (this.mode === `explicit`) {\n const alreadyFocusable = target.tabIndex >= 0;\n if (!alreadyFocusable) {\n target.setAttribute(`tabindex`, `0`);\n this._addedTabindex = true;\n }\n if (!target.hasAttribute(`role`) && !alreadyFocusable) {\n target.setAttribute(`role`, `button`);\n this._addedRole = true;\n }\n target.setAttribute(`aria-haspopup`, `true`);\n target.addEventListener(`click`, this._onTargetClick);\n // Native interactive elements (button, a[href], ...) already turn Enter/Space into a\n // click; a target we just made focusable via role=\"button\" does not get that for free.\n if (!alreadyFocusable)\n target.addEventListener(`keydown`, this._onTargetKeydown);\n } else if (this.mode === `implicit`) {\n target.addEventListener(`pointerenter`, this._onTickleIn);\n target.addEventListener(`focus`, this._onTickleIn);\n target.addEventListener(`pointerleave`, this._onTickleOut);\n target.addEventListener(`blur`, this._onTickleOut);\n this.addEventListener(`pointerenter`, this._onTickleIn);\n this.addEventListener(`focusin`, this._onTickleIn);\n this.addEventListener(`pointerleave`, this._onTickleOut);\n this.addEventListener(`focusout`, this._onTickleOut);\n }\n }\n\n private _detachFromTarget(): void {\n const target = this._target;\n if (!target)\n return;\n\n target.style.removeProperty(`anchor-name`);\n if (this._addedTabindex) {\n target.removeAttribute(`tabindex`);\n this._addedTabindex = false;\n }\n if (this._addedRole) {\n target.removeAttribute(`role`);\n this._addedRole = false;\n }\n target.removeAttribute(`aria-haspopup`);\n target.removeEventListener(`click`, this._onTargetClick);\n target.removeEventListener(`keydown`, this._onTargetKeydown);\n target.removeEventListener(`pointerenter`, this._onTickleIn);\n target.removeEventListener(`focus`, this._onTickleIn);\n target.removeEventListener(`pointerleave`, this._onTickleOut);\n target.removeEventListener(`blur`, this._onTickleOut);\n this.removeEventListener(`pointerenter`, this._onTickleIn);\n this.removeEventListener(`focusin`, this._onTickleIn);\n this.removeEventListener(`pointerleave`, this._onTickleOut);\n this.removeEventListener(`focusout`, this._onTickleOut);\n this._target = undefined;\n }\n\n private _scheduleShow(): void {\n this._cancelHide();\n this._cancelShow();\n if (this.showDelay <= 0) {\n this.show();\n return;\n }\n this._showTimeout = window.setTimeout(() => this.show(), this.showDelay);\n }\n\n private _scheduleHide(): void {\n this._cancelShow();\n this._cancelHide();\n if (this.hideDelay <= 0) {\n this.hide();\n return;\n }\n this._hideTimeout = window.setTimeout(() => this.hide(), this.hideDelay);\n }\n\n private _cancelShow(): void {\n if (this._showTimeout !== undefined) {\n window.clearTimeout(this._showTimeout);\n this._showTimeout = undefined;\n }\n }\n\n private _cancelHide(): void {\n if (this._hideTimeout !== undefined) {\n window.clearTimeout(this._hideTimeout);\n this._hideTimeout = undefined;\n }\n }\n\n static override styles = [\n themeFallbacks,\n popupSurfaceStyles,\n css`\n :host {\n display: flex;\n align-items: center;\n gap: var(--space-s);\n padding: var(--space-s);\n\n position: fixed;\n inset: unset;\n margin: 0;\n z-index: 100;\n position-try-fallbacks: flip-block, flip-inline, flip-block flip-inline;\n\n opacity: 0;\n scale: 0.97;\n pointer-events: none;\n transition: opacity 0.12s ease-out, scale 0.12s ease-out,\n display 0.12s allow-discrete, overlay 0.12s allow-discrete;\n }\n\n :host(:popover-open) {\n opacity: 1;\n scale: 1;\n pointer-events: auto;\n }\n\n @starting-style {\n :host(:popover-open) {\n opacity: 0;\n scale: 0.97;\n }\n }\n\n :host([placement=\"top\"]) {\n position-area: block-start;\n margin-block-end: var(--space-s);\n }\n\n :host([placement=\"bottom\"]) {\n position-area: block-end;\n margin-block-start: var(--space-s);\n }\n\n :host([placement=\"left\"]) {\n position-area: inline-start;\n margin-inline-end: var(--space-s);\n }\n\n :host([placement=\"right\"]) {\n position-area: inline-end;\n margin-inline-start: var(--space-s);\n }\n `,\n ];\n\n protected override render() {\n return html`<slot></slot>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-snackbar': SnackbarElement;\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-tab-color: var(--ixfx-selected-tab-color, var(--surface-2-text));\n --selected-tab-border-width: var(--ixfx-selected-tab-border-width, 1px);\n --selected-tab-weight: var(--ixfx-selected-tab-weight, bold);\n --selected-background: var(--ixfx-tab-selected-background, var(--surface-5));\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-tab-border-width) solid transparent;\n }\n\n :host([selected]) > div {\n color: var(--selected-tab-color);\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 background: var(--selected-background);\n font-weight: var(--selected-tab-weight);\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 { CommandRegistry } from '@clinth/ui-commands';\nimport type { TabListItemElement } from './tab-list-item.js';\nimport type { TabListChangeDetail, TabListElement } from './tab-list.js';\nimport type { TabPanelElement } from './tab-panel.js';\nimport type { TabPanelsElement } from './tab-panels.js';\nimport './tab-list-item.js';\nimport './tab-panel.js';\n\n/** A single tab managed by a {@link TabController}. */\nexport type Tab = {\n /** id of the `ixfx-tab-list-item` */\n readonly id: string;\n /** id of the `ixfx-tab-panel` (the item's `for` value) */\n readonly forId: string;\n readonly item: TabListItemElement;\n readonly panel: TabPanelElement;\n label: string;\n iconName?: string;\n};\n\nexport type TabAddOptions = {\n label: string;\n /** id for the tab item; derived from the label if omitted */\n id?: string;\n /** id for the panel (and the item's `for`); derived from the label if omitted */\n forId?: string;\n iconName?: string;\n description?: string;\n closeable?: boolean;\n /** Elements to slot into the tab's `slot=\"toolbar\"` */\n toolbar?: HTMLElement[];\n /** Panel content: a node, text, or a callback given the fresh panel element */\n content?: Node | string | ((panel: TabPanelElement) => void);\n /** Select the new tab immediately (default `true`) */\n select?: boolean;\n /** Insertion index among existing tabs (default: append) */\n index?: number;\n};\n\nexport type TabControllerOptions = {\n /**\n * When provided, a command is registered per tab (id = tab id). Invoking\n * `commands.invoke(id)` selects the tab.\n */\n commands?: CommandRegistry;\n /** Fired after a tab becomes selected (via click or programmatic select) */\n onSelect?: (tab: Tab, previous: Tab | undefined) => void;\n onAdd?: (tab: Tab) => void;\n onRemove?: (tab: Tab) => void;\n onReorder?: (tabs: Tab[]) => void;\n};\n\n/**\n * Connects an `ixfx-tab-list` to an `ixfx-tab-panels` container, handling the\n * wiring between them (header clicks show the matching panel, closing a tab\n * removes its panel, etc.) and offering an API to select, add, remove, rename\n * and reorder tabs.\n *\n * @example\n * ```ts\n * const ctrl = new TabController(\n * document.querySelector('ixfx-tab-list'),\n * document.querySelector('ixfx-tab-panels'),\n * );\n * ctrl.connect();\n *\n * ctrl.addTab({ label: 'Console', content: 'Console panel' });\n * ctrl.selectTab('Console');\n * ```\n */\nexport class TabController {\n readonly #list: TabListElement;\n readonly #panels: TabPanelsElement;\n readonly #opts: TabControllerOptions;\n\n #tabs: Tab[] = [];\n #signal: AbortController | undefined;\n #observer: MutationObserver | undefined;\n #commands: CommandRegistry | undefined;\n #registeredCommands = new Set<string>();\n\n constructor(\n list: TabListElement,\n panels: TabPanelsElement,\n options: TabControllerOptions = {},\n ) {\n this.#list = list;\n this.#panels = panels;\n this.#opts = options;\n this.#commands = options.commands;\n }\n\n connect(): void {\n this.disconnect();\n this.#signal = new AbortController();\n const { signal } = this.#signal;\n\n this.#list.addEventListener(`change`, this.#onChange, { signal });\n this.#list.addEventListener(`reorder`, this.#onReorder, { signal });\n this.#list.addEventListener(`close`, this.#onClose, { signal });\n\n this.#observer = new MutationObserver(() => this.#rebuild());\n this.#observer.observe(this.#list, { childList: true });\n this.#observer.observe(this.#panels, { childList: true });\n\n this.#rebuild();\n\n // Establish the list↔panels association and mirror the initially-selected\n // header into the panels (its internal Promise-based initial sync).\n this.#panels.syncWithList(this.#list);\n\n for (const tab of this.#tabs) {\n this.#registerCommand(tab);\n }\n }\n\n disconnect(): void {\n this.#signal?.abort();\n this.#signal = undefined;\n this.#observer?.disconnect();\n this.#observer = undefined;\n\n for (const tab of this.#tabs) {\n this.#unregisterCommand(tab);\n }\n this.#registeredCommands.clear();\n this.#tabs = [];\n }\n\n // ── Selection ────────────────────────────────────────────────────────\n\n /**\n * Select a tab as if it was clicked — activates the header (deactivating the\n * others) and shows its panel.\n *\n * `sel` may be a tab id, the panel id its `for` points at, its label text\n * (case-insensitive), or the tab item element itself.\n *\n * Returns true if a tab was found.\n */\n selectTab(sel: string | TabListItemElement): boolean {\n const tab = this.#resolveTab(sel);\n if (!tab)\n return false;\n\n const previous = this.getSelected();\n if (previous?.id === tab.id) {\n // Header already active — still ensure the content panel is shown.\n this.#panels.selectPanel(tab.forId);\n return true;\n }\n\n this.#list.selectElement(tab.item);\n this.#panels.selectPanel(tab.forId);\n this.#opts.onSelect?.(tab, previous);\n return true;\n }\n\n selectNext(): boolean {\n return this.#selectOffset(1);\n }\n\n selectPrevious(): boolean {\n return this.#selectOffset(-1);\n }\n\n getSelected(): Tab | undefined {\n return this.#tabs.find(t => t.item.hasAttribute(`selected`));\n }\n\n getTabs(): Tab[] {\n return [...this.#tabs];\n }\n\n getTab(id: string): Tab | undefined {\n return this.#tabs.find(t => t.id === id);\n }\n\n // ── Mutation ─────────────────────────────────────────────────────────\n\n addTab(opts: TabAddOptions): Tab {\n const { id, forId } = this.#idsFor(opts);\n\n const item = document.createElement(`ixfx-tab-list-item`) as TabListItemElement;\n item.id = id;\n item.setAttribute(`for`, forId);\n item.closeable = opts.closeable ?? true;\n item.append(opts.label);\n if (opts.iconName) {\n item.iconName = opts.iconName;\n }\n if (opts.description) {\n item.description = opts.description;\n }\n for (const el of opts.toolbar ?? []) {\n el.slot = `toolbar`;\n item.append(el);\n }\n\n const panel = document.createElement(`ixfx-tab-panel`) as TabPanelElement;\n panel.id = forId;\n if (opts.content !== undefined) {\n this.#fillContent(panel, opts.content);\n }\n\n const index = Math.max(0, Math.min(opts.index ?? this.#tabs.length, this.#tabs.length));\n this.#insertElement(this.#list, item, index);\n this.#insertElement(this.#panels, panel, index);\n\n const tab: Tab = {\n id,\n forId,\n item,\n panel,\n label: opts.label,\n iconName: opts.iconName,\n };\n this.#tabs.splice(index, 0, tab);\n\n this.#registerCommand(tab);\n this.#opts.onAdd?.(tab);\n\n if (opts.select ?? true) {\n this.selectTab(id);\n }\n return tab;\n }\n\n removeTab(sel: string | TabListItemElement): boolean {\n const tab = this.#resolveTab(sel);\n if (!tab)\n return false;\n\n const index = this.#tabs.indexOf(tab);\n const wasSelected = tab.item.hasAttribute(`selected`);\n const adjacent = wasSelected ? this.#adjacentTab(index) : undefined;\n\n tab.item.remove();\n tab.panel.remove();\n this.#removeFromIndex(tab);\n this.#unregisterCommand(tab);\n this.#opts.onRemove?.(tab);\n\n if (adjacent) {\n this.selectTab(adjacent.id);\n }\n return true;\n }\n\n renameTab(sel: string | TabListItemElement, label: string): boolean {\n const tab = this.#resolveTab(sel);\n if (!tab)\n return false;\n\n for (const child of [...tab.item.childNodes]) {\n const isToolbar = child.nodeType === Node.ELEMENT_NODE\n && (child as HTMLElement).slot === `toolbar`;\n if (isToolbar)\n continue;\n tab.item.removeChild(child);\n }\n tab.item.prepend(label);\n tab.label = label;\n\n this.#reregisterCommand(tab);\n return true;\n }\n\n setTabIcon(sel: string | TabListItemElement, iconName?: string): boolean {\n const tab = this.#resolveTab(sel);\n if (!tab)\n return false;\n\n if (iconName) {\n tab.item.iconName = iconName;\n tab.iconName = iconName;\n } else {\n tab.item.iconName = undefined;\n tab.item.removeAttribute(`icon-name`);\n tab.iconName = undefined;\n }\n return true;\n }\n\n // ── Event handlers ───────────────────────────────────────────────────\n\n #onChange = (event: Event): void => {\n const detail = (event as CustomEvent<TabListChangeDetail>).detail;\n this.#panels.selectPanel(detail.for);\n\n const tab = this.#tabs.find(t => t.forId === detail.for);\n if (!tab)\n return;\n const previous = detail.previous\n ? this.#tabs.find(t => t.id === detail.previous)\n : undefined;\n this.#opts.onSelect?.(tab, previous);\n };\n\n #onReorder = (): void => {\n this.#rebuild();\n this.#opts.onReorder?.(this.#tabs);\n };\n\n #onClose = (event: Event): void => {\n const target = event.target as HTMLElement | null;\n const item = target?.closest(`ixfx-tab-list-item`) as TabListItemElement | null;\n const tab = item ? this.#tabByItem(item) : undefined;\n if (!tab)\n return;\n\n const index = this.#tabs.indexOf(tab);\n const wasSelected = tab.item.hasAttribute(`selected`);\n const adjacent = wasSelected ? this.#adjacentTab(index) : undefined;\n\n // The item removed itself (tab-list-item close handler); remove the panel\n // and drop the tab from the index.\n tab.panel.remove();\n this.#removeFromIndex(tab);\n this.#unregisterCommand(tab);\n this.#opts.onRemove?.(tab);\n\n if (adjacent) {\n this.selectTab(adjacent.id);\n }\n };\n\n // ── Internal helpers ─────────────────────────────────────────────────\n\n #selectOffset(offset: number): boolean {\n const tabs = this.#tabs;\n if (tabs.length === 0)\n return false;\n const current = this.getSelected();\n const index = current ? tabs.indexOf(current) : offset === 1 ? -1 : 0;\n const next = (index + offset + tabs.length) % tabs.length;\n return this.selectTab(tabs[next].id);\n }\n\n #resolveTab(sel: string | TabListItemElement): Tab | undefined {\n if (typeof sel !== `string`) {\n return this.#tabs.find(t => t.item === sel);\n }\n const label = sel.trim().toLowerCase();\n return this.#tabs.find(t => t.id === sel)\n ?? this.#tabs.find(t => t.forId === sel)\n ?? this.#tabs.find(t => t.label.toLowerCase() === label);\n }\n\n #tabByItem(item: TabListItemElement): Tab | undefined {\n return this.#tabs.find(t => t.item === item);\n }\n\n #adjacentTab(index: number): Tab | undefined {\n const tabs = this.#tabs;\n if (tabs.length <= 1)\n return undefined;\n return tabs[index + 1] ?? tabs[index - 1];\n }\n\n #removeFromIndex(tab: Tab): void {\n const index = this.#tabs.indexOf(tab);\n if (index >= 0) {\n this.#tabs.splice(index, 1);\n }\n }\n\n #idsFor(opts: TabAddOptions): { id: string; forId: string } {\n const base = this.#slug(opts.label) || `tab`;\n return {\n id: opts.id ?? this.#uniqueId(`tab-${base}`),\n forId: opts.forId ?? this.#uniqueId(`panel-${base}`),\n };\n }\n\n #slug(value: string): string {\n return value.toLowerCase()\n .replace(/[^a-z0-9]+/g, `-`)\n .replace(/^-+|-+$/g, ``);\n }\n\n #uniqueId(base: string): string {\n let candidate = base;\n let n = 2;\n while (document.getElementById(candidate)) {\n candidate = `${base}-${n++}`;\n }\n return candidate;\n }\n\n #fillContent(panel: TabPanelElement, content: Node | string | ((panel: TabPanelElement) => void)): void {\n if (typeof content === `function`) {\n content(panel);\n return;\n }\n if (typeof content === `string`) {\n panel.append(document.createTextNode(content));\n return;\n }\n panel.append(content);\n }\n\n #insertElement(container: HTMLElement, el: HTMLElement, index: number): void {\n const children = Array.from(container.children);\n container.insertBefore(el, children[index] ?? null);\n }\n\n #rebuild(): void {\n const panels = new Map<string, TabPanelElement>();\n for (const el of this.#panels.querySelectorAll(`ixfx-tab-panel`)) {\n panels.set(el.id, el as TabPanelElement);\n }\n\n const tabs: Tab[] = [];\n for (const item of this.#list.querySelectorAll(`ixfx-tab-list-item`) as NodeListOf<TabListItemElement>) {\n const forId = item.getAttribute(`for`) ?? ``;\n const panel = panels.get(forId);\n if (!panel)\n continue;\n tabs.push({\n id: item.id || forId,\n forId,\n item,\n panel,\n label: this.#labelOf(item),\n iconName: item.iconName,\n });\n }\n this.#tabs = tabs;\n }\n\n /** The tab's visible label text, excluding any `slot=\"toolbar\"` content. */\n #labelOf(item: TabListItemElement): string {\n const clone = item.cloneNode(true) as HTMLElement;\n clone.querySelectorAll(`[slot=\"toolbar\"]`).forEach(el => el.remove());\n return (clone.textContent ?? ``).trim();\n }\n\n #registerCommand(tab: Tab): void {\n if (!this.#commands)\n return;\n if (tab.item.commandActive)\n return;\n if (this.#commands.has(tab.id))\n return;\n this.#commands.register({\n id: tab.id,\n label: tab.label,\n description: tab.item.description ?? tab.label,\n icon: tab.iconName,\n execute: () => {\n this.selectTab(tab.id);\n },\n });\n this.#registeredCommands.add(tab.id);\n }\n\n #unregisterCommand(tab: Tab): void {\n if (!this.#commands)\n return;\n if (this.#registeredCommands.has(tab.id)) {\n this.#commands.unregister(tab.id);\n this.#registeredCommands.delete(tab.id);\n }\n }\n\n #reregisterCommand(tab: Tab): void {\n if (!this.#commands || !this.#registeredCommands.has(tab.id))\n return;\n const existing = this.#commands.get(tab.id);\n if (!existing)\n return;\n this.#commands.unregister(tab.id);\n this.#commands.register({ ...existing, label: tab.label });\n }\n}\n","import type { TabListItemElement } from \"./tab-list-item.js\";\nimport 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 * The `ixfx-tab-list` this panels element is associated with, established by\n * `syncWithList()`. Used by `selectTab()` to activate the matching header.\n */\n #list: TabListElement | undefined;\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 this.#list = el;\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 /**\n * Select a tab as if the user clicked it — activates the matching header in\n * the associated `ixfx-tab-list` (deactivating the others) and shows its\n * panel.\n *\n * `nameOrTitle` may be the label text of a tab (e.g. `'Home'`, matched\n * case-insensitively) or the panel id its `for` attribute points at\n * (e.g. `'panel-home'`). If no tab matches, `nameOrTitle` is tried directly\n * as a panel id.\n *\n * The tab list must first be associated via `syncWithList()` for the header\n * to be activated; panel selection works regardless.\n *\n * Returns true if a panel was found and selected.\n */\n selectTab(nameOrTitle: string): boolean {\n const item = this.#findTabItem(nameOrTitle);\n if (item) {\n this.#list?.selectElement(item);\n return this.selectPanel(item.getAttribute(`for`) ?? ``) === true;\n }\n // Fall back to treating the value as a panel id directly.\n return this.selectPanel(nameOrTitle) === true;\n }\n\n #findTabItem(nameOrTitle: string): TabListItemElement | undefined {\n const list = this.#list;\n if (!list)\n return undefined;\n const items = Array.from(list.querySelectorAll(`ixfx-tab-list-item`)) as TabListItemElement[];\n\n // Prefer an exact match against the `for` attribute (panel id).\n for (const item of items) {\n if (item.getAttribute(`for`) === nameOrTitle)\n return item;\n }\n\n // Otherwise match on the tab's label text, case-insensitively.\n const label = nameOrTitle.trim().toLowerCase();\n for (const item of items) {\n if (this.#labelOf(item).toLowerCase() === label)\n return item;\n }\n return undefined;\n }\n\n /** The tab's visible label text, excluding any `slot=\"toolbar\"` content. */\n #labelOf(item: TabListItemElement): string {\n const clone = item.cloneNode(true) as HTMLElement;\n clone.querySelectorAll(`[slot=\"toolbar\"]`).forEach(el => el.remove());\n return (clone.textContent ?? ``).trim();\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 './form/form-group.js';\nexport * from './form/form-part.js';\nexport * from './form/form.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 './notifier/notification-pill.js';\nexport * from './notifier/manager.js';\nexport * from './notifier/pill-renderer.js';\nexport * from './notifier/types.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 './snackbar/snackbar.js';\nexport * from './snap-container/snap-container.js';\nexport * from './split-layout/split-layout.js';\nexport * from './swipe/index.js';\nexport * from './tabs/tab-controller.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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"}
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","#wrappedElements","customElement","#emitTap","#handleClick","#handleKeyDown","#renderIcon","customElement","customElement","#scaleTo100","#userMin","#userMax","#scaleFrom100","#userClamp","#updateScale","customElement","customElement","customElement","customElement","#list","#panels","#opts","#commands","#signal","#onChange","#onReorder","#onClose","#observer","#rebuild","#tabs","#registerCommand","#unregisterCommand","#registeredCommands","#resolveTab","#selectOffset","#idsFor","#fillContent","#insertElement","#adjacentTab","#removeFromIndex","#reregisterCommand","#tabByItem","#slug","#uniqueId","#labelOf","#isSelected","#list","#unselect","#select","#findTabItem","#labelOf","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/form/form-group.ts","../src/form/form-part.ts","../src/form/form-values.ts","../src/form/form.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/notifier/notification-pill.ts","../src/notifier/pill-renderer.ts","../src/notifier/manager.ts","../src/panel/panel-group.ts","../src/util/drag.ts","../src/util/near.ts","../src/range/range-multi.ts","../src/snackbar/snackbar.ts","../src/tabs/tab-list-item.ts","../src/tabs/tab-panel.ts","../src/tabs/tab-controller.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-4, transparent);\n background: oklch(from var(--surface-4) l calc(c*0.2) h / 0.4);\n\n border: var(--border, none);\n border-radius: var(--radius-xl, 8px);\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 justify-content: center;\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: color-mix(in oklch, var(--surface-4) 80%, transparent);\n }\n\n .radio-item.selected {\n font-weight: bold;\n color: var(--color-fg-accent, var(--surface-2-text));\n background: var(--surface-5, 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 _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 // ── Lifecycle ──────────────────────────────────────────────────────────\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\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 if ((changedProperties.has(`items`) || changedProperties.has(`mode`)) && this.items && !this.itemsProvider) {\n this._applyItems(this.items);\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 /** Invokes the primary button action as if clicked by the user. */\n invoke(): boolean {\n if (this.disabled)\n return false;\n const primaryBtn = this.shadowRoot?.querySelector(`.split button.primary`);\n if (!primaryBtn)\n return false;\n if (this.mode === `switcher` && this._selectedCommand) {\n this.dispatchEvent(new CustomEvent(`menu-command`, {\n detail: { command: this._selectedCommand },\n bubbles: true,\n composed: true,\n }));\n return true;\n }\n primaryBtn.dispatchEvent(new MouseEvent(`click`, { bubbles: true }));\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 label = this.hideLabel\n ? nothing\n : html`<span class=\"button-label\"><slot></slot></span>`;\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 primaryIcon = this._selectedIcon\n ? html`<ixfx-icon class=\"button-icon\" name=\"${this._selectedIcon}\"></ixfx-icon>`\n : nothing;\n\n const primaryLabel = this.hideLabel\n ? nothing\n : html`<span class=\"button-label\">${this._selectedLabel}</span>`;\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 min-width: var(--ixfx-split-button-min-width, 0);\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 min-width: 0;\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.primary .button-label {\n flex: 0 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\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 :host([subtle]) button.primary,\n :host([subtle]) button.caret,\n :host([subtle]) button.primary:hover:not(:disabled),\n :host([subtle]) button.caret:hover:not(:disabled) {\n background: none;\n }\n\n :host([subtle]) .split {\n background: color-mix(in oklch, var(--surface-3, #ccc) 40%, transparent);\n }\n\n :host([subtle]) .split:has(button:hover:not(:disabled)),\n :host([subtle]) .split:has(button:focus-visible:not(:disabled)) {\n background: color-mix(in oklch, var(--surface-3, #ccc) 70%, transparent);\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 { scrollFadeStyles } from '../styles/scroll-fade.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 scroll-fade-x\" 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, scrollFadeStyles(`x`), 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","import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { safeCustomElement } from '../util/custom-elements.js';\nimport \"./form.css\";\n\n@safeCustomElement(`ixfx-form-group`)\nexport class FormGroupElement extends LitElement {\n @property({ type: String })\n label = ``;\n\n private _fieldset?: HTMLFieldSetElement;\n private _observer?: MutationObserver;\n\n protected override createRenderRoot() {\n return this;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this._observer = new MutationObserver(() => this._moveChildren());\n }\n\n override firstUpdated(): void {\n this._fieldset = this.querySelector(`fieldset`) ?? undefined;\n if (this._fieldset) {\n this._observer?.observe(this, { childList: true });\n this._moveChildren();\n }\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this._observer?.disconnect();\n }\n\n private _moveChildren(): void {\n if (!this._fieldset) {\n return;\n }\n\n const toMove = Array.from(this.children).filter(el => el.tagName !== `FIELDSET`);\n toMove.forEach((el) => {\n this._fieldset!.appendChild(el);\n });\n }\n\n protected override render() {\n return html`<fieldset><legend>${this.label}</legend></fieldset>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-form-group': FormGroupElement;\n }\n}","import { html, LitElement } from \"lit\";\nimport { property } from \"lit/decorators.js\";\nimport { safeCustomElement } from \"../util/custom-elements.js\";\nimport \"./form.css\";\n\nlet idCounter = 0;\n\n@safeCustomElement(`ixfx-form-part`)\nexport class FormPartElement extends LitElement {\n @property({ type: String })\n label = ``;\n\n private _id?: string;\n\n protected override createRenderRoot() {\n return this;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this._ensureId();\n }\n\n private _ensureId(): void {\n const control = this.querySelector(`input, select, textarea, [name]`) as HTMLElement | null;\n if (!control) {\n return;\n }\n\n if (!control.id) {\n this._id = `ixfx-form-part-${++idCounter}`;\n control.id = this._id;\n } else {\n this._id = control.id;\n }\n }\n\n protected override render() {\n if (!this._id) {\n this._ensureId();\n }\n\n return html`<label for=${this._id ?? ``}>${this.label}</label>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ixfx-form-part\": FormPartElement;\n }\n}","export function collectFormValues(root: ParentNode): Record<string, unknown> {\n const values: Record<string, unknown> = {};\n const elements = root.querySelectorAll(`[name]`);\n\n elements.forEach((el) => {\n const name = el.getAttribute(`name`);\n if (!name) {\n return;\n }\n\n if (el instanceof HTMLInputElement) {\n if (el.type === `radio`) {\n if (el.checked) {\n values[name] = el.value;\n }\n } else if (el.type === `checkbox`) {\n values[name] = el.checked;\n } else {\n values[name] = el.value;\n }\n } else if (el instanceof HTMLSelectElement) {\n if (el.multiple) {\n values[name] = Array.from(el.selectedOptions).map(opt => opt.value);\n } else {\n values[name] = el.value;\n }\n } else if (el instanceof HTMLTextAreaElement) {\n values[name] = el.value;\n } else if (`value` in el) {\n values[name] = (el as { value: unknown }).value;\n }\n });\n\n return values;\n}\n\nexport function applyFormValues(root: ParentNode, data: Record<string, unknown>): void {\n const elements = root.querySelectorAll(`[name]`);\n\n elements.forEach((el) => {\n const name = el.getAttribute(`name`);\n if (!name || !(name in data)) {\n return;\n }\n\n const value = data[name];\n\n if (el instanceof HTMLInputElement) {\n if (el.type === `radio`) {\n el.checked = el.value === value;\n } else if (el.type === `checkbox`) {\n el.checked = Boolean(value);\n } else {\n el.value = String(value ?? ``);\n }\n el.dispatchEvent(new Event(`input`, { bubbles: true }));\n el.dispatchEvent(new Event(`change`, { bubbles: true }));\n } else if (el instanceof HTMLSelectElement) {\n if (el.multiple && Array.isArray(value)) {\n Array.from(el.options).forEach((opt) => {\n opt.selected = value.includes(opt.value);\n });\n } else {\n el.value = String(value ?? ``);\n }\n el.dispatchEvent(new Event(`input`, { bubbles: true }));\n el.dispatchEvent(new Event(`change`, { bubbles: true }));\n } else if (el instanceof HTMLTextAreaElement) {\n el.value = String(value ?? ``);\n el.dispatchEvent(new Event(`input`, { bubbles: true }));\n el.dispatchEvent(new Event(`change`, { bubbles: true }));\n } else if (`value` in el) {\n (el as { value: unknown }).value = value;\n }\n });\n}","import { LitElement } from 'lit';\nimport { safeCustomElement } from '../util/custom-elements.js';\nimport { applyFormValues, collectFormValues } from './form-values.js';\nimport './form.css';\n\n@safeCustomElement(`ixfx-form`)\nexport class FormElement extends LitElement {\n protected override createRenderRoot() {\n return this;\n }\n\n getValues(): Record<string, unknown> {\n return collectFormValues(this);\n }\n\n setValues(data: Record<string, unknown>): void {\n applyFormValues(this, data);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-form': FormElement;\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, render } 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\nexport interface CustomCheckboxOptions {\n renderer: (checked: boolean) => unknown;\n margin?: string;\n width?: string;\n}\n\nexport interface AddItemOptions {\n /**\n * In `checked` interaction mode, adds the item without a checkbox column and\n * without the ability to be checked/selected. Equivalent to setting the\n * `not-checked` attribute on the item. Ignored outside `checked` mode.\n */\n notChecked?: boolean;\n}\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 === `sticky` || 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 /**\n * Optional renderer for the checkbox shown in `checked` interactionMode.\n * Receives the current `checked` state and returns a Lit template result.\n *\n * When set, the per-row checkbox becomes a `<span role=\"checkbox\">` whose\n * contents are whatever this returns (rendered with `lit`'s `render()`).\n * When unset, a native `<input type=\"checkbox\">` is used.\n *\n * @example\n * list.checkboxRenderer = (checked) => checked\n * ? html`<svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\"\n * fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n * stroke-linecap=\"round\" stroke-linejoin=\"round\"\n * style=\"opacity:0.5\">\n * <polyline points=\"3,8 7,12 13,4\" />\n * </svg>`\n * : html``;\n */\n @property({ attribute: false })\n checkboxRenderer: ((checked: boolean) => unknown) | CustomCheckboxOptions | 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 #wrappedElements = new Set<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 } else if (changed.has(`checkboxRenderer`) && this.interactionMode === `checked`) {\n this._syncCheckboxes();\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, options?: AddItemOptions): void {\n let el: Element;\n if (typeof item === `string`) {\n const li = document.createElement(`li`);\n li.textContent = item;\n el = li;\n } else {\n el = item;\n }\n if (options?.notChecked)\n el.setAttribute(`not-checked`, ``);\n this.appendChild(el);\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].filter(el => this._isCheckable(el)));\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 *selectedFilter(kind: `selected` | `checked` | `either`): Generator<Element> {\n const wanted = (el: Element) => {\n switch (kind) {\n case `selected`: return el.hasAttribute(`data-selected`);\n case `checked`: return el.hasAttribute(`data-checked`);\n case `either`: return el.hasAttribute(`data-selected`) || el.hasAttribute(`data-checked`);\n }\n };\n\n for (const el of this.querySelectorAll(ITEM_SELECTOR)) {\n if (this.#wrappedElements.has(el))\n continue;\n if ((el as HTMLElement).hidden)\n continue;\n if (wanted(el))\n yield el;\n }\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 if (!this._isCheckable(item))\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 if (!this._isCheckable(item))\n return;\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` && this.interactionMode !== `sticky`)\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).filter(el => this._isCheckable(el)));\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.filter(el => this._isCheckable(el)));\n if (next.size === 0)\n return;\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` && mode !== `sticky`)\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 — only the full-height checkbox column toggles.\n break;\n\n case `sticky`:\n // Every tap/click toggles — multi-select without modifier keys (touchscreens).\n this._toggleItem(item);\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 / sticky: 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 (this.#wrappedElements.has(el))\n return false;\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 // Whether an item participates in checked-mode selection. Items carrying the\n // `not-checked` attribute are skipped; outside `checked` mode it has no effect.\n // For wrapped custom elements the flag lives on the inner element, so resolve\n // through the wrapper map.\n private _isCheckable(item: Element): boolean {\n if (this.interactionMode !== `checked`)\n return true;\n const real = this.#customWrappers.get(item as HTMLLIElement) ?? item;\n return !real.hasAttribute(`not-checked`);\n }\n\n private _syncItemStates(): void {\n for (const el of this.querySelectorAll(ITEM_SELECTOR)) {\n if (this.#wrappedElements.has(el))\n continue;\n const item = this.#customWrappers.get(el as HTMLLIElement) ?? el;\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`, !item.hasAttribute(`not-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 const wantsCustom = typeof this.checkboxRenderer === `function`;\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 this.#wrappedElements.add(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 this.#wrappedElements.clear();\n }\n\n for (const el of this.querySelectorAll<HTMLElement>(`li`)) {\n const existing = el.querySelector<HTMLElement>(`.ixfx-list-checkbox`);\n if (!inCheckedMode) {\n if (existing)\n existing.remove();\n continue;\n }\n // Rows marked `not-checked` get no checkbox column and can't be checked\n const itemEl = this.#customWrappers.get(el as HTMLLIElement) ?? el;\n if (itemEl.hasAttribute(`not-checked`)) {\n if (existing)\n existing.remove();\n continue;\n }\n\n // In checked mode: if the existing checkbox is the wrong variant, drop it.\n const existingIsCustom = existing?.classList.contains(`ixfx-list-checkbox-custom`) ?? false;\n if (existing && existingIsCustom !== wantsCustom)\n existing.remove();\n\n let cb: HTMLElement | null = el.querySelector<HTMLElement>(`.ixfx-list-checkbox`);\n if (!cb) {\n if (wantsCustom) {\n const opts = this.checkboxRenderer as CustomCheckboxOptions;\n const margin = opts.margin ?? `0`;\n const width = opts.width ?? `24px`;\n cb = this._createCustomCheckbox(el, margin, width);\n } else {\n cb = this._createNativeCheckboxCell(el);\n }\n el.prepend(cb);\n }\n\n const checked = this._selectedItems.has(el);\n if (wantsCustom) {\n cb.setAttribute(`aria-checked`, String(checked));\n cb.toggleAttribute(`data-checked`, checked);\n if (this.checkboxRenderer) {\n const renderer = typeof this.checkboxRenderer === `function`\n ? this.checkboxRenderer\n : (this.checkboxRenderer as CustomCheckboxOptions).renderer;\n render(renderer(checked), cb);\n }\n } else {\n const input = cb.querySelector<HTMLInputElement>(`input.ixfx-list-checkbox`);\n if (input)\n input.checked = checked;\n }\n }\n }\n\n /**\n * Native checkbox cell: a span that stretches to the row's full cross-axis\n * (so the entire column height is a click target) with a real `<input>`\n * centred inside. The span owns the click; the input is purely visual and\n * has `pointer-events:none` so a single click produces one toggle.\n */\n private _createNativeCheckboxCell(el: HTMLElement): HTMLSpanElement {\n const cell = document.createElement(`span`);\n cell.className = `ixfx-list-checkbox ixfx-list-checkbox-native`;\n cell.style.cssText = `display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;align-self:stretch;width:18px;margin:0 6px 0 0;cursor:pointer;pointer-events:auto`;\n cell.tabIndex = -1;\n cell.setAttribute(`role`, `checkbox`);\n cell.setAttribute(`part`, `checkbox`);\n cell.addEventListener(`click`, (e) => {\n e.stopPropagation();\n this._toggleItem(el);\n });\n const input = document.createElement(`input`);\n input.type = `checkbox`;\n input.className = `ixfx-list-checkbox`;\n input.style.cssText = `pointer-events:none;cursor:pointer;margin:0`;\n cell.appendChild(input);\n return cell;\n }\n\n /**\n * Custom checkbox cell: same shape as the native cell (a stretching span)\n * so behaviour is identical. The renderer's content goes inside.\n */\n private _createCustomCheckbox(el: HTMLElement, margin: string, width: string): HTMLSpanElement {\n const span = document.createElement(`span`);\n span.className = `ixfx-list-checkbox ixfx-list-checkbox-custom`;\n span.style.cssText = `display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;align-self:stretch;width:${width};margin:${margin};cursor:pointer;pointer-events:auto`;\n span.tabIndex = -1;\n span.setAttribute(`role`, `checkbox`);\n span.setAttribute(`part`, `checkbox`);\n span.addEventListener(`click`, (e) => {\n e.stopPropagation();\n this._toggleItem(el);\n });\n return span;\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 --ixfx-list-item-padding: var(--ixfx-list-item-padding, var(--list-item-padding, 4px var(--space-m, 8px)));\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-x: hidden;\n overflow-y: auto;\n box-sizing: border-box;\n /* Scrollbar theming: end users override these CSS variables to control\n the native scrollbar (scrollbar-width, scrollbar-gutter, scrollbar-color). */\n scrollbar-width: var(--list-scrollbar-width, auto);\n scrollbar-gutter: var(--list-scrollbar-gutter, auto);\n scrollbar-color: var(--list-scrollbar-color, auto);\n }\n\n ::slotted([hidden]) {\n display: none !important;\n }\n\n ::slotted(li) {\n display: flex;\n align-items: center;\n padding: var(--ixfx-list-item-padding);\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 /* In checked mode, only the checkbox column is clickable; the row body\n gets a default cursor so it doesn't suggest otherwise. */\n :host([interaction-mode=\"checked\"]) ::slotted(li),\n :host([interaction-mode=\"checked\"]) ::slotted([data-list-item]) {\n cursor: default;\n }\n\n /* Wrapper inserted around custom [data-list-item] elements in checked mode.\n Provides the flex layout so the injected checkbox can stretch to the\n row's full height via align-self:stretch. */\n .ixfx-custom-row {\n display: flex;\n align-items: center;\n min-height: var(--list-item-height, 28px);\n box-sizing: border-box;\n cursor: default;\n user-select: none;\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","/* eslint-disable ts/no-unsafe-declaration-merging */\nimport type { NotificationType } from \"./types.js\";\nimport { css, html, LitElement, nothing } from \"lit\";\nimport { property } from \"lit/decorators.js\";\nimport { unsafeHTML } from \"lit/directives/unsafe-html.js\";\nimport { getIcon } from \"../icons/index.js\";\nimport { themeFallbacks } from \"../styles/fallbacks.js\";\nimport { safeCustomElement as customElement } from \"../util/custom-elements.js\";\n\nexport type PillTapDetail = { readonly id: string };\nexport type PillTapEvent = CustomEvent<PillTapDetail>;\n\nexport interface NotificationPillElementEventMap {\n 'pill-tap': PillTapEvent;\n}\n\n@customElement(`ixfx-notification-pill`)\nexport class NotificationPillElement extends LitElement {\n @property({ type: String, attribute: `notification-type` })\n notificationType: NotificationType = `info`;\n\n @property({ type: String })\n message = ``;\n\n @property({ type: String })\n icon?: string;\n\n @property({ type: Boolean, reflect: true })\n dismissing = false;\n\n @property({ type: String, attribute: `notification-id` })\n notificationId = ``;\n\n #handleClick(): void {\n this.#emitTap();\n }\n\n #handleKeyDown(e: KeyboardEvent): void {\n if (e.key === `Enter` || e.key === ` `) {\n e.preventDefault();\n this.#emitTap();\n }\n }\n\n #emitTap(): void {\n this.dispatchEvent(\n new CustomEvent<PillTapDetail>(`pill-tap`, {\n detail: { id: this.notificationId },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n #renderIcon() {\n if (!this.icon)\n return nothing;\n\n if (this.icon.startsWith(`<svg`)) {\n return html`<span class=\"pill-icon\">${unsafeHTML(this.icon)}</span>`;\n }\n\n const svg = getIcon(this.icon);\n if (!svg)\n return nothing;\n\n return html`<ixfx-icon class=\"pill-icon\" name=\"${this.icon}\"></ixfx-icon>`;\n }\n\n protected render() {\n return html`\n <button\n type=\"button\"\n class=\"pill\"\n notification-type=\"${this.notificationType}\"\n @click=${this.#handleClick}\n @keydown=${this.#handleKeyDown}\n aria-label=\"${this.message}\"\n >\n ${this.#renderIcon()}\n <span class=\"pill-message\">${this.message}</span>\n </button>\n `;\n }\n\n static styles = [\n themeFallbacks,\n css`\n :host {\n display: block;\n }\n\n .pill {\n appearance: none;\n cursor: pointer;\n font-family: var(--font-family, inherit);\n font-size: var(--text-m, 12px);\n padding: var(--space-s, 4px) var(--space-m, 8px);\n border-radius: var(--radius-l, 6px);\n border: 1px solid var(--surface-6, #666);\n display: inline-flex;\n align-items: center;\n gap: var(--space-s, 4px);\n max-width: 300px;\n box-shadow: var(--shadow-m);\n transition: opacity 0.2s ease-out, transform 0.2s ease-out;\n pointer-events: auto;\n }\n\n :host([dismissing]) .pill {\n opacity: 0;\n transform: translateX(20px);\n }\n\n .pill[notification-type=\"info\"] {\n background: var(--surface-5, #555);\n color: var(--surface-5-text, #fff);\n }\n\n .pill[notification-type=\"warning\"] {\n background: color-mix(in oklch, oklch(65% 0.18 70) 30%, var(--surface-5));\n border-color: oklch(65% 0.18 70);\n color: var(--surface-5-text, #fff);\n }\n\n .pill[notification-type=\"error\"] {\n background: var(--error, #c00);\n border-color: var(--error, #c00);\n color: var(--error-text, #fff);\n }\n\n .pill-icon {\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n }\n\n .pill-icon ixfx-icon {\n font-size: var(--text-m, 12px);\n }\n\n .pill-message {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .pill:focus-visible {\n outline: 2px solid var(--accent, #4a9);\n outline-offset: 2px;\n }\n\n @media (prefers-reduced-motion: reduce) {\n .pill {\n transition: opacity 0.1s ease-out;\n transform: none !important;\n }\n }\n `,\n ];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-notification-pill': NotificationPillElement;\n }\n}\n\nexport interface NotificationPillElement {\n addEventListener: (<K extends keyof NotificationPillElementEventMap>(\n type: K,\n listener: (this: NotificationPillElement, event: NotificationPillElementEventMap[K]) => void,\n options?: boolean | AddEventListenerOptions,\n ) => void) & ((\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ) => void);\n}\n","import type { Notification, NotificationRenderer, NotificationRendererHooks } from './types.js';\nimport './notification-pill.js';\n\nexport type PillPosition = `top-left` | `top-middle` | `top-right` | `bottom-left` | `bottom-middle` | `bottom-right`;\nexport type PillQueueDisplay = `list` | `stack`;\n\nexport interface PillSafeArea {\n readonly top?: number;\n readonly right?: number;\n readonly bottom?: number;\n readonly left?: number;\n}\n\nexport interface PillRendererOptions {\n position?: PillPosition;\n /** `list`: one row per message, oldest nearest the anchor edge. `stack`: only the front message is fully shown, the rest peek out behind it. Default `list`. */\n queueDisplay?: PillQueueDisplay;\n /** Extra margin (px) added to the default spacing on each side, letting pills avoid eg. a fixed header/footer/notch. */\n safeArea?: PillSafeArea;\n}\n\ntype PillEntry = {\n element: HTMLElement;\n notification: Notification;\n};\n\ntype Edges = { vertical: `top` | `bottom`; horizontal: `left` | `middle` | `right` };\n\nconst ROW_SPACING = 8;\nconst DEFAULT_ROW_HEIGHT = 40;\nconst STACK_OFFSET_STEP = 4;\nconst STACK_OPACITY_BASE = 0.7;\nconst STACK_OPACITY_DECAY = 0.15;\nconst STACK_OPACITY_MIN = 0.2;\n\nfunction edgesOf(position: PillPosition): Edges {\n const vertical = position.startsWith(`top`) ? `top` : `bottom`;\n const horizontal = position.endsWith(`-left`) ? `left` : position.endsWith(`-right`) ? `right` : `middle`;\n return { vertical, horizontal };\n}\n\nfunction anchorStyles(position: PillPosition, safeArea: PillSafeArea): string {\n const { vertical, horizontal } = edgesOf(position);\n const vMargin = `calc(var(--space-l, 12px) + ${(vertical === `top` ? safeArea.top : safeArea.bottom) ?? 0}px)`;\n let css = `position: fixed; `;\n css += vertical === `top` ? `top: ${vMargin}; bottom: auto; ` : `bottom: ${vMargin}; top: auto; `;\n\n if (horizontal === `left`) {\n const hMargin = `calc(var(--space-l, 12px) + ${safeArea.left ?? 0}px)`;\n css += `left: ${hMargin}; right: auto;`;\n } else if (horizontal === `right`) {\n const hMargin = `calc(var(--space-l, 12px) + ${safeArea.right ?? 0}px)`;\n css += `right: ${hMargin}; left: auto;`;\n } else {\n css += `left: 50%; right: auto;`;\n }\n return css;\n}\n\n/** Entry-animation starting transform: pills slide in from the edge they're anchored to. */\nfunction entryTransform(edges: Edges): string {\n const dy = edges.vertical === `top` ? -20 : 20;\n if (edges.horizontal === `middle`) {\n return `translateX(-50%) translate(0, ${dy}px)`;\n }\n const dx = edges.horizontal === `left` ? -20 : 20;\n return `translate(${dx}px, ${dy}px)`;\n}\n\nfunction restingTransform(edges: Edges, dx: number, dy: number): string {\n if (edges.horizontal === `middle`) {\n return `translateX(-50%) translate(${dx}px, ${dy}px)`;\n }\n return `translate(${dx}px, ${dy}px)`;\n}\n\nexport function createPillRenderer(options: PillRendererOptions = {}): NotificationRenderer {\n const position: PillPosition = options.position ?? `top-right`;\n const queueDisplay: PillQueueDisplay = options.queueDisplay ?? `list`;\n const safeArea: PillSafeArea = options.safeArea ?? {};\n const edges = edgesOf(position);\n\n let container: HTMLDivElement | null = null;\n let hooks: NotificationRendererHooks | null = null;\n const pills: Map<string, PillEntry> = new Map();\n let rowHeight = DEFAULT_ROW_HEIGHT;\n let measured = false;\n\n function ensureContainer(): HTMLDivElement {\n if (container)\n return container;\n\n container = document.createElement(`div`);\n container.className = `ixfx-notification-container`;\n container.setAttribute(`role`, `region`);\n container.setAttribute(`aria-label`, `Notifications`);\n document.body.appendChild(container);\n return container;\n }\n\n function updateAttributes(el: HTMLElement, notification: Notification): void {\n el.setAttribute(`notification-type`, notification.type);\n el.setAttribute(`message`, notification.message);\n if (notification.icon) {\n el.setAttribute(`icon`, notification.icon);\n } else {\n el.removeAttribute(`icon`);\n }\n }\n\n function createPillElement(notification: Notification): HTMLElement {\n const el = document.createElement(`ixfx-notification-pill`) as HTMLElement;\n el.setAttribute(`notification-id`, notification.id);\n el.style.cssText = anchorStyles(position, safeArea);\n updateAttributes(el, notification);\n\n el.style.opacity = `0`;\n el.style.transform = entryTransform(edges);\n\n el.addEventListener(`pill-tap`, (e: Event) => {\n const customEvent = e as CustomEvent<{ id: string }>;\n hooks?.onTap(customEvent.detail.id);\n });\n\n return el;\n }\n\n function measureRowHeight(el: HTMLElement): void {\n if (measured)\n return;\n requestAnimationFrame(() => {\n const height = el.getBoundingClientRect().height;\n if (height > 0) {\n rowHeight = height;\n measured = true;\n }\n });\n }\n\n /** Positions every currently-visible pill for its rank in `order` (index 0 = front/oldest). */\n function applyLayout(order: readonly Notification[]): void {\n const total = order.length;\n order.forEach((notification, index) => {\n const entry = pills.get(notification.id);\n if (!entry)\n return;\n\n const el = entry.element;\n let dx = 0;\n let dy = 0;\n let opacity = 1;\n let pointerEvents = `auto`;\n let filter = `none`;\n\n if (queueDisplay === `list`) {\n const step = index * (rowHeight + ROW_SPACING);\n dy = edges.vertical === `top` ? step : -step;\n } else {\n const step = index * STACK_OFFSET_STEP;\n dy = edges.vertical === `top` ? step : -step;\n dx = edges.horizontal === `left` ? step : edges.horizontal === `right` ? -step : 0;\n if (index > 0) {\n const hintIndex = index - 1;\n opacity = Math.max(STACK_OPACITY_MIN, STACK_OPACITY_BASE - hintIndex * STACK_OPACITY_DECAY);\n pointerEvents = `none`;\n filter = `saturate(0.6)`;\n }\n }\n\n el.style.transition = `opacity 0.2s ease-out, transform 0.2s ease-out`;\n el.style.opacity = `${opacity}`;\n el.style.zIndex = `${total - index}`;\n el.style.pointerEvents = pointerEvents;\n el.style.filter = filter;\n el.style.transform = restingTransform(edges, dx, dy);\n });\n }\n\n function dismiss(id: string): void {\n const entry = pills.get(id);\n if (!entry)\n return;\n\n const el = entry.element as HTMLElement;\n el.setAttribute(`dismissing`, `true`);\n\n const cleanup = () => {\n el.removeEventListener(`transitionend`, cleanup);\n el.remove();\n pills.delete(id);\n\n if (container && pills.size === 0) {\n container.remove();\n container = null;\n measured = false;\n rowHeight = DEFAULT_ROW_HEIGHT;\n }\n };\n\n el.addEventListener(`transitionend`, cleanup);\n setTimeout(cleanup, 300);\n }\n\n function setNotifications(notifications: Notification[], _queueSize: number): void {\n const cont = ensureContainer();\n const idsToKeep = new Set(notifications.map(n => n.id));\n\n for (const notification of notifications) {\n const existing = pills.get(notification.id);\n if (existing) {\n existing.notification = notification;\n updateAttributes(existing.element, notification);\n continue;\n }\n\n const el = createPillElement(notification);\n pills.set(notification.id, { element: el, notification });\n cont.appendChild(el);\n measureRowHeight(el);\n }\n\n for (const [id] of pills) {\n if (!idsToKeep.has(id)) {\n dismiss(id);\n }\n }\n\n requestAnimationFrame(() => applyLayout(notifications));\n }\n\n return {\n attach(newHooks: NotificationRendererHooks): void {\n hooks = newHooks;\n },\n\n detach(): void {\n for (const [id] of pills) {\n dismiss(id);\n }\n if (container) {\n container.remove();\n container = null;\n }\n },\n\n setNotifications,\n };\n}\n","import type {\n Notification,\n NotificationContent,\n NotificationRenderer,\n NotificationRendererHooks,\n NotifierOptions,\n} from './types.js';\nimport { createPillRenderer } from './pill-renderer.js';\n\ntype Managed = { -readonly [K in keyof Notification]: Notification[K] } & { timer: number | null; wasQueued: boolean };\n\nconst options: {\n renderer: NotificationRenderer;\n timeout: number;\n timeoutError: number;\n queue: boolean;\n queueSize: number;\n tapBehaviour: `none` | `dismiss`;\n tapHandlerDefault: NotifierOptions[`tapHandlerDefault`];\n} = {\n renderer: undefined as unknown as NotificationRenderer,\n timeout: 4000,\n timeoutError: 8000,\n queue: true,\n queueSize: 3,\n tapBehaviour: `dismiss`,\n tapHandlerDefault: undefined,\n};\n\n/** Rank-ordered, index 0 = oldest/first (next to be evicted or timed out). Length never exceeds queueSize (or 1 when queuing is disabled). */\nconst visible: Managed[] = [];\nlet renderer: NotificationRenderer | null = null;\nlet defaultRenderer: NotificationRenderer | null = null;\n\nfunction getDefaultRenderer(): NotificationRenderer {\n defaultRenderer ??= createPillRenderer({ position: `top-right` });\n return defaultRenderer;\n}\n\nfunction getRenderer(): NotificationRenderer {\n return renderer ?? getDefaultRenderer();\n}\n\nfunction syncRenderer(): void {\n getRenderer().setNotifications([ ...visible ], options.queueSize);\n}\n\nfunction clearTimer(managed: Managed): void {\n if (managed.timer !== null) {\n clearTimeout(managed.timer);\n managed.timer = null;\n }\n}\n\n/**\n * A message shown alone takes the full timeout. A message that joined a\n * non-empty queue at arrival time is permanently \"wasQueued\" and gets\n * 1/queueSize of the timeout once it reaches the front. The timer for a\n * given message is only ever started once - when it first becomes front.\n */\nfunction startTimer(managed: Managed): void {\n const base = managed.type === `error` ? options.timeoutError : options.timeout;\n const duration = managed.wasQueued ? base / options.queueSize : base;\n managed.timer = window.setTimeout(() => dismiss(managed.id), duration);\n}\n\nfunction ensureFrontTimer(): void {\n const front = visible[0];\n if (front && front.timer === null) {\n startTimer(front);\n }\n}\n\nexport const NotificationManager = {\n configure(opts: NotifierOptions): void {\n if (opts.renderer !== undefined) {\n const old = renderer;\n old?.detach?.();\n renderer = opts.renderer;\n renderer.attach({\n onTap(id: string) {\n const notification = visible.find(n => n.id === id);\n if (!notification)\n return;\n if (notification.onTap) {\n notification.onTap(id);\n } else {\n options.tapHandlerDefault?.(notification);\n }\n if (options.tapBehaviour === `dismiss`) {\n dismiss(id);\n }\n },\n });\n syncRenderer();\n }\n if (opts.timeout !== undefined)\n options.timeout = opts.timeout;\n if (opts.timeoutError !== undefined)\n options.timeoutError = opts.timeoutError;\n if (opts.queue !== undefined)\n options.queue = opts.queue;\n if (opts.queueSize !== undefined) {\n options.queueSize = Math.max(1, opts.queueSize);\n while (visible.length > options.queueSize) {\n clearTimer(visible.shift()!);\n }\n ensureFrontTimer();\n syncRenderer();\n }\n if (opts.tapBehaviour !== undefined)\n options.tapBehaviour = opts.tapBehaviour;\n if (opts.tapHandlerDefault !== undefined)\n options.tapHandlerDefault = opts.tapHandlerDefault;\n },\n\n notify(content: NotificationContent): string {\n const id = crypto.randomUUID();\n const now = Date.now();\n const icon = content.icon ?? (content.type === `error` ? `error` : undefined);\n const managed: Managed = {\n ...content,\n icon,\n id,\n createdAt: now,\n updatedAt: now,\n timer: null,\n wasQueued: false,\n };\n\n if (options.queue) {\n if (visible.length >= options.queueSize) {\n clearTimer(visible.shift()!);\n }\n managed.wasQueued = visible.length > 0;\n visible.push(managed);\n } else {\n while (visible.length > 0) {\n clearTimer(visible.pop()!);\n }\n visible.push(managed);\n }\n\n ensureFrontTimer();\n syncRenderer();\n return id;\n },\n\n update(id: string, content: Partial<NotificationContent>): void {\n const managed = visible.find(n => n.id === id);\n if (!managed)\n return;\n\n Object.assign(managed, content);\n managed.updatedAt = Date.now();\n\n if (visible[0] === managed) {\n clearTimer(managed);\n startTimer(managed);\n }\n syncRenderer();\n },\n\n dismiss(id: string): void {\n dismiss(id);\n },\n\n dismissAll(): void {\n for (const m of visible)\n clearTimer(m);\n visible.length = 0;\n syncRenderer();\n },\n};\n\nfunction dismiss(id: string): void {\n const idx = visible.findIndex(m => m.id === id);\n if (idx === -1)\n return;\n\n clearTimer(visible.splice(idx, 1)[0]);\n ensureFrontTimer();\n syncRenderer();\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 { css, html, LitElement } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { popupSurfaceStyles } from '../styles/popup.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\n\nexport type SnackbarMode = `explicit` | `manual` | `implicit`;\nexport type SnackbarPlacement = `top` | `bottom` | `left` | `right`;\nexport type SnackbarDismiss = `auto` | `manual`;\n\nlet _instanceCounter = 0;\n\n/**\n * `ixfx-snackbar` is itself the popover panel (`popover=\"auto\"` set on the host) -\n * unlike `ixfx-menu-trigger`/`ixfx-colour-picker-popup` there's no separate always-visible\n * trigger living inside the component to keep out of the top layer; the trigger is the\n * external `for` target, so the whole host can be the popover content.\n */\n@customElement(`ixfx-snackbar`)\nexport class SnackbarElement extends LitElement {\n @property({ type: String }) for = ``;\n @property({ type: String }) mode: SnackbarMode = `explicit`;\n @property({ type: String, reflect: true }) placement: SnackbarPlacement = `top`;\n @property({ type: String }) dismiss: SnackbarDismiss = `auto`;\n @property({ type: Number, attribute: `show-delay` }) showDelay = 150;\n @property({ type: Number, attribute: `hide-delay` }) hideDelay = 500;\n\n @state() private _isOpen = false;\n\n // When a close wasn't initiated by our own code (light-dismiss: click outside or\n // Escape) the popover is already closed before the click that triggered it dispatches.\n // toggle() consults this to avoid immediately re-opening via togglePopover(). The\n // timestamp window is deliberately tiny — light-dismiss and the ensuing click happen\n // in the same event dispatch, microseconds apart, so it can't swallow a later, real\n // toggle (e.g. clicking a toggle button after having dismissed the popover earlier).\n private _recentCloseAt: number | undefined;\n\n private readonly _anchorName = `--ixfx-snackbar-anchor-${++_instanceCounter}`;\n\n private _target: HTMLElement | undefined;\n private _addedTabindex = false;\n private _addedRole = false;\n private _showTimeout: number | undefined;\n private _hideTimeout: number | undefined;\n\n private readonly _onTargetClick = (): void => this.toggle();\n private readonly _onTargetKeydown = (e: KeyboardEvent): void => {\n if (e.key !== `Enter` && e.key !== ` `)\n return;\n e.preventDefault();\n this.toggle();\n };\n\n // Shared by both the target and the panel itself - hovering/focusing either keeps it open.\n private readonly _onTickleIn = (): void => this._scheduleShow();\n private readonly _onTickleOut = (): void => this._scheduleHide();\n private readonly _onPanelClick = (): void => {\n if (this.dismiss === `auto`)\n this.hide();\n };\n\n private readonly _onToggle = (e: Event): void => {\n const { newState } = e as ToggleEvent;\n this._isOpen = newState === `open`;\n if (newState === `closed` && this.contains(document.activeElement)) {\n this._target?.focus();\n }\n };\n\n private readonly _onBeforeToggle = (e: Event): void => {\n const { newState } = e as ToggleEvent;\n this._recentCloseAt = newState === `closed` ? performance.now() : undefined;\n };\n\n get isOpen(): boolean {\n return this._isOpen;\n }\n\n show(): void {\n if (!this.popover)\n return;\n try {\n this.showPopover();\n } catch {\n // already open, or popover API unsupported\n }\n }\n\n hide(): void {\n if (!this.popover)\n return;\n try {\n this.hidePopover();\n } catch {\n // already closed\n }\n }\n\n toggle(): void {\n if (!this.popover)\n return;\n // If the popover was just closed by light-dismiss as part of this same click\n // (click outside closes an `auto` popover before the click event dispatches),\n // togglePopover() would re-open it. Honour the dismiss instead: the popover is\n // already closed, so the toggle is a no-op.\n if (this._recentCloseAt !== undefined && performance.now() - this._recentCloseAt < 50) {\n this._recentCloseAt = undefined;\n return;\n }\n try {\n this.togglePopover();\n } catch {\n // popover API unsupported\n }\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (!this.hasAttribute(`popover`))\n this.popover = `auto`;\n this.classList.add(`popup-surface`);\n this.addEventListener(`toggle`, this._onToggle);\n this.addEventListener(`beforetoggle`, this._onBeforeToggle);\n this.addEventListener(`click`, this._onPanelClick);\n this.style.setProperty(`position-anchor`, this._anchorName);\n this._attachToTarget();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener(`toggle`, this._onToggle);\n this.removeEventListener(`beforetoggle`, this._onBeforeToggle);\n this.removeEventListener(`click`, this._onPanelClick);\n this._detachFromTarget();\n this._cancelShow();\n this._cancelHide();\n }\n\n override updated(changed: Map<PropertyKey, unknown>): void {\n super.updated(changed);\n if (changed.has(`for`) || changed.has(`mode`)) {\n this._attachToTarget();\n }\n }\n\n private _resolveTarget(): HTMLElement | undefined {\n if (!this.for)\n return undefined;\n const root = this.getRootNode() as Document | ShadowRoot;\n return root.getElementById(this.for) ?? undefined;\n }\n\n private _attachToTarget(): void {\n this._detachFromTarget();\n\n const target = this._resolveTarget();\n if (!target) {\n if (this.for)\n console.warn(`ixfx-snackbar: no element found with id \"${this.for}\"`);\n return;\n }\n this._target = target;\n target.style.setProperty(`anchor-name`, this._anchorName);\n\n if (this.mode === `explicit`) {\n const alreadyFocusable = target.tabIndex >= 0;\n if (!alreadyFocusable) {\n target.setAttribute(`tabindex`, `0`);\n this._addedTabindex = true;\n }\n if (!target.hasAttribute(`role`) && !alreadyFocusable) {\n target.setAttribute(`role`, `button`);\n this._addedRole = true;\n }\n target.setAttribute(`aria-haspopup`, `true`);\n target.addEventListener(`click`, this._onTargetClick);\n // Native interactive elements (button, a[href], ...) already turn Enter/Space into a\n // click; a target we just made focusable via role=\"button\" does not get that for free.\n if (!alreadyFocusable)\n target.addEventListener(`keydown`, this._onTargetKeydown);\n } else if (this.mode === `implicit`) {\n target.addEventListener(`pointerenter`, this._onTickleIn);\n target.addEventListener(`focus`, this._onTickleIn);\n target.addEventListener(`pointerleave`, this._onTickleOut);\n target.addEventListener(`blur`, this._onTickleOut);\n this.addEventListener(`pointerenter`, this._onTickleIn);\n this.addEventListener(`focusin`, this._onTickleIn);\n this.addEventListener(`pointerleave`, this._onTickleOut);\n this.addEventListener(`focusout`, this._onTickleOut);\n }\n }\n\n private _detachFromTarget(): void {\n const target = this._target;\n if (!target)\n return;\n\n target.style.removeProperty(`anchor-name`);\n if (this._addedTabindex) {\n target.removeAttribute(`tabindex`);\n this._addedTabindex = false;\n }\n if (this._addedRole) {\n target.removeAttribute(`role`);\n this._addedRole = false;\n }\n target.removeAttribute(`aria-haspopup`);\n target.removeEventListener(`click`, this._onTargetClick);\n target.removeEventListener(`keydown`, this._onTargetKeydown);\n target.removeEventListener(`pointerenter`, this._onTickleIn);\n target.removeEventListener(`focus`, this._onTickleIn);\n target.removeEventListener(`pointerleave`, this._onTickleOut);\n target.removeEventListener(`blur`, this._onTickleOut);\n this.removeEventListener(`pointerenter`, this._onTickleIn);\n this.removeEventListener(`focusin`, this._onTickleIn);\n this.removeEventListener(`pointerleave`, this._onTickleOut);\n this.removeEventListener(`focusout`, this._onTickleOut);\n this._target = undefined;\n }\n\n private _scheduleShow(): void {\n this._cancelHide();\n this._cancelShow();\n if (this.showDelay <= 0) {\n this.show();\n return;\n }\n this._showTimeout = window.setTimeout(() => this.show(), this.showDelay);\n }\n\n private _scheduleHide(): void {\n this._cancelShow();\n this._cancelHide();\n if (this.hideDelay <= 0) {\n this.hide();\n return;\n }\n this._hideTimeout = window.setTimeout(() => this.hide(), this.hideDelay);\n }\n\n private _cancelShow(): void {\n if (this._showTimeout !== undefined) {\n window.clearTimeout(this._showTimeout);\n this._showTimeout = undefined;\n }\n }\n\n private _cancelHide(): void {\n if (this._hideTimeout !== undefined) {\n window.clearTimeout(this._hideTimeout);\n this._hideTimeout = undefined;\n }\n }\n\n static override styles = [\n themeFallbacks,\n popupSurfaceStyles,\n css`\n :host {\n display: flex;\n align-items: center;\n gap: var(--space-s);\n padding: var(--space-s);\n\n position: fixed;\n inset: unset;\n margin: 0;\n z-index: 100;\n position-try-fallbacks: flip-block, flip-inline, flip-block flip-inline;\n\n opacity: 0;\n scale: 0.97;\n pointer-events: none;\n transition: opacity 0.12s ease-out, scale 0.12s ease-out,\n display 0.12s allow-discrete, overlay 0.12s allow-discrete;\n }\n\n :host(:popover-open) {\n opacity: 1;\n scale: 1;\n pointer-events: auto;\n }\n\n @starting-style {\n :host(:popover-open) {\n opacity: 0;\n scale: 0.97;\n }\n }\n\n :host([placement=\"top\"]) {\n position-area: block-start;\n margin-block-end: var(--space-s);\n }\n\n :host([placement=\"bottom\"]) {\n position-area: block-end;\n margin-block-start: var(--space-s);\n }\n\n :host([placement=\"left\"]) {\n position-area: inline-start;\n margin-inline-end: var(--space-s);\n }\n\n :host([placement=\"right\"]) {\n position-area: inline-end;\n margin-inline-start: var(--space-s);\n }\n `,\n ];\n\n protected override render() {\n return html`<slot></slot>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-snackbar': SnackbarElement;\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 * --ixfx-tab-padding: padding for the tab content (default: var(--space-m))\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-tab-color: var(--ixfx-selected-tab-color, var(--surface-2-text));\n --selected-tab-border-width: var(--ixfx-selected-tab-border-width, 1px);\n --selected-tab-weight: var(--ixfx-selected-tab-weight, bold);\n --selected-background: var(--ixfx-tab-selected-background, var(--surface-5));\n --tab-padding: var(--ixfx-tab-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(--tab-padding) calc(2 * var(--tab-padding));\n min-width: 0;\n width: 100%;\n font-weight: 500;\n border: var(--selected-tab-border-width) solid transparent;\n }\n\n :host([selected]) > div {\n color: var(--selected-tab-color);\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 background: var(--selected-background);\n font-weight: var(--selected-tab-weight);\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 { CommandRegistry } from '@clinth/ui-commands';\nimport type { TabListItemElement } from './tab-list-item.js';\nimport type { TabListChangeDetail, TabListElement } from './tab-list.js';\nimport type { TabPanelElement } from './tab-panel.js';\nimport type { TabPanelsElement } from './tab-panels.js';\nimport './tab-list-item.js';\nimport './tab-panel.js';\n\n/** A single tab managed by a {@link TabController}. */\nexport type Tab = {\n /** id of the `ixfx-tab-list-item` */\n readonly id: string;\n /** id of the `ixfx-tab-panel` (the item's `for` value) */\n readonly forId: string;\n readonly item: TabListItemElement;\n readonly panel: TabPanelElement;\n label: string;\n iconName?: string;\n};\n\nexport type TabAddOptions = {\n label: string;\n /** id for the tab item; derived from the label if omitted */\n id?: string;\n /** id for the panel (and the item's `for`); derived from the label if omitted */\n forId?: string;\n iconName?: string;\n description?: string;\n closeable?: boolean;\n /** Elements to slot into the tab's `slot=\"toolbar\"` */\n toolbar?: HTMLElement[];\n /** Panel content: a node, text, or a callback given the fresh panel element */\n content?: Node | string | ((panel: TabPanelElement) => void);\n /** Select the new tab immediately (default `true`) */\n select?: boolean;\n /** Insertion index among existing tabs (default: append) */\n index?: number;\n};\n\nexport type TabControllerOptions = {\n /**\n * When provided, a command is registered per tab (id = tab id). Invoking\n * `commands.invoke(id)` selects the tab.\n */\n commands?: CommandRegistry;\n /** Fired after a tab becomes selected (via click or programmatic select) */\n onSelect?: (tab: Tab, previous: Tab | undefined) => void;\n onAdd?: (tab: Tab) => void;\n onRemove?: (tab: Tab) => void;\n onReorder?: (tabs: Tab[]) => void;\n};\n\n/**\n * Connects an `ixfx-tab-list` to an `ixfx-tab-panels` container, handling the\n * wiring between them (header clicks show the matching panel, closing a tab\n * removes its panel, etc.) and offering an API to select, add, remove, rename\n * and reorder tabs.\n *\n * @example\n * ```ts\n * const ctrl = new TabController(\n * document.querySelector('ixfx-tab-list'),\n * document.querySelector('ixfx-tab-panels'),\n * );\n * ctrl.connect();\n *\n * ctrl.addTab({ label: 'Console', content: 'Console panel' });\n * ctrl.selectTab('Console');\n * ```\n */\nexport class TabController {\n readonly #list: TabListElement;\n readonly #panels: TabPanelsElement;\n readonly #opts: TabControllerOptions;\n\n #tabs: Tab[] = [];\n #signal: AbortController | undefined;\n #observer: MutationObserver | undefined;\n #commands: CommandRegistry | undefined;\n #registeredCommands = new Set<string>();\n\n constructor(\n list: TabListElement,\n panels: TabPanelsElement,\n options: TabControllerOptions = {},\n ) {\n this.#list = list;\n this.#panels = panels;\n this.#opts = options;\n this.#commands = options.commands;\n }\n\n connect(): void {\n this.disconnect();\n this.#signal = new AbortController();\n const { signal } = this.#signal;\n\n this.#list.addEventListener(`change`, this.#onChange, { signal });\n this.#list.addEventListener(`reorder`, this.#onReorder, { signal });\n this.#list.addEventListener(`close`, this.#onClose, { signal });\n\n this.#observer = new MutationObserver(() => this.#rebuild());\n this.#observer.observe(this.#list, { childList: true });\n this.#observer.observe(this.#panels, { childList: true });\n\n this.#rebuild();\n\n // Establish the list↔panels association and mirror the initially-selected\n // header into the panels (its internal Promise-based initial sync).\n this.#panels.syncWithList(this.#list);\n\n for (const tab of this.#tabs) {\n this.#registerCommand(tab);\n }\n }\n\n disconnect(): void {\n this.#signal?.abort();\n this.#signal = undefined;\n this.#observer?.disconnect();\n this.#observer = undefined;\n\n for (const tab of this.#tabs) {\n this.#unregisterCommand(tab);\n }\n this.#registeredCommands.clear();\n this.#tabs = [];\n }\n\n // ── Selection ────────────────────────────────────────────────────────\n\n /**\n * Select a tab as if it was clicked — activates the header (deactivating the\n * others) and shows its panel.\n *\n * `sel` may be a tab id, the panel id its `for` points at, its label text\n * (case-insensitive), or the tab item element itself.\n *\n * Returns true if a tab was found.\n */\n selectTab(sel: string | TabListItemElement): boolean {\n const tab = this.#resolveTab(sel);\n if (!tab)\n return false;\n\n const previous = this.getSelected();\n if (previous?.id === tab.id) {\n // Header already active — still ensure the content panel is shown.\n this.#panels.selectPanel(tab.forId);\n return true;\n }\n\n this.#list.selectElement(tab.item);\n this.#panels.selectPanel(tab.forId);\n this.#opts.onSelect?.(tab, previous);\n return true;\n }\n\n selectNext(): boolean {\n return this.#selectOffset(1);\n }\n\n selectPrevious(): boolean {\n return this.#selectOffset(-1);\n }\n\n getSelected(): Tab | undefined {\n return this.#tabs.find(t => t.item.hasAttribute(`selected`));\n }\n\n getTabs(): Tab[] {\n return [...this.#tabs];\n }\n\n getTab(id: string): Tab | undefined {\n return this.#tabs.find(t => t.id === id);\n }\n\n // ── Mutation ─────────────────────────────────────────────────────────\n\n addTab(opts: TabAddOptions): Tab {\n const { id, forId } = this.#idsFor(opts);\n\n const item = document.createElement(`ixfx-tab-list-item`) as TabListItemElement;\n item.id = id;\n item.setAttribute(`for`, forId);\n item.closeable = opts.closeable ?? true;\n item.append(opts.label);\n if (opts.iconName) {\n item.iconName = opts.iconName;\n }\n if (opts.description) {\n item.description = opts.description;\n }\n for (const el of opts.toolbar ?? []) {\n el.slot = `toolbar`;\n item.append(el);\n }\n\n const panel = document.createElement(`ixfx-tab-panel`) as TabPanelElement;\n panel.id = forId;\n if (opts.content !== undefined) {\n this.#fillContent(panel, opts.content);\n }\n\n const index = Math.max(0, Math.min(opts.index ?? this.#tabs.length, this.#tabs.length));\n this.#insertElement(this.#list, item, index);\n this.#insertElement(this.#panels, panel, index);\n\n const tab: Tab = {\n id,\n forId,\n item,\n panel,\n label: opts.label,\n iconName: opts.iconName,\n };\n this.#tabs.splice(index, 0, tab);\n\n this.#registerCommand(tab);\n this.#opts.onAdd?.(tab);\n\n if (opts.select ?? true) {\n this.selectTab(id);\n }\n return tab;\n }\n\n removeTab(sel: string | TabListItemElement): boolean {\n const tab = this.#resolveTab(sel);\n if (!tab)\n return false;\n\n const index = this.#tabs.indexOf(tab);\n const wasSelected = tab.item.hasAttribute(`selected`);\n const adjacent = wasSelected ? this.#adjacentTab(index) : undefined;\n\n tab.item.remove();\n tab.panel.remove();\n this.#removeFromIndex(tab);\n this.#unregisterCommand(tab);\n this.#opts.onRemove?.(tab);\n\n if (adjacent) {\n this.selectTab(adjacent.id);\n }\n return true;\n }\n\n renameTab(sel: string | TabListItemElement, label: string): boolean {\n const tab = this.#resolveTab(sel);\n if (!tab)\n return false;\n\n for (const child of [...tab.item.childNodes]) {\n const isToolbar = child.nodeType === Node.ELEMENT_NODE\n && (child as HTMLElement).slot === `toolbar`;\n if (isToolbar)\n continue;\n tab.item.removeChild(child);\n }\n tab.item.prepend(label);\n tab.label = label;\n\n this.#reregisterCommand(tab);\n return true;\n }\n\n setTabIcon(sel: string | TabListItemElement, iconName?: string): boolean {\n const tab = this.#resolveTab(sel);\n if (!tab)\n return false;\n\n if (iconName) {\n tab.item.iconName = iconName;\n tab.iconName = iconName;\n } else {\n tab.item.iconName = undefined;\n tab.item.removeAttribute(`icon-name`);\n tab.iconName = undefined;\n }\n return true;\n }\n\n // ── Event handlers ───────────────────────────────────────────────────\n\n #onChange = (event: Event): void => {\n const detail = (event as CustomEvent<TabListChangeDetail>).detail;\n this.#panels.selectPanel(detail.for);\n\n const tab = this.#tabs.find(t => t.forId === detail.for);\n if (!tab)\n return;\n const previous = detail.previous\n ? this.#tabs.find(t => t.id === detail.previous)\n : undefined;\n this.#opts.onSelect?.(tab, previous);\n };\n\n #onReorder = (): void => {\n this.#rebuild();\n this.#opts.onReorder?.(this.#tabs);\n };\n\n #onClose = (event: Event): void => {\n const target = event.target as HTMLElement | null;\n const item = target?.closest(`ixfx-tab-list-item`) as TabListItemElement | null;\n const tab = item ? this.#tabByItem(item) : undefined;\n if (!tab)\n return;\n\n const index = this.#tabs.indexOf(tab);\n const wasSelected = tab.item.hasAttribute(`selected`);\n const adjacent = wasSelected ? this.#adjacentTab(index) : undefined;\n\n // The item removed itself (tab-list-item close handler); remove the panel\n // and drop the tab from the index.\n tab.panel.remove();\n this.#removeFromIndex(tab);\n this.#unregisterCommand(tab);\n this.#opts.onRemove?.(tab);\n\n if (adjacent) {\n this.selectTab(adjacent.id);\n }\n };\n\n // ── Internal helpers ─────────────────────────────────────────────────\n\n #selectOffset(offset: number): boolean {\n const tabs = this.#tabs;\n if (tabs.length === 0)\n return false;\n const current = this.getSelected();\n const index = current ? tabs.indexOf(current) : offset === 1 ? -1 : 0;\n const next = (index + offset + tabs.length) % tabs.length;\n return this.selectTab(tabs[next].id);\n }\n\n #resolveTab(sel: string | TabListItemElement): Tab | undefined {\n if (typeof sel !== `string`) {\n return this.#tabs.find(t => t.item === sel);\n }\n const label = sel.trim().toLowerCase();\n return this.#tabs.find(t => t.id === sel)\n ?? this.#tabs.find(t => t.forId === sel)\n ?? this.#tabs.find(t => t.label.toLowerCase() === label);\n }\n\n #tabByItem(item: TabListItemElement): Tab | undefined {\n return this.#tabs.find(t => t.item === item);\n }\n\n #adjacentTab(index: number): Tab | undefined {\n const tabs = this.#tabs;\n if (tabs.length <= 1)\n return undefined;\n return tabs[index + 1] ?? tabs[index - 1];\n }\n\n #removeFromIndex(tab: Tab): void {\n const index = this.#tabs.indexOf(tab);\n if (index >= 0) {\n this.#tabs.splice(index, 1);\n }\n }\n\n #idsFor(opts: TabAddOptions): { id: string; forId: string } {\n const base = this.#slug(opts.label) || `tab`;\n return {\n id: opts.id ?? this.#uniqueId(`tab-${base}`),\n forId: opts.forId ?? this.#uniqueId(`panel-${base}`),\n };\n }\n\n #slug(value: string): string {\n return value.toLowerCase()\n .replace(/[^a-z0-9]+/g, `-`)\n .replace(/^-+|-+$/g, ``);\n }\n\n #uniqueId(base: string): string {\n let candidate = base;\n let n = 2;\n while (document.getElementById(candidate)) {\n candidate = `${base}-${n++}`;\n }\n return candidate;\n }\n\n #fillContent(panel: TabPanelElement, content: Node | string | ((panel: TabPanelElement) => void)): void {\n if (typeof content === `function`) {\n content(panel);\n return;\n }\n if (typeof content === `string`) {\n panel.append(document.createTextNode(content));\n return;\n }\n panel.append(content);\n }\n\n #insertElement(container: HTMLElement, el: HTMLElement, index: number): void {\n const children = Array.from(container.children);\n container.insertBefore(el, children[index] ?? null);\n }\n\n #rebuild(): void {\n const panels = new Map<string, TabPanelElement>();\n for (const el of this.#panels.querySelectorAll(`ixfx-tab-panel`)) {\n panels.set(el.id, el as TabPanelElement);\n }\n\n const tabs: Tab[] = [];\n for (const item of this.#list.querySelectorAll(`ixfx-tab-list-item`) as NodeListOf<TabListItemElement>) {\n const forId = item.getAttribute(`for`) ?? ``;\n const panel = panels.get(forId);\n if (!panel)\n continue;\n tabs.push({\n id: item.id || forId,\n forId,\n item,\n panel,\n label: this.#labelOf(item),\n iconName: item.iconName,\n });\n }\n this.#tabs = tabs;\n }\n\n /** The tab's visible label text, excluding any `slot=\"toolbar\"` content. */\n #labelOf(item: TabListItemElement): string {\n const clone = item.cloneNode(true) as HTMLElement;\n clone.querySelectorAll(`[slot=\"toolbar\"]`).forEach(el => el.remove());\n return (clone.textContent ?? ``).trim();\n }\n\n #registerCommand(tab: Tab): void {\n if (!this.#commands)\n return;\n if (tab.item.commandActive)\n return;\n if (this.#commands.has(tab.id))\n return;\n this.#commands.register({\n id: tab.id,\n label: tab.label,\n description: tab.item.description ?? tab.label,\n icon: tab.iconName,\n execute: () => {\n this.selectTab(tab.id);\n },\n });\n this.#registeredCommands.add(tab.id);\n }\n\n #unregisterCommand(tab: Tab): void {\n if (!this.#commands)\n return;\n if (this.#registeredCommands.has(tab.id)) {\n this.#commands.unregister(tab.id);\n this.#registeredCommands.delete(tab.id);\n }\n }\n\n #reregisterCommand(tab: Tab): void {\n if (!this.#commands || !this.#registeredCommands.has(tab.id))\n return;\n const existing = this.#commands.get(tab.id);\n if (!existing)\n return;\n this.#commands.unregister(tab.id);\n this.#commands.register({ ...existing, label: tab.label });\n }\n}\n","import type { TabListItemElement } from \"./tab-list-item.js\";\nimport 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 * The `ixfx-tab-list` this panels element is associated with, established by\n * `syncWithList()`. Used by `selectTab()` to activate the matching header.\n */\n #list: TabListElement | undefined;\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 this.#list = el;\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 /**\n * Select a tab as if the user clicked it — activates the matching header in\n * the associated `ixfx-tab-list` (deactivating the others) and shows its\n * panel.\n *\n * `nameOrTitle` may be the label text of a tab (e.g. `'Home'`, matched\n * case-insensitively) or the panel id its `for` attribute points at\n * (e.g. `'panel-home'`). If no tab matches, `nameOrTitle` is tried directly\n * as a panel id.\n *\n * The tab list must first be associated via `syncWithList()` for the header\n * to be activated; panel selection works regardless.\n *\n * Returns true if a panel was found and selected.\n */\n selectTab(nameOrTitle: string): boolean {\n const item = this.#findTabItem(nameOrTitle);\n if (item) {\n this.#list?.selectElement(item);\n return this.selectPanel(item.getAttribute(`for`) ?? ``) === true;\n }\n // Fall back to treating the value as a panel id directly.\n return this.selectPanel(nameOrTitle) === true;\n }\n\n #findTabItem(nameOrTitle: string): TabListItemElement | undefined {\n const list = this.#list;\n if (!list)\n return undefined;\n const items = Array.from(list.querySelectorAll(`ixfx-tab-list-item`)) as TabListItemElement[];\n\n // Prefer an exact match against the `for` attribute (panel id).\n for (const item of items) {\n if (item.getAttribute(`for`) === nameOrTitle)\n return item;\n }\n\n // Otherwise match on the tab's label text, case-insensitively.\n const label = nameOrTitle.trim().toLowerCase();\n for (const item of items) {\n if (this.#labelOf(item).toLowerCase() === label)\n return item;\n }\n return undefined;\n }\n\n /** The tab's visible label text, excluding any `slot=\"toolbar\"` content. */\n #labelOf(item: TabListItemElement): string {\n const clone = item.cloneNode(true) as HTMLElement;\n clone.querySelectorAll(`[slot=\"toolbar\"]`).forEach(el => el.remove());\n return (clone.textContent ?? ``).trim();\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 './form/form-group.js';\nexport * from './form/form-part.js';\nexport * from './form/form.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 './notifier/notification-pill.js';\nexport * from './notifier/manager.js';\nexport * from './notifier/pill-renderer.js';\nexport * from './notifier/types.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 './snackbar/snackbar.js';\nexport * from './snap-container/snap-container.js';\nexport * from './split-layout/split-layout.js';\nexport * from './swipe/index.js';\nexport * from './tabs/tab-controller.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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"}