@ixfx/components 0.6.1 → 0.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundle/index.d.ts +178 -56
- package/bundle/index.d.ts.map +1 -1
- package/bundle/index.js +1130 -628
- package/bundle/index.js.map +1 -1
- package/dist/ac-text.d.ts +1 -1
- package/dist/{ac-token-DVbmHmky.d.ts → ac-token-BAa6ke09.d.ts} +2 -2
- package/dist/{ac-token-DVbmHmky.d.ts.map → ac-token-BAa6ke09.d.ts.map} +1 -1
- package/dist/ac-token.d.ts +1 -1
- package/dist/button.d.ts +1 -1
- package/dist/button.d.ts.map +1 -1
- package/dist/colour-picker.d.ts +1 -1
- package/dist/crumbs.d.ts +1 -1
- package/dist/{data-grid-BeAkORz2.d.ts → data-grid-C8qIo1-u.d.ts} +2 -2
- package/dist/{data-grid-BeAkORz2.d.ts.map → data-grid-C8qIo1-u.d.ts.map} +1 -1
- package/dist/data-grid.d.ts +1 -1
- package/dist/{grouped-item-lister-CNLMgdIr.d.ts → grouped-item-lister-_pMDwIo1.d.ts} +2 -2
- package/dist/{grouped-item-lister-CNLMgdIr.d.ts.map → grouped-item-lister-_pMDwIo1.d.ts.map} +1 -1
- package/dist/grouped-item-lister.d.ts +1 -1
- package/dist/{icon-BUwP1CZ1.d.ts → icon-DpA9x2Ve.d.ts} +2 -2
- package/dist/icon-DpA9x2Ve.d.ts.map +1 -0
- package/dist/icons.d.ts +2 -2
- package/dist/{index-RqMh1i-O.d.ts → index-BtGFYfaK.d.ts} +2 -2
- package/dist/{index-RqMh1i-O.d.ts.map → index-BtGFYfaK.d.ts.map} +1 -1
- package/dist/{index-ovq_GTdl.d.ts → index-CKtLhgYj.d.ts} +3 -3
- package/dist/{index-ovq_GTdl.d.ts.map → index-CKtLhgYj.d.ts.map} +1 -1
- package/dist/{index-BUB5SICW.d.ts → index-CoqtMSd9.d.ts} +2 -2
- package/dist/{index-BUB5SICW.d.ts.map → index-CoqtMSd9.d.ts.map} +1 -1
- package/dist/{index-BOUaDIW-.d.ts → index-tq6f8007.d.ts} +2 -2
- package/dist/{index-BOUaDIW-.d.ts.map → index-tq6f8007.d.ts.map} +1 -1
- package/dist/index.d.ts +180 -58
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +840 -337
- package/dist/index.js.map +1 -1
- package/dist/{labelled-input-base-Dp_9KP0G.d.ts → labelled-input-base-DiTme1JO.d.ts} +2 -2
- package/dist/{labelled-input-base-Dp_9KP0G.d.ts.map → labelled-input-base-DiTme1JO.d.ts.map} +1 -1
- package/dist/labelled-radial-input.d.ts +3 -3
- package/dist/labelled-radial-input.d.ts.map +1 -1
- package/dist/labelled-range-input.d.ts +1 -1
- package/dist/{menu-item-BG5w7fi4.d.ts → menu-item-Bs2MYyHq.d.ts} +2 -2
- package/dist/{menu-item-BG5w7fi4.d.ts.map → menu-item-Bs2MYyHq.d.ts.map} +1 -1
- package/dist/menu.d.ts +2 -2
- package/dist/panel.d.ts +1 -1
- package/dist/polar-pad.d.ts +1 -1
- package/dist/{radial-input-BhZeyyP-.d.ts → radial-input-DXMN55Nz.d.ts} +2 -2
- package/dist/{radial-input-BhZeyyP-.d.ts.map → radial-input-DXMN55Nz.d.ts.map} +1 -1
- package/dist/radial-input.d.ts +1 -1
- package/dist/range-input.d.ts +1 -1
- package/dist/range.d.ts +1 -1
- package/dist/select-horiz.d.ts +1 -1
- package/dist/{slider-input-TidGhvXt.d.ts → slider-input-XppH3vcy.d.ts} +2 -2
- package/dist/{slider-input-TidGhvXt.d.ts.map → slider-input-XppH3vcy.d.ts.map} +1 -1
- package/dist/slider-input.d.ts +1 -1
- package/dist/swipe.d.ts +1 -1
- package/dist/{tab-list-Beuh2nom.d.ts → tab-list-D_1cYhB_.d.ts} +2 -2
- package/dist/{tab-list-Beuh2nom.d.ts.map → tab-list-D_1cYhB_.d.ts.map} +1 -1
- package/dist/tabs.d.ts +1 -1
- package/dist/wheel-nudge-BlSCe_hD.js.map +1 -1
- package/dist/{wheel-nudge-DgMTRYlh.d.ts → wheel-nudge-DGrNzWuE.d.ts} +3 -3
- package/dist/wheel-nudge-DGrNzWuE.d.ts.map +1 -0
- package/dist/xy-pad.d.ts +1 -1
- package/docs-user/index.json +2 -2
- package/package.json +2 -1
- package/dist/icon-BUwP1CZ1.d.ts.map +0 -1
- package/dist/wheel-nudge-DgMTRYlh.d.ts.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["#updateComputedItems","#handleToggleChange","#handleRadioChange","customElement","customElement","#separator","#onQuery","#sortCompare","#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","customElement","#renderIcon","customElement","#scaleTo100","#userMin","#userMax","#scaleFrom100","#userClamp","#updateScale","customElement","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"],"sources":["../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/grouped-item-lister/tree-list-adapter.ts","../src/grouped-item-lister/vertical-list-adapter.ts","../src/notifier/pill-renderer.ts","../src/notifier/manager.ts","../src/panel/panel-group.ts","../src/util/is-numeric.ts","../src/util/tooltip.ts","../src/util/drag.ts","../src/util/near.ts","../src/range/range-multi.ts","../src/rating/rating.ts","../src/toolbar/toolbar.ts","../src/toolbar/toolbar-group.ts","../src/tabs/tab-list-item.ts","../src/tabs/tab-panel.ts","../src/tabs/tab-controller.ts","../src/tabs/tab-panels.ts","../src/util/checkbox.ts","../src/index.ts"],"sourcesContent":["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 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 .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 SortCompareFn = (a: CrumbSegment, b: CrumbSegment) => number;\n\nexport type CrumbPathControllerOptions = {\n separator?: string;\n paths?: string[];\n onQuery?: (pathSegments: string[]) => Promise<CrumbSegment[]>;\n sortCompare?: SortCompareFn | null;\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 #sortCompare: SortCompareFn | null | undefined;\n\n constructor(options: CrumbPathControllerOptions = {}) {\n this.#separator = options.separator ?? `/`;\n this.#onQuery = options.onQuery;\n this.#sortCompare = options.sortCompare;\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 const mapped = 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 return this.#sortCompare ? [...mapped].sort(this.#sortCompare) : mapped;\n }\n\n if (this.#onQuery) {\n const newChildren = await this.#onQuery(pathSegments);\n\n const sorted = this.#sortCompare ? [...newChildren].sort(this.#sortCompare) : newChildren;\n for (const child of sorted) {\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 sorted;\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}","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 { ListInteractionMode, ListSelectionMode } from '../vertical-list/types.js';\nimport type { VerticalListElement } from '../vertical-list/vertical-list.js';\nimport type { IGroupedSubComponent, SubComponentSelectDetail } from './types.js';\nimport '../vertical-list/vertical-list.js';\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport type VerticalListAdapterOptions = {\n /** Initial selection mode forwarded to the inner ixfx-vertical-list. Default: `'single'`. */\n selectionMode?: ListSelectionMode;\n\n /** Interaction mode forwarded to the inner ixfx-vertical-list. Default: `'standard'`. */\n interactionMode?: ListInteractionMode;\n\n /**\n * Called when a command is dispatched via `ixfx-grouped-item-lister.dispatch()`.\n *\n * Receives the current inner `VerticalListElement` (undefined until the first\n * `setItems()` call) so the handler can sort, filter, or otherwise mutate the\n * list directly.\n *\n * @example Sort items alphabetically by text content:\n * ```ts\n * onDispatch: (id, _args, list) => {\n * if (id !== 'sort-alpha' || !list) return;\n * const rows = [...list.querySelectorAll<HTMLElement>('li')];\n * rows.sort((a, b) => (a.textContent ?? '').localeCompare(b.textContent ?? ''));\n * for (const row of rows) list.appendChild(row);\n * }\n * ```\n */\n onDispatch?: (\n commandId: CommandId,\n args: Record<string, unknown> | undefined,\n list: VerticalListElement | undefined,\n ) => void;\n};\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\n/**\n * Creates an `HTMLElement` that implements `IGroupedSubComponent<T>` by wrapping\n * an `ixfx-vertical-list` internally.\n *\n * Items are typed as `T`. The `renderItem` function converts each item to a DOM\n * element (typically an `<li>`) that `ixfx-vertical-list` renders and handles\n * pointer/keyboard interaction for.\n *\n * The returned element bridges the `list-*` event names fired by\n * `ixfx-vertical-list` to the `select / activate / item-click / tickle` names\n * required by `IGroupedSubComponent`, and maps element-based selection sets back\n * to typed `T` values.\n *\n * @example Basic usage with ixfx-grouped-item-lister:\n * ```ts\n * lister.factory = () =>\n * createVerticalListAdapter<MyItem>(item => {\n * const li = document.createElement('li');\n * li.textContent = item.label;\n * return li;\n * });\n * ```\n */\nexport function createVerticalListAdapter<T>(\n renderItem: (item: T) => Element,\n options?: VerticalListAdapterOptions,\n): HTMLElement & IGroupedSubComponent<T> {\n // Plain div — not a custom element, so appendChild is safe at any time.\n // display:contents makes it invisible in layout; the inner list is treated\n // as if it were a direct child of whatever the adapter is placed inside.\n const container = document.createElement(`div`);\n container.style.cssText = `display:contents;`;\n\n let listEl: VerticalListElement | undefined;\n let selectionMode: ListSelectionMode = options?.selectionMode ?? `single`;\n let elToItem = new WeakMap<Element, T>();\n\n // ---- Internal helpers ----\n\n function getOrCreateList(): VerticalListElement {\n if (listEl)\n return listEl;\n\n listEl = document.createElement(`ixfx-vertical-list`) as VerticalListElement;\n // Override :host { height:100% } so the list sizes to its content\n // when placed inside a panel with no explicit height.\n listEl.style.cssText = `height:auto;width:100%;`;\n listEl.selectionMode = selectionMode;\n if (options?.interactionMode)\n listEl.interactionMode = options.interactionMode;\n\n container.appendChild(listEl);\n attachBridgeListeners();\n\n return listEl;\n }\n\n function attachBridgeListeners(): void {\n listEl!.addEventListener(`list-select`, (e) => {\n const detail: SubComponentSelectDetail<T> = {\n selected: mapEls(e.detail.selected),\n previous: mapEls(e.detail.previous),\n };\n container.dispatchEvent(\n new CustomEvent(`select`, { detail, bubbles: true, composed: true }),\n );\n });\n\n listEl!.addEventListener(`list-activate`, (e) => {\n const item = elToItem.get(e.detail.item);\n if (item !== undefined) {\n container.dispatchEvent(\n new CustomEvent(`activate`, { detail: { item }, bubbles: true, composed: true }),\n );\n }\n });\n\n listEl!.addEventListener(`list-item-click`, (e) => {\n const item = elToItem.get(e.detail.item);\n if (item !== undefined) {\n container.dispatchEvent(\n new CustomEvent(`item-click`, { detail: { item }, bubbles: true, composed: true }),\n );\n }\n });\n\n listEl!.addEventListener(`list-tickle`, (e) => {\n const item = elToItem.get(e.detail.item);\n if (item !== undefined) {\n container.dispatchEvent(\n new CustomEvent(`tickle`, { detail: { item }, bubbles: true, composed: true }),\n );\n }\n });\n }\n\n function applyItems(items: readonly T[]): void {\n const list = getOrCreateList();\n list.clearItems();\n elToItem = new WeakMap();\n for (const item of items) {\n const el = renderItem(item);\n elToItem.set(el, item);\n list.addItem(el);\n }\n }\n\n function mapEls(els: ReadonlySet<Element>): ReadonlySet<T> {\n const result = new Set<T>();\n for (const el of els) {\n const item = elToItem.get(el);\n if (item !== undefined)\n result.add(item);\n }\n return result;\n }\n\n // ---- IGroupedSubComponent methods ----\n\n const adapter = Object.assign(container, {\n setItems(items: readonly T[]): void {\n applyItems(items);\n },\n\n clearSelection(): void {\n listEl?.clearSelection();\n },\n\n dispatch(commandId: CommandId, args?: Record<string, unknown>): void {\n options?.onDispatch?.(commandId, args, listEl);\n },\n });\n\n // Getters/setters require defineProperties — Object.assign would invoke them\n Object.defineProperties(adapter, {\n selectedItems: {\n get(): ReadonlySet<T> {\n return listEl ? mapEls(listEl.selectedItems) : new Set<T>();\n },\n enumerable: true,\n configurable: true,\n },\n selectionMode: {\n get(): ListSelectionMode {\n return listEl?.selectionMode ?? selectionMode;\n },\n set(v: ListSelectionMode) {\n selectionMode = v;\n if (listEl)\n listEl.selectionMode = v;\n },\n enumerable: true,\n configurable: true,\n },\n });\n\n return adapter as unknown as HTMLElement & IGroupedSubComponent<T>;\n}\n","import type { 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 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, duration, managed.id);\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 function isNumeric(str: unknown): boolean {\n if (typeof str === `number`)\n return true;\n if (typeof str !== `string`)\n return false;\n const trimmed = str.trim();\n return trimmed !== `` && !Number.isNaN(Number(trimmed));\n}","import { html, LitElement, nothing } from \"lit\";\nimport { property } from \"lit/decorators.js\";\nimport { classMap } from \"lit/directives/class-map.js\";\nimport { unsafeHTML } from \"lit/directives/unsafe-html.js\";\nimport { getIcon } from \"../icons/index.js\";\nimport { safeCustomElement as customElement } from \"./custom-elements.js\";\nimport { isNumeric } from \"./is-numeric.js\";\n\nexport type FormatValueForHuman = (v: unknown) => string;\nexport type TooltipOrientations = `top` | `right` | `bottom` | `left`;\n\n// `ixfx-tooltip` renders to light DOM (see createRenderRoot() below) so it can inherit\n// styling from whatever shadow root it's embedded in (e.g. range-input bundles its own\n// tooltipValueStyles for a scoped bubble-arrow look). That means Lit's `static styles`\n// mechanism can't apply here (it needs adoptedStyleSheets, only available on a ShadowRoot\n// or Document) - so a *standalone* `ixfx-tooltip` (appended directly to <body>, not nested\n// in another component's shadow root) gets no styling at all unless something supplies it.\n// This injects that baseline once, globally, scoped to the bare tag so it never leaks into\n// (or fights with) a host component's own shadow-scoped tooltip styles.\nlet _baseStylesInjected = false;\nfunction ensureBaseTooltipStyles(): void {\n if (_baseStylesInjected)\n return;\n _baseStylesInjected = true;\n const style = document.createElement(`style`);\n style.textContent = `\n ixfx-tooltip {\n display: inline-block;\n background: var(--surface-5);\n color: var(--surface-5-text);\n border: var(--border);\n border-radius: var(--radius-l, 6px);\n box-shadow: var(--shadow-m);\n padding: var(--space-s, 4px);\n font-size: 10px;\n font-family: var(--font-family, inherit);\n }\n ixfx-tooltip .tooltip-type-number {\n font-family: var(--font-mono, ui-monospace, monospace);\n }\n `;\n document.head.appendChild(style);\n}\n\n@customElement(`ixfx-tooltip`)\nexport class TooltipElement extends LitElement {\n override connectedCallback(): void {\n super.connectedCallback();\n ensureBaseTooltipStyles();\n }\n\n static numberFormatter = (v: number) => Math.floor(v).toString();\n\n static defaultFormatter: FormatValueForHuman = (v) => {\n if (typeof v === `number`) {\n if (Number.isInteger(v))\n return v.toString();\n return v.toFixed(2);\n } else if (typeof v === `string`) {\n return v;\n } else {\n return JSON.stringify(v);\n }\n };\n\n valueFormatTooltip: FormatValueForHuman = TooltipElement.defaultFormatter;\n\n @property({ type: String })\n orientation: TooltipOrientations = `top`;\n\n @property({ type: String })\n anchor = `--tooltip`;\n\n @property()\n value: unknown;\n\n @property({ type: String })\n icon?: string;\n\n #renderIcon() {\n if (!this.icon)\n return nothing;\n\n if (this.icon.startsWith(`<svg`)) {\n return html`<span class=\"tooltip-icon\" style=\"display:inline-flex;align-items:center;margin-right:0.25em\">${unsafeHTML(this.icon)}</span>`;\n }\n\n const svg = getIcon(this.icon);\n\n if (!svg)\n return nothing;\n\n return html`<ixfx-icon class=\"tooltip-icon\" style=\"margin-right:0.25em\" name=\"${this.icon}\"></ixfx-icon>`;\n }\n\n protected render() {\n const classes = {\n \"tooltip\": true,\n \"tooltip-orientation-top\": this.orientation === `top`,\n \"tooltip-orientation-bottom\": this.orientation === `bottom`,\n \"tooltip-orientation-right\": this.orientation === `right`,\n \"tooltip-orientation-left\": this.orientation === `left`,\n \"tooltip-type-text\": true,\n \"tooltip-type-number\": false,\n \"tooltip-style-bubble\": true,\n };\n let value = ``;\n switch (typeof this.value) {\n case `number`:\n classes[`tooltip-type-number`] = true;\n value = this.valueFormatTooltip(this.value);\n break;\n case `string`:\n if (isNumeric(this.value)) {\n classes[`tooltip-type-number`] = true;\n value = this.valueFormatTooltip(Number.parseFloat(this.value));\n } else {\n value = this.value;\n }\n break;\n default:\n value = JSON.stringify(this.value);\n }\n return html`<output style=\"--anchor-id: ${this.anchor}\" class=${classMap(classes)}>${this.#renderIcon()}${value}</output>`;\n }\n\n protected createRenderRoot() {\n return this;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ixfx-tooltip\": TooltipElement;\n }\n}\n","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 { customElement, property, state } from 'lit/decorators.js';\nimport { prominenceStyles } from '../styles/prominence.js';\n\nexport type RatingVariant = `star` | `square` | `heart`;\nexport type RatingChangeDetail = Readonly<{ value: number; oldValue: number }>;\nexport type RatingChangeEvent = CustomEvent<RatingChangeDetail>;\nexport type RatingInputEvent = CustomEvent<RatingChangeDetail>;\nexport interface RatingElementEventMap {\n change: RatingChangeEvent;\n input: RatingInputEvent;\n}\n\n@customElement(`ixfx-rating`)\nexport class RatingElement extends LitElement {\n static override styles = [prominenceStyles, css`\n :host {\n --ixfx-rating-size: 1.5rem;\n --ixfx-rating-gap: 0.2rem;\n --ixfx-rating-color: var(--surface-4);\n --ixfx-rating-color-active: var(--accent);\n --ixfx-rating-color-hover: var(--accent);\n display: inline-flex;\n gap: var(--ixfx-rating-gap);\n align-items: center;\n user-select: none;\n --transition: 0.15s ease;\n }\n :host([readonly]) { pointer-events: none; filter: none; }\n :host(:focus-visible) { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: 2px; }\n .glyph {\n width: var(--ixfx-rating-size);\n height: var(--ixfx-rating-size);\n position: relative;\n cursor: pointer;\n flex-shrink: 0;\n color: var(--ixfx-rating-glyph-color, var(--ixfx-rating-color));\n transition: color var(--transition), transform var(--transition);\n }\n .glyph.filled { color: var(--ixfx-rating-glyph-color-active, var(--ixfx-rating-color-active)); }\n .glyph.preview { color: var(--ixfx-rating-glyph-color-hover, var(--ixfx-rating-color-hover)); }\n .glyph.half .fill { clip-path: inset(0 50% 0 0); }\n .glyph svg { width: 100%; height: 100%; display: block; }\n .glyph .fill { position: absolute; inset: 0; color: var(--ixfx-rating-glyph-color-active, var(--ixfx-rating-color-active)); }\n .glyph.preview .fill { color: var(--ixfx-rating-glyph-color-hover, var(--ixfx-rating-color-hover)); }\n .glyph .bg { color: var(--ixfx-rating-glyph-color, var(--ixfx-rating-color)); }\n /* per-rank vars: consumer sets --ixfx-rating-1-color etc outside shadow, we map via inline style fallback */\n `];\n\n @property({ type: Number }) value = 0;\n @property({ type: Number }) max = 5;\n @property({ type: Boolean, attribute: `allow-half` }) allowHalf = false;\n @property({ type: Boolean, reflect: true }) disabled = false;\n @property({ type: Boolean, reflect: true }) readonly = false;\n @property({ type: String }) variant: RatingVariant = `star`;\n\n @state() private _preview: number | null = null;\n\n override connectedCallback() {\n super.connectedCallback();\n this.setAttribute(`role`, `slider`);\n this.tabIndex = this.disabled || this.readonly ? -1 : 0;\n }\n\n protected override updated(changed: Map<string, unknown>) {\n if (changed.has(`disabled`) || changed.has(`readonly`)) {\n this.tabIndex = this.disabled || this.readonly ? -1 : 0;\n this.setAttribute(`aria-disabled`, String(this.disabled));\n }\n this.setAttribute(`aria-valuenow`, String(this.value));\n this.setAttribute(`aria-valuemin`, `0`);\n this.setAttribute(`aria-valuemax`, String(this.max));\n this.setAttribute(`aria-readonly`, String(this.readonly));\n }\n\n private _path(v: RatingVariant) {\n if (v === `heart`)\n return `M12 21s-6.5-4.2-8.5-8.2A4.5 4.5 0 0 1 12 5a4.5 4.5 0 0 1 8.5 7.8C18.5 16.8 12 21 12 21z`;\n if (v === `square`)\n return `M3 3h18v18H3z`;\n return `M12 2l2.4 7.4H22l-6.2 4.5 2.4 7.4L12 17 5.8 21.3l2.4-7.4L2 9.4h7.6z`;\n }\n\n private _effective() {\n return this._preview ?? this.value;\n }\n\n private _commit(newVal: number) {\n if (this.disabled || this.readonly)\n return;\n const oldValue = this.value;\n if (newVal === oldValue)\n newVal = 0;\n if (newVal === oldValue)\n return;\n this.value = newVal;\n this.dispatchEvent(new CustomEvent<RatingChangeDetail>(`input`, { detail: { value: newVal, oldValue }, bubbles: true, composed: true }));\n this.dispatchEvent(new CustomEvent<RatingChangeDetail>(`change`, { detail: { value: newVal, oldValue }, bubbles: true, composed: true }));\n }\n\n private _calc(e: PointerEvent, index: number) {\n if (!this.allowHalf)\n return index + 1;\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n return e.clientX - rect.left < rect.width / 2 ? index + 0.5 : index + 1;\n }\n\n protected override render() {\n const eff = this._effective();\n const hovering = this._preview !== null;\n return html`${Array.from({ length: this.max }, (_, i) => {\n const rank = i + 1;\n const filled = eff >= rank;\n const half = !filled && eff >= rank - 0.5;\n const cls = `glyph ${filled ? `filled` : ``} ${half ? `half` : ``} ${hovering && (filled || half) ? `preview` : ``}`;\n // per-rank CSS var mapping via inline style so outer --ixfx-rating-N-color cascades\n const style = `--ixfx-rating-glyph-color:var(--ixfx-rating-${rank}-color, var(--ixfx-rating-color));--ixfx-rating-glyph-color-active:var(--ixfx-rating-${rank}-color-active, var(--ixfx-rating-color-active));--ixfx-rating-glyph-color-hover:var(--ixfx-rating-${rank}-color-hover, var(--ixfx-rating-color-hover));${half || filled ? `` : ``}`;\n const d = this._path(this.variant);\n return html`<span class=${cls} style=${style}\n @pointermove=${(e: PointerEvent) => {\n if (this.disabled || this.readonly)\n return; this._preview = this._calc(e, i);\n }}\n @pointerleave=${() => this._preview = null}\n @click=${(e: PointerEvent) => this._commit(this._calc(e, i))}>\n <svg viewBox=\"0 0 24 24\" class=\"bg\" fill=\"currentColor\"><path d=${d}></path></svg>\n ${(filled || half) ? html`<svg viewBox=\"0 0 24 24\" class=\"fill\" fill=\"currentColor\"><path d=${d}></path></svg>` : ``}\n </span>`;\n })}`;\n }\n\n override firstUpdated() {\n this.addEventListener(`pointerleave`, () => this._preview = null);\n this.addEventListener(`keydown`, (e: KeyboardEvent) => {\n if (this.disabled || this.readonly)\n return;\n const step = this.allowHalf ? 0.5 : 1;\n if (e.key === `ArrowRight` || e.key === `ArrowUp`) {\n e.preventDefault(); this._commit(Math.min(this.max, this.value + step));\n } else if (e.key === `ArrowLeft` || e.key === `ArrowDown`) {\n e.preventDefault(); this._commit(Math.max(0, this.value - step));\n } else if (e.key === `Home`) {\n e.preventDefault(); this._commit(0);\n } else if (e.key === `End`) {\n e.preventDefault(); this._commit(this.max);\n } else if (/^\\d$/.test(e.key)) {\n e.preventDefault(); const n = parseInt(e.key, 10); this._commit(Math.min(n, this.max));\n }\n });\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap { 'ixfx-rating': RatingElement }\n}\nexport interface IxfxRatingElement {\n addEventListener: (<K extends keyof RatingElementEventMap>(type: K, listener: (this: RatingElement, ev: RatingElementEventMap[K]) => void, options?: boolean | AddEventListenerOptions) => void) & ((type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions) => void);\n removeEventListener: (<K extends keyof RatingElementEventMap>(type: K, listener: (this: RatingElement, ev: RatingElementEventMap[K]) => void, options?: boolean | EventListenerOptions) => void) & ((type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions) => void);\n}\n","import type { ToolbarLayout, ToolbarOrientation, ToolbarVerticalWriting } from './types.js';\nimport { css, html, LitElement } from 'lit';\nimport { property, query, 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\n@customElement(`ixfx-toolbar`)\nexport class ToolbarElement extends LitElement {\n @property({ type: String, reflect: true }) orientation: ToolbarOrientation = `horizontal`;\n @property({ type: String, reflect: true }) layout: ToolbarLayout = `one-line`;\n @property({ type: String, attribute: `vertical-writing`, reflect: true }) verticalWriting: ToolbarVerticalWriting = `auto`;\n @property({ type: Boolean, attribute: `show-group-labels`, reflect: true }) showGroupLabels = false;\n @property({ type: Boolean, attribute: `invisible-groups`, reflect: true }) invisibleGroups = false;\n\n @state() private _overflowCount = 0;\n private _ro: ResizeObserver | null = null;\n private static _cnt = 0;\n private _anchor = `--toolbar-${ToolbarElement._cnt++}`;\n /** Natural size of items, captured while they are measurable in the main slot. */\n private _sizes = new WeakMap<HTMLElement, number>();\n private _measureQueued = false;\n\n @query(`.inner`) private _inner!: HTMLElement;\n @query(`.overflow-popover`) private _popover!: HTMLElement;\n @query(`slot`) private _slot!: HTMLSlotElement;\n\n static override styles = [themeFallbacks, popupSurfaceStyles, css`\n :host {\n --toolbar-gap: var(--space-s);\n --toolbar-group-gap: var(--space-m);\n display: block;\n container-type: inline-size;\n }\n :host([orientation=\"vertical-left\"]),\n :host([orientation=\"vertical-right\"]) {\n container-type: normal;\n width: max-content;\n }\n :host([orientation=\"vertical-left\"]),\n :host([orientation=\"vertical-right\"]) { height: 100%; }\n :host([orientation=\"vertical-left\"]) .inner,\n :host([orientation=\"vertical-right\"]) .inner { height: 100%; box-sizing: border-box; width: max-content; }\n .inner {\n display: flex;\n gap: var(--toolbar-gap);\n background: var(--toolbar-bg, var(--surface-2));\n padding: var(--toolbar-padding, var(--space-s));\n border: var(--toolbar-border, var(--border-subtle));\n border-radius: var(--radius-s);\n align-items: center;\n }\n :host([orientation=\"horizontal\"]) .inner { flex-direction: row; justify-content: flex-start; }\n :host([orientation=\"vertical-left\"]) .inner { flex-direction: column-reverse; align-items: stretch; }\n :host([orientation=\"vertical-right\"]) .inner { flex-direction: column; align-items: stretch; }\n :host([layout=\"wrap\"]) .inner { flex-wrap: wrap; }\n :host([layout=\"one-line\"]) .inner { flex-wrap: nowrap; overflow: hidden; }\n :host([orientation=\"vertical-left\"][vertical-writing=\"auto\"]) ::slotted(*) { writing-mode: sideways-lr; }\n :host([orientation=\"vertical-right\"][vertical-writing=\"auto\"]) ::slotted(*) { writing-mode: vertical-lr; }\n :host([vertical-writing=\"up\"]) ::slotted(*) { writing-mode: vertical-rl; text-orientation: upright; }\n :host([vertical-writing=\"down\"]) ::slotted(*) { writing-mode: vertical-lr; }\n :host([vertical-writing=\"none\"]) ::slotted(*) { writing-mode: horizontal-tb; }\n ::slotted(*) { flex: 0 0 auto; }\n ::slotted([grow]), ::slotted(ixfx-toolbar-group[grow]) { flex: 1 1 auto; }\n ::slotted([hidden]) { display: none !important; }\n :host([invisible-groups]) ::slotted(ixfx-toolbar-group) { --toolbar-group-border: none; }\n .overflow-btn {\n anchor-name: var(--anchor-name);\n flex-shrink: 0;\n background: var(--surface-3);\n border: var(--border);\n border-radius: var(--radius-s);\n padding: var(--space-xs) var(--space-s);\n cursor: pointer;\n display: none;\n }\n .overflow-btn[visible] { display: inline-flex; }\n .overflow-popover {\n position: fixed;\n top: anchor(bottom);\n left: anchor(right);\n position-anchor: var(--anchor-name);\n position-try-fallbacks: flip-block, flip-inline, flip-block flip-inline;\n margin: 8px;\n max-height: min(60vh, 400px);\n max-width: min(90vw, 320px);\n overflow: auto;\n overscroll-behavior: contain;\n z-index: 100;\n padding: var(--space-s);\n flex-direction: column;\n gap: var(--space-s);\n }\n .overflow-popover:popover-open { display: flex; }\n .overflow-popover ::slotted(*) { writing-mode: horizontal-tb; text-orientation: mixed; }\n `];\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.style.setProperty(`--anchor-name`, this._anchor);\n }\n\n protected override firstUpdated(): void {\n this._slot.addEventListener(`slotchange`, () => this._scheduleMeasure());\n this._ro = new ResizeObserver(() => this._scheduleMeasure());\n this._ro.observe(this._inner);\n this._scheduleMeasure();\n this._updateGroupLabels();\n }\n\n protected override updated(changed: Map<string, unknown>): void {\n if (changed.has(`showGroupLabels`))\n this._updateGroupLabels();\n }\n\n private _updateGroupLabels(): void {\n for (const child of Array.from(this.children) as HTMLElement[]) {\n if (child.tagName === `IXFX-TOOLBAR-GROUP`) {\n if (this.showGroupLabels) {\n child.setAttribute(`show-label`, ``);\n } else {\n child.removeAttribute(`show-label`);\n }\n }\n }\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this._ro?.disconnect();\n }\n\n /** Coalesce measure passes into one per frame; prevents slotchange feedback loops. */\n private _scheduleMeasure(): void {\n if (this._measureQueued)\n return;\n this._measureQueued = true;\n requestAnimationFrame(() => {\n this._measureQueued = false;\n this._measure();\n });\n }\n\n private _measure(): void {\n const children = Array.from(this.children) as HTMLElement[];\n const isGrow = (el: HTMLElement) => el.hasAttribute(`grow`) || el.matches(`[grow]`);\n const overflowable = children.filter(el => !isGrow(el));\n const isHoriz = this.orientation === `horizontal`;\n\n if (this.layout !== `one-line`) {\n let mutated = false;\n for (const el of children) {\n if (el.getAttribute(`slot`) === `overflow`) {\n el.removeAttribute(`slot`); mutated = true;\n }\n if (el.hasAttribute(`hidden`)) {\n el.removeAttribute(`hidden`); mutated = true;\n }\n }\n if (this._overflowCount !== 0) {\n this._overflowCount = 0; mutated = true;\n }\n if (mutated)\n this.requestUpdate();\n return;\n }\n\n if (!this._inner)\n return;\n const cs = getComputedStyle(this._inner);\n const gap = (isHoriz ? Number.parseFloat(cs.columnGap) : Number.parseFloat(cs.rowGap)) || 0;\n const available = isHoriz ? this._inner.clientWidth : this._inner.clientHeight;\n const btnSize = 36;\n\n const inMain = overflowable.filter(el => el.getAttribute(`slot`) !== `overflow`);\n const inOverflow = overflowable.filter(el => el.getAttribute(`slot`) === `overflow`);\n\n // Cache natural sizes while items are measurable in the main slot\n let cum = 0;\n inMain.forEach((el, i) => {\n const s = isHoriz ? el.offsetWidth : el.offsetHeight;\n if (s > 0)\n this._sizes.set(el, s);\n cum += (i ? gap : 0) + (this._sizes.get(el) ?? s);\n });\n const btnAllowance = inOverflow.length > 0 ? gap + btnSize : 0;\n\n let mutated = false;\n\n // Move items to overflow, last-first, until the main run fits\n while (inMain.length > 0 && cum + btnAllowance > available) {\n const last = inMain[inMain.length - 1];\n const s = this._sizes.get(last) ?? 0;\n last.setAttribute(`slot`, `overflow`);\n inMain.pop();\n inOverflow.unshift(last);\n cum -= (inMain.length ? gap : 0) + s;\n mutated = true;\n }\n\n // Move items back, first-from-overflow, only while their cached natural size fits.\n // Cached sizes are always > 0, so this cannot oscillate with the 0px measurements\n // that items report inside the closed popover.\n while (inOverflow.length > 0) {\n const first = inOverflow[0];\n const s = this._sizes.get(first);\n if (s === undefined)\n break; // never measured in main slot; stay conservative\n const addGap = inMain.length ? gap : 0;\n const nextBtnAllowance = inOverflow.length > 1 ? gap + btnSize : 0;\n if (cum + addGap + s + nextBtnAllowance > available)\n break;\n first.removeAttribute(`slot`);\n inOverflow.shift();\n inMain.push(first);\n cum += addGap + s;\n mutated = true;\n }\n\n const newCount = inOverflow.length;\n if (newCount !== this._overflowCount) {\n this._overflowCount = newCount; mutated = true;\n }\n if (mutated)\n this.requestUpdate();\n }\n\n private _toggleOverflow(): void {\n try {\n (this._popover as any).togglePopover();\n } catch {\n (this._popover as any).showPopover();\n }\n }\n\n protected override render() {\n const hasOverflow = this._overflowCount > 0;\n return html`\n <div class=\"inner\" role=\"toolbar\" aria-orientation=${this.orientation}>\n <slot></slot>\n <button class=\"overflow-btn\" ?visible=${hasOverflow} @click=${this._toggleOverflow} aria-label=\"More\" aria-haspopup=\"true\" aria-expanded=${this._popover?.matches(`:popover-open`) ?? false}>⋯</button>\n </div>\n <div class=\"overflow-popover popup-surface\" popover=\"auto\" @click=${(e: Event) => e.stopPropagation()}>\n <slot name=\"overflow\"></slot>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap { 'ixfx-toolbar': ToolbarElement }\n}\n","import { css, html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\n\n@customElement(`ixfx-toolbar-group`)\nexport class ToolbarGroupElement extends LitElement {\n @property({ type: String }) label = ``;\n @property({ type: Boolean, reflect: true }) grow = false;\n\n static override styles = [themeFallbacks, css`\n :host {\n display: flex;\n flex-direction: column;\n align-items: var(--toolbar-group-align-items, center);\n justify-content: var(--toolbar-group-justify-content, flex-start);\n gap: var(--toolbar-gap, var(--space-s));\n padding: var(--space-xs);\n border: 1px solid var(--border-subtle, var(--border));\n border-radius: var(--radius-s);\n background: var(--surface-3);\n min-width: 0;\n }\n :host(:not([label])) {\n border: none;\n background: transparent;\n padding: 0;\n }\n .label-row {\n display: none;\n font-size: var(--text-s, 12px);\n color: var(--surface-muted-text);\n padding-inline: var(--space-xs);\n white-space: nowrap;\n border-bottom: 1px solid var(--border-subtle);\n margin-bottom: var(--space-xs);\n }\n :host([label][show-label]) .label-row { display: block; }\n :host(:not([label])) .label-row { display: none; }\n :host([grow]) { flex: 1 1 auto; min-width: 0; }\n :host([hidden]) { display: none !important; }\n .components { display: flex; }\n ::slotted(*) { flex: 0 0 auto; }\n ::slotted([grow]) { flex: 1 1 auto; }\n `];\n\n protected override render() {\n return html`\n <div class=\"label-row\">${this.label}</div>\n <div class=\"components\">\n <slot></slot>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap { 'ixfx-toolbar-group': ToolbarGroupElement }\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: vertical padding for the tab content (default: var(--space-m))\n * --ixfx-tab-padding-horizontal: horizontal padding (default: same as --ixfx-tab-padding)\n */\n@customElement(`ixfx-tab-list-item`)\nexport class TabListItemElement extends LitElement {\n @property({ type: Boolean })\n closeable = false;\n\n @property({ type: Boolean, attribute: `hide-labels` })\n hideLabels = 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 @state() private _hasToolbarContent = 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 const toolbarSlot = this.shadowRoot?.querySelector(`slot[name=\"toolbar\"]`);\n toolbarSlot?.addEventListener(`slotchange`, this._onToolbarSlotChange);\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 const toolbarSlot = this.shadowRoot?.querySelector(`slot[name=\"toolbar\"]`);\n toolbarSlot?.removeEventListener(`slotchange`, this._onToolbarSlotChange);\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 private _onToolbarSlotChange = () => {\n this._updateToolbarContent();\n };\n\n private _updateToolbarContent() {\n const slot = this.shadowRoot?.querySelector(`slot[name=\"toolbar\"]`) as HTMLSlotElement | null;\n this._hasToolbarContent = (slot?.assignedElements().length ?? 0) > 0;\n }\n\n override firstUpdated() {\n this._updateToolbarContent();\n }\n\n override render() {\n const showLabel = !this.hideLabels || !this.iconName;\n const hasActions = this.closeable || this._hasToolbarContent;\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 ${hasActions\n ? html`\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 `\n : nothing}\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 height:fit-content;\n }\n\n :host > div {\n display: flex;\n align-items: center;\n padding: var(--tab-padding) calc(2 * var(--tab-padding-horizontal, var(--tab-padding)));\n min-width: 0;\n width: 100%;\n font-weight: 500;\n border: var(--selected-tab-border-width) solid transparent;\n gap: var(--space-s);\n\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 border-radius:var(--radius-m);\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","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 './data-grid/data-grid.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/manager.js';\nexport * from './notifier/notification-pill.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 './rating/rating.js';\nexport * from './select-horiz/select-horiz.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 './toolbar/toolbar.js';\nexport * from './toolbar/toolbar-group.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":["#updateComputedItems","#handleToggleChange","#handleRadioChange","customElement","customElement","#separator","#onQuery","#sortCompare","#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","customElement","#renderIcon","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","customElement","customElement","customElement"],"sources":["../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/grouped-item-lister/tree-list-adapter.ts","../src/grouped-item-lister/vertical-list-adapter.ts","../src/notifier/pill-renderer.ts","../src/notifier/manager.ts","../src/panel/panel-group.ts","../src/util/is-numeric.ts","../src/util/tooltip.ts","../src/util/drag.ts","../src/util/near.ts","../src/range/range-multi.ts","../src/rating/rating.ts","../src/sliding-number/sliding-number.ts","../src/tabs/tab-list-item.ts","../src/tabs/tab-panel.ts","../src/tabs/tab-controller.ts","../src/tabs/tab-panels.ts","../src/text-shimmer/text-shimmer.ts","../src/toolbar/toolbar-group.ts","../src/toolbar/toolbar.ts","../src/util/checkbox.ts","../src/index.ts"],"sourcesContent":["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 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 .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 SortCompareFn = (a: CrumbSegment, b: CrumbSegment) => number;\n\nexport type CrumbPathControllerOptions = {\n separator?: string;\n paths?: string[];\n onQuery?: (pathSegments: string[]) => Promise<CrumbSegment[]>;\n sortCompare?: SortCompareFn | null;\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 #sortCompare: SortCompareFn | null | undefined;\n\n constructor(options: CrumbPathControllerOptions = {}) {\n this.#separator = options.separator ?? `/`;\n this.#onQuery = options.onQuery;\n this.#sortCompare = options.sortCompare;\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 const mapped = 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 return this.#sortCompare ? [...mapped].sort(this.#sortCompare) : mapped;\n }\n\n if (this.#onQuery) {\n const newChildren = await this.#onQuery(pathSegments);\n\n const sorted = this.#sortCompare ? [...newChildren].sort(this.#sortCompare) : newChildren;\n for (const child of sorted) {\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 sorted;\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}","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 { ListInteractionMode, ListSelectionMode } from '../vertical-list/types.js';\nimport type { VerticalListElement } from '../vertical-list/vertical-list.js';\nimport type { IGroupedSubComponent, SubComponentSelectDetail } from './types.js';\nimport '../vertical-list/vertical-list.js';\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport type VerticalListAdapterOptions = {\n /** Initial selection mode forwarded to the inner ixfx-vertical-list. Default: `'single'`. */\n selectionMode?: ListSelectionMode;\n\n /** Interaction mode forwarded to the inner ixfx-vertical-list. Default: `'standard'`. */\n interactionMode?: ListInteractionMode;\n\n /**\n * Called when a command is dispatched via `ixfx-grouped-item-lister.dispatch()`.\n *\n * Receives the current inner `VerticalListElement` (undefined until the first\n * `setItems()` call) so the handler can sort, filter, or otherwise mutate the\n * list directly.\n *\n * @example Sort items alphabetically by text content:\n * ```ts\n * onDispatch: (id, _args, list) => {\n * if (id !== 'sort-alpha' || !list) return;\n * const rows = [...list.querySelectorAll<HTMLElement>('li')];\n * rows.sort((a, b) => (a.textContent ?? '').localeCompare(b.textContent ?? ''));\n * for (const row of rows) list.appendChild(row);\n * }\n * ```\n */\n onDispatch?: (\n commandId: CommandId,\n args: Record<string, unknown> | undefined,\n list: VerticalListElement | undefined,\n ) => void;\n};\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\n/**\n * Creates an `HTMLElement` that implements `IGroupedSubComponent<T>` by wrapping\n * an `ixfx-vertical-list` internally.\n *\n * Items are typed as `T`. The `renderItem` function converts each item to a DOM\n * element (typically an `<li>`) that `ixfx-vertical-list` renders and handles\n * pointer/keyboard interaction for.\n *\n * The returned element bridges the `list-*` event names fired by\n * `ixfx-vertical-list` to the `select / activate / item-click / tickle` names\n * required by `IGroupedSubComponent`, and maps element-based selection sets back\n * to typed `T` values.\n *\n * @example Basic usage with ixfx-grouped-item-lister:\n * ```ts\n * lister.factory = () =>\n * createVerticalListAdapter<MyItem>(item => {\n * const li = document.createElement('li');\n * li.textContent = item.label;\n * return li;\n * });\n * ```\n */\nexport function createVerticalListAdapter<T>(\n renderItem: (item: T) => Element,\n options?: VerticalListAdapterOptions,\n): HTMLElement & IGroupedSubComponent<T> {\n // Plain div — not a custom element, so appendChild is safe at any time.\n // display:contents makes it invisible in layout; the inner list is treated\n // as if it were a direct child of whatever the adapter is placed inside.\n const container = document.createElement(`div`);\n container.style.cssText = `display:contents;`;\n\n let listEl: VerticalListElement | undefined;\n let selectionMode: ListSelectionMode = options?.selectionMode ?? `single`;\n let elToItem = new WeakMap<Element, T>();\n\n // ---- Internal helpers ----\n\n function getOrCreateList(): VerticalListElement {\n if (listEl)\n return listEl;\n\n listEl = document.createElement(`ixfx-vertical-list`) as VerticalListElement;\n // Override :host { height:100% } so the list sizes to its content\n // when placed inside a panel with no explicit height.\n listEl.style.cssText = `height:auto;width:100%;`;\n listEl.selectionMode = selectionMode;\n if (options?.interactionMode)\n listEl.interactionMode = options.interactionMode;\n\n container.appendChild(listEl);\n attachBridgeListeners();\n\n return listEl;\n }\n\n function attachBridgeListeners(): void {\n listEl!.addEventListener(`list-select`, (e) => {\n const detail: SubComponentSelectDetail<T> = {\n selected: mapEls(e.detail.selected),\n previous: mapEls(e.detail.previous),\n };\n container.dispatchEvent(\n new CustomEvent(`select`, { detail, bubbles: true, composed: true }),\n );\n });\n\n listEl!.addEventListener(`list-activate`, (e) => {\n const item = elToItem.get(e.detail.item);\n if (item !== undefined) {\n container.dispatchEvent(\n new CustomEvent(`activate`, { detail: { item }, bubbles: true, composed: true }),\n );\n }\n });\n\n listEl!.addEventListener(`list-item-click`, (e) => {\n const item = elToItem.get(e.detail.item);\n if (item !== undefined) {\n container.dispatchEvent(\n new CustomEvent(`item-click`, { detail: { item }, bubbles: true, composed: true }),\n );\n }\n });\n\n listEl!.addEventListener(`list-tickle`, (e) => {\n const item = elToItem.get(e.detail.item);\n if (item !== undefined) {\n container.dispatchEvent(\n new CustomEvent(`tickle`, { detail: { item }, bubbles: true, composed: true }),\n );\n }\n });\n }\n\n function applyItems(items: readonly T[]): void {\n const list = getOrCreateList();\n list.clearItems();\n elToItem = new WeakMap();\n for (const item of items) {\n const el = renderItem(item);\n elToItem.set(el, item);\n list.addItem(el);\n }\n }\n\n function mapEls(els: ReadonlySet<Element>): ReadonlySet<T> {\n const result = new Set<T>();\n for (const el of els) {\n const item = elToItem.get(el);\n if (item !== undefined)\n result.add(item);\n }\n return result;\n }\n\n // ---- IGroupedSubComponent methods ----\n\n const adapter = Object.assign(container, {\n setItems(items: readonly T[]): void {\n applyItems(items);\n },\n\n clearSelection(): void {\n listEl?.clearSelection();\n },\n\n dispatch(commandId: CommandId, args?: Record<string, unknown>): void {\n options?.onDispatch?.(commandId, args, listEl);\n },\n });\n\n // Getters/setters require defineProperties — Object.assign would invoke them\n Object.defineProperties(adapter, {\n selectedItems: {\n get(): ReadonlySet<T> {\n return listEl ? mapEls(listEl.selectedItems) : new Set<T>();\n },\n enumerable: true,\n configurable: true,\n },\n selectionMode: {\n get(): ListSelectionMode {\n return listEl?.selectionMode ?? selectionMode;\n },\n set(v: ListSelectionMode) {\n selectionMode = v;\n if (listEl)\n listEl.selectionMode = v;\n },\n enumerable: true,\n configurable: true,\n },\n });\n\n return adapter as unknown as HTMLElement & IGroupedSubComponent<T>;\n}\n","import type { 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 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, duration, managed.id);\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 function isNumeric(str: unknown): boolean {\n if (typeof str === `number`)\n return true;\n if (typeof str !== `string`)\n return false;\n const trimmed = str.trim();\n return trimmed !== `` && !Number.isNaN(Number(trimmed));\n}","import { html, LitElement, nothing } from \"lit\";\nimport { property } from \"lit/decorators.js\";\nimport { classMap } from \"lit/directives/class-map.js\";\nimport { unsafeHTML } from \"lit/directives/unsafe-html.js\";\nimport { getIcon } from \"../icons/index.js\";\nimport { safeCustomElement as customElement } from \"./custom-elements.js\";\nimport { isNumeric } from \"./is-numeric.js\";\n\nexport type FormatValueForHuman = (v: unknown) => string;\nexport type TooltipOrientations = `top` | `right` | `bottom` | `left`;\n\n// `ixfx-tooltip` renders to light DOM (see createRenderRoot() below) so it can inherit\n// styling from whatever shadow root it's embedded in (e.g. range-input bundles its own\n// tooltipValueStyles for a scoped bubble-arrow look). That means Lit's `static styles`\n// mechanism can't apply here (it needs adoptedStyleSheets, only available on a ShadowRoot\n// or Document) - so a *standalone* `ixfx-tooltip` (appended directly to <body>, not nested\n// in another component's shadow root) gets no styling at all unless something supplies it.\n// This injects that baseline once, globally, scoped to the bare tag so it never leaks into\n// (or fights with) a host component's own shadow-scoped tooltip styles.\nlet _baseStylesInjected = false;\nfunction ensureBaseTooltipStyles(): void {\n if (_baseStylesInjected)\n return;\n _baseStylesInjected = true;\n const style = document.createElement(`style`);\n style.textContent = `\n ixfx-tooltip {\n display: inline-block;\n background: var(--surface-5);\n color: var(--surface-5-text);\n border: var(--border);\n border-radius: var(--radius-l, 6px);\n box-shadow: var(--shadow-m);\n padding: var(--space-s, 4px);\n font-size: 10px;\n font-family: var(--font-family, inherit);\n }\n ixfx-tooltip .tooltip-type-number {\n font-family: var(--font-mono, ui-monospace, monospace);\n }\n `;\n document.head.appendChild(style);\n}\n\n@customElement(`ixfx-tooltip`)\nexport class TooltipElement extends LitElement {\n override connectedCallback(): void {\n super.connectedCallback();\n ensureBaseTooltipStyles();\n }\n\n static numberFormatter = (v: number) => Math.floor(v).toString();\n\n static defaultFormatter: FormatValueForHuman = (v) => {\n if (typeof v === `number`) {\n if (Number.isInteger(v))\n return v.toString();\n return v.toFixed(2);\n } else if (typeof v === `string`) {\n return v;\n } else {\n return JSON.stringify(v);\n }\n };\n\n valueFormatTooltip: FormatValueForHuman = TooltipElement.defaultFormatter;\n\n @property({ type: String })\n orientation: TooltipOrientations = `top`;\n\n @property({ type: String })\n anchor = `--tooltip`;\n\n @property()\n value: unknown;\n\n @property({ type: String })\n icon?: string;\n\n #renderIcon() {\n if (!this.icon)\n return nothing;\n\n if (this.icon.startsWith(`<svg`)) {\n return html`<span class=\"tooltip-icon\" style=\"display:inline-flex;align-items:center;margin-right:0.25em\">${unsafeHTML(this.icon)}</span>`;\n }\n\n const svg = getIcon(this.icon);\n\n if (!svg)\n return nothing;\n\n return html`<ixfx-icon class=\"tooltip-icon\" style=\"margin-right:0.25em\" name=\"${this.icon}\"></ixfx-icon>`;\n }\n\n protected render() {\n const classes = {\n \"tooltip\": true,\n \"tooltip-orientation-top\": this.orientation === `top`,\n \"tooltip-orientation-bottom\": this.orientation === `bottom`,\n \"tooltip-orientation-right\": this.orientation === `right`,\n \"tooltip-orientation-left\": this.orientation === `left`,\n \"tooltip-type-text\": true,\n \"tooltip-type-number\": false,\n \"tooltip-style-bubble\": true,\n };\n let value = ``;\n switch (typeof this.value) {\n case `number`:\n classes[`tooltip-type-number`] = true;\n value = this.valueFormatTooltip(this.value);\n break;\n case `string`:\n if (isNumeric(this.value)) {\n classes[`tooltip-type-number`] = true;\n value = this.valueFormatTooltip(Number.parseFloat(this.value));\n } else {\n value = this.value;\n }\n break;\n default:\n value = JSON.stringify(this.value);\n }\n return html`<output style=\"--anchor-id: ${this.anchor}\" class=${classMap(classes)}>${this.#renderIcon()}${value}</output>`;\n }\n\n protected createRenderRoot() {\n return this;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ixfx-tooltip\": TooltipElement;\n }\n}\n","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 { customElement, property, state } from 'lit/decorators.js';\nimport { prominenceStyles } from '../styles/prominence.js';\n\nexport type RatingVariant = `star` | `square` | `heart`;\nexport type RatingChangeDetail = Readonly<{ value: number; oldValue: number }>;\nexport type RatingChangeEvent = CustomEvent<RatingChangeDetail>;\nexport type RatingInputEvent = CustomEvent<RatingChangeDetail>;\nexport interface RatingElementEventMap {\n change: RatingChangeEvent;\n input: RatingInputEvent;\n}\n\n@customElement(`ixfx-rating`)\nexport class RatingElement extends LitElement {\n static override styles = [prominenceStyles, css`\n :host {\n --ixfx-rating-size: 1.5rem;\n --ixfx-rating-gap: 0.2rem;\n --ixfx-rating-color: var(--surface-4);\n --ixfx-rating-color-active: var(--accent);\n --ixfx-rating-color-hover: var(--accent);\n display: inline-flex;\n gap: var(--ixfx-rating-gap);\n align-items: center;\n user-select: none;\n --transition: 0.15s ease;\n }\n :host([readonly]) { pointer-events: none; filter: none; }\n :host(:focus-visible) { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: 2px; }\n .glyph {\n width: var(--ixfx-rating-size);\n height: var(--ixfx-rating-size);\n position: relative;\n cursor: pointer;\n flex-shrink: 0;\n color: var(--ixfx-rating-glyph-color, var(--ixfx-rating-color));\n transition: color var(--transition), transform var(--transition);\n }\n .glyph.filled { color: var(--ixfx-rating-glyph-color-active, var(--ixfx-rating-color-active)); }\n .glyph.preview { color: var(--ixfx-rating-glyph-color-hover, var(--ixfx-rating-color-hover)); }\n .glyph.half .fill { clip-path: inset(0 50% 0 0); }\n .glyph svg { width: 100%; height: 100%; display: block; }\n .glyph .fill { position: absolute; inset: 0; color: var(--ixfx-rating-glyph-color-active, var(--ixfx-rating-color-active)); }\n .glyph.preview .fill { color: var(--ixfx-rating-glyph-color-hover, var(--ixfx-rating-color-hover)); }\n .glyph .bg { color: var(--ixfx-rating-glyph-color, var(--ixfx-rating-color)); }\n /* per-rank vars: consumer sets --ixfx-rating-1-color etc outside shadow, we map via inline style fallback */\n `];\n\n @property({ type: Number }) value = 0;\n @property({ type: Number }) max = 5;\n @property({ type: Boolean, attribute: `allow-half` }) allowHalf = false;\n @property({ type: Boolean, reflect: true }) disabled = false;\n @property({ type: Boolean, reflect: true }) readonly = false;\n @property({ type: String }) variant: RatingVariant = `star`;\n\n @state() private _preview: number | null = null;\n\n override connectedCallback() {\n super.connectedCallback();\n this.setAttribute(`role`, `slider`);\n this.tabIndex = this.disabled || this.readonly ? -1 : 0;\n }\n\n protected override updated(changed: Map<string, unknown>) {\n if (changed.has(`disabled`) || changed.has(`readonly`)) {\n this.tabIndex = this.disabled || this.readonly ? -1 : 0;\n this.setAttribute(`aria-disabled`, String(this.disabled));\n }\n this.setAttribute(`aria-valuenow`, String(this.value));\n this.setAttribute(`aria-valuemin`, `0`);\n this.setAttribute(`aria-valuemax`, String(this.max));\n this.setAttribute(`aria-readonly`, String(this.readonly));\n }\n\n private _path(v: RatingVariant) {\n if (v === `heart`)\n return `M12 21s-6.5-4.2-8.5-8.2A4.5 4.5 0 0 1 12 5a4.5 4.5 0 0 1 8.5 7.8C18.5 16.8 12 21 12 21z`;\n if (v === `square`)\n return `M3 3h18v18H3z`;\n return `M12 2l2.4 7.4H22l-6.2 4.5 2.4 7.4L12 17 5.8 21.3l2.4-7.4L2 9.4h7.6z`;\n }\n\n private _effective() {\n return this._preview ?? this.value;\n }\n\n private _commit(newVal: number) {\n if (this.disabled || this.readonly)\n return;\n const oldValue = this.value;\n if (newVal === oldValue)\n newVal = 0;\n if (newVal === oldValue)\n return;\n this.value = newVal;\n this.dispatchEvent(new CustomEvent<RatingChangeDetail>(`input`, { detail: { value: newVal, oldValue }, bubbles: true, composed: true }));\n this.dispatchEvent(new CustomEvent<RatingChangeDetail>(`change`, { detail: { value: newVal, oldValue }, bubbles: true, composed: true }));\n }\n\n private _calc(e: PointerEvent, index: number) {\n if (!this.allowHalf)\n return index + 1;\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n return e.clientX - rect.left < rect.width / 2 ? index + 0.5 : index + 1;\n }\n\n protected override render() {\n const eff = this._effective();\n const hovering = this._preview !== null;\n return html`${Array.from({ length: this.max }, (_, i) => {\n const rank = i + 1;\n const filled = eff >= rank;\n const half = !filled && eff >= rank - 0.5;\n const cls = `glyph ${filled ? `filled` : ``} ${half ? `half` : ``} ${hovering && (filled || half) ? `preview` : ``}`;\n // per-rank CSS var mapping via inline style so outer --ixfx-rating-N-color cascades\n const style = `--ixfx-rating-glyph-color:var(--ixfx-rating-${rank}-color, var(--ixfx-rating-color));--ixfx-rating-glyph-color-active:var(--ixfx-rating-${rank}-color-active, var(--ixfx-rating-color-active));--ixfx-rating-glyph-color-hover:var(--ixfx-rating-${rank}-color-hover, var(--ixfx-rating-color-hover));${half || filled ? `` : ``}`;\n const d = this._path(this.variant);\n return html`<span class=${cls} style=${style}\n @pointermove=${(e: PointerEvent) => {\n if (this.disabled || this.readonly)\n return; this._preview = this._calc(e, i);\n }}\n @pointerleave=${() => this._preview = null}\n @click=${(e: PointerEvent) => this._commit(this._calc(e, i))}>\n <svg viewBox=\"0 0 24 24\" class=\"bg\" fill=\"currentColor\"><path d=${d}></path></svg>\n ${(filled || half) ? html`<svg viewBox=\"0 0 24 24\" class=\"fill\" fill=\"currentColor\"><path d=${d}></path></svg>` : ``}\n </span>`;\n })}`;\n }\n\n override firstUpdated() {\n this.addEventListener(`pointerleave`, () => this._preview = null);\n this.addEventListener(`keydown`, (e: KeyboardEvent) => {\n if (this.disabled || this.readonly)\n return;\n const step = this.allowHalf ? 0.5 : 1;\n if (e.key === `ArrowRight` || e.key === `ArrowUp`) {\n e.preventDefault(); this._commit(Math.min(this.max, this.value + step));\n } else if (e.key === `ArrowLeft` || e.key === `ArrowDown`) {\n e.preventDefault(); this._commit(Math.max(0, this.value - step));\n } else if (e.key === `Home`) {\n e.preventDefault(); this._commit(0);\n } else if (e.key === `End`) {\n e.preventDefault(); this._commit(this.max);\n } else if (/^\\d$/.test(e.key)) {\n e.preventDefault(); const n = parseInt(e.key, 10); this._commit(Math.min(n, this.max));\n }\n });\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap { 'ixfx-rating': RatingElement }\n}\nexport interface IxfxRatingElement {\n addEventListener: (<K extends keyof RatingElementEventMap>(type: K, listener: (this: RatingElement, ev: RatingElementEventMap[K]) => void, options?: boolean | AddEventListenerOptions) => void) & ((type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions) => void);\n removeEventListener: (<K extends keyof RatingElementEventMap>(type: K, listener: (this: RatingElement, ev: RatingElementEventMap[K]) => void, options?: boolean | EventListenerOptions) => void) & ((type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions) => void);\n}\n","import type { PropertyValues } from 'lit';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { repeat } from 'lit/directives/repeat.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\n\n/**\n * Digit-roll direction.\n * - `auto` — inferred from whether the value went up or down (default)\n * - `up` / `down` — force the reels to always spin one way\n * - `none` — take the shortest path\n */\nexport type SlidingNumberTrend = `auto` | `up` | `down` | `none` | `increasing` | `decreasing`;\n\ntype CellKind = `digit` | `symbol`;\ntype CellSection = `lead` | `integer` | `fraction` | `trail` | `decimal`;\ntype CellPhase = `enter` | `active` | `leave`;\n\ninterface ViewCell {\n key: string;\n kind: CellKind;\n section: CellSection;\n char: string;\n pos: number;\n phase: CellPhase;\n}\n\n// Three stacked copies of 0–9 so a reel can roll a full wrap in either\n// direction from its canonical rest offset (the middle copy, 10 + digit).\nconst REEL_DIGITS: readonly number[] = Array.from({ length: 30 }, (_, index) => index % 10);\n\nconst SECTION_RANK: Record<CellSection, number> = {\n lead: 0,\n integer: 1,\n decimal: 2,\n fraction: 3,\n trail: 4,\n};\n\nfunction mod(n: number, m: number): number {\n return ((n % m) + m) % m;\n}\n\n/** Parse a CSS time token (`0.7s`, `700ms`, `0`) to milliseconds. */\nfunction millis(value: string): number {\n const s = value.trim();\n if (s === ``)\n return 0;\n if (s.endsWith(`ms`))\n return Number.parseFloat(s) || 0;\n if (s.endsWith(`s`))\n return (Number.parseFloat(s) || 0) * 1000;\n return Number.parseFloat(s) || 0;\n}\n\n/**\n * `ixfx-sliding-number` — an animated number readout. When `value` changes each\n * digit rolls vertically to its new figure (odometer / slot-machine style),\n * digits that appear or disappear slide + fade, and the whole thing stays lined\n * up on the decimal point.\n *\n * Inspired by [NumberFlow](https://number-flow.barvian.me/): configurable\n * timings, a `trend` to bias roll direction, decimal alignment, and `::part()`\n * hooks for styling.\n *\n * ```html\n * <ixfx-sliding-number value=\"1234.5\"></ixfx-sliding-number>\n * <ixfx-sliding-number value=\"19.99\" prefix=\"$\" format='{\"minimumFractionDigits\":2}'></ixfx-sliding-number>\n * ```\n *\n * ### CSS variables\n * | Variable | Default | Purpose |\n * |---|---|---|\n * | `--sliding-number-spin-duration` | `0.7s` | Time for a digit reel to roll |\n * | `--sliding-number-spin-easing` | `cubic-bezier(.16,1,.3,1)` | Easing for the roll |\n * | `--sliding-number-transform-duration` | `0.5s` | Time for digits to slide in/out as the number grows/shrinks |\n * | `--sliding-number-transform-easing` | `cubic-bezier(.16,1,.3,1)` | Easing for that slide |\n * | `--sliding-number-opacity-duration` | `0.35s` | Fade time for entering/leaving digits |\n * | `--sliding-number-digit-width` | `1ch` | Column width of a single digit |\n *\n * ### Parts\n * `prefix`, `suffix`, `number`, `integer`, `fraction`, `digit`, `symbol`.\n */\n@customElement(`ixfx-sliding-number`)\nexport class SlidingNumberElement extends LitElement {\n /** The number to display. */\n @property({ type: Number }) value = 0;\n\n /** BCP-47 locale(s) passed to `Intl.NumberFormat`. */\n @property({ type: String }) locales: string | undefined;\n\n /**\n * `Intl.NumberFormat` options. As an attribute, pass JSON:\n * `format='{\"style\":\"currency\",\"currency\":\"USD\"}'`.\n */\n @property({ type: Object }) format: Intl.NumberFormatOptions | undefined;\n\n /** Static text shown before the number. */\n @property({ type: String }) prefix = ``;\n\n /** Static text shown after the number. */\n @property({ type: String }) suffix = ``;\n\n /** Which way the digit reels roll. */\n @property({ type: String }) trend: SlidingNumberTrend = `auto`;\n\n /** Add the `no-animate` attribute to render every change instantly. */\n @property({ type: Boolean, attribute: `no-animate` }) noAnimate = false;\n\n /** Honour `prefers-reduced-motion: reduce` (default `true`; set the property to `false` to override). */\n @property({ type: Boolean, attribute: false }) respectMotionPreference = true;\n\n @state() private _cells: ViewCell[] = [];\n\n private _formatted = ``;\n private _ready = false;\n private _prevValue: number | undefined;\n private _pendingSpins: Array<{ key: string; from: number; to: number }> = [];\n private _pendingDir: `up` | `down` | `none` = `none`;\n private _reelAnims = new Map<string, Animation>();\n private _reapTimer = 0;\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (!this.hasAttribute(`role`))\n this.setAttribute(`role`, `img`);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n for (const anim of this._reelAnims.values()) anim.cancel();\n this._reelAnims.clear();\n if (this._reapTimer)\n clearTimeout(this._reapTimer);\n }\n\n private _motionOK(): boolean {\n if (this.noAnimate)\n return false;\n if (\n this.respectMotionPreference\n && typeof window !== `undefined`\n && window.matchMedia?.(`(prefers-reduced-motion: reduce)`).matches\n ) {\n return false;\n }\n return true;\n }\n\n private _timing(kind: `spin` | `transform`): { duration: number; easing: string } {\n const cs = getComputedStyle(this);\n const duration = this._motionOK()\n ? millis(cs.getPropertyValue(`--sliding-number-${kind}-duration`))\n : 0;\n const easing = cs.getPropertyValue(`--sliding-number-${kind}-easing`).trim() || `ease`;\n return { duration, easing };\n }\n\n private _numberFormat(): Intl.NumberFormat {\n try {\n return new Intl.NumberFormat(this.locales || undefined, this.format || undefined);\n } catch {\n return new Intl.NumberFormat(this.locales || undefined);\n }\n }\n\n private _resolveDir(first: boolean): `up` | `down` | `none` {\n switch (this.trend) {\n case `up`:\n case `increasing`:\n return `up`;\n case `down`:\n case `decreasing`:\n return `down`;\n case `none`:\n return `none`;\n default: {\n if (first || this._prevValue === undefined || this.value === this._prevValue)\n return `none`;\n return this.value > this._prevValue ? `up` : `down`;\n }\n }\n }\n\n /** Split the formatted value into positioned cells. */\n private _buildCells(parts: Intl.NumberFormatPart[]): ViewCell[] {\n const intRaw: Array<{ digit: boolean; char: string }> = [];\n const fractionChars: string[] = [];\n const lead: string[] = [];\n const trail: string[] = [];\n let decimalChar = ``;\n let sawInteger = false;\n let sawDecimal = false;\n\n for (const part of parts) {\n switch (part.type) {\n case `integer`:\n sawInteger = true;\n for (const c of part.value) intRaw.push({ digit: true, char: c });\n break;\n case `group`:\n intRaw.push({ digit: false, char: part.value });\n break;\n case `decimal`:\n sawDecimal = true;\n decimalChar = part.value;\n break;\n case `fraction`:\n for (const c of part.value) fractionChars.push(c);\n break;\n default:\n (sawInteger || sawDecimal ? trail : lead).push(part.value);\n }\n }\n\n const cells: ViewCell[] = [];\n const totalIntDigits = intRaw.filter(x => x.digit).length;\n\n lead.forEach((char, index) => {\n cells.push({ key: `lead:${index}`, kind: `symbol`, section: `lead`, char, pos: index - 100, phase: `active` });\n });\n\n let seen = 0;\n for (const item of intRaw) {\n if (item.digit) {\n const place = totalIntDigits - 1 - seen;\n seen++;\n cells.push({ key: `int:${place}`, kind: `digit`, section: `integer`, char: item.char, pos: -place, phase: `active` });\n } else {\n // Separator sits just to the right of the digit at `place` (lower-place side).\n const place = totalIntDigits - seen;\n cells.push({ key: `grp:${place}`, kind: `symbol`, section: `integer`, char: item.char, pos: -place + 0.5, phase: `active` });\n }\n }\n\n if (sawDecimal) {\n cells.push({ key: `decimal`, kind: `symbol`, section: `decimal`, char: decimalChar, pos: 0, phase: `active` });\n }\n\n fractionChars.forEach((char, index) => {\n cells.push({ key: `frac:${index}`, kind: `digit`, section: `fraction`, char, pos: index + 1, phase: `active` });\n });\n\n trail.forEach((char, index) => {\n cells.push({ key: `trail:${index}`, kind: `symbol`, section: `trail`, char, pos: index + 100, phase: `active` });\n });\n\n return cells;\n }\n\n protected override willUpdate(changed: PropertyValues): void {\n const relevant = [`value`, `format`, `locales`, `prefix`, `suffix`, `noAnimate`].some(p => changed.has(p));\n if (!relevant && this._ready)\n return;\n\n const nf = this._numberFormat();\n this._formatted = `${this.prefix}${nf.format(this.value)}${this.suffix}`;\n this.setAttribute(`aria-label`, this._formatted);\n this.toggleAttribute(`data-static`, !this._motionOK());\n\n const first = !this._ready;\n const motionOK = this._motionOK() && !first;\n const next = this._buildCells(nf.formatToParts(this.value));\n const nextKeys = new Set(next.map(c => c.key));\n const prev = this._cells.filter(c => c.phase !== `leave`);\n const prevByKey = new Map(prev.map(c => [c.key, c]));\n\n const dir = this._resolveDir(first);\n const spins: Array<{ key: string; from: number; to: number }> = [];\n const merged: ViewCell[] = [];\n\n for (const cell of next) {\n const before = prevByKey.get(cell.key);\n if (before) {\n if (motionOK && cell.kind === `digit` && before.char !== cell.char) {\n spins.push({ key: cell.key, from: Number(before.char), to: Number(cell.char) });\n }\n merged.push({ ...cell, phase: `active` });\n } else {\n merged.push({ ...cell, phase: motionOK ? `enter` : `active` });\n }\n }\n\n if (motionOK) {\n for (const cell of prev) {\n if (!nextKeys.has(cell.key))\n merged.push({ ...cell, phase: `leave` });\n }\n }\n\n merged.sort((a, b) => SECTION_RANK[a.section] - SECTION_RANK[b.section] || a.pos - b.pos);\n\n this._cells = merged;\n this._pendingSpins = spins;\n this._pendingDir = dir;\n }\n\n protected override updated(): void {\n for (const spin of this._pendingSpins) this._spin(spin.key, spin.from, spin.to, this._pendingDir);\n this._pendingSpins = [];\n\n if (this._cells.some(c => c.phase === `enter`)) {\n requestAnimationFrame(() => requestAnimationFrame(() => {\n let changed = false;\n for (const cell of this._cells) {\n if (cell.phase === `enter`) {\n cell.phase = `active`;\n changed = true;\n }\n }\n if (changed) {\n this._cells = [...this._cells];\n this.requestUpdate();\n }\n }));\n }\n\n if (this._cells.some(c => c.phase === `leave`)) {\n if (this._reapTimer)\n clearTimeout(this._reapTimer);\n this._reapTimer = window.setTimeout(() => {\n this._reapTimer = 0;\n const kept = this._cells.filter(c => c.phase !== `leave`);\n if (kept.length !== this._cells.length) {\n this._cells = kept;\n this.requestUpdate();\n }\n }, this._timing(`transform`).duration + 120);\n }\n\n this._prevValue = this.value;\n this._ready = true;\n }\n\n private _spin(key: string, fromDigit: number, toDigit: number, dir: `up` | `down` | `none`): void {\n const reel = this.renderRoot.querySelector<HTMLElement>(`[data-key=\"${key}\"] .reel`);\n if (!reel)\n return;\n\n const fromOffset = 10 + fromDigit;\n let toOffset: number;\n if (dir === `up`) {\n toOffset = fromOffset + mod(toDigit - fromDigit, 10);\n } else if (dir === `down`) {\n toOffset = fromOffset - mod(fromDigit - toDigit, 10);\n } else {\n toOffset = [toDigit, 10 + toDigit, 20 + toDigit].reduce((best, candidate) =>\n Math.abs(candidate - fromOffset) < Math.abs(best - fromOffset) ? candidate : best);\n }\n\n const { duration, easing } = this._timing(`spin`);\n this._reelAnims.get(key)?.cancel();\n\n if (duration === 0) {\n reel.style.setProperty(`--o`, String(10 + toDigit));\n return;\n }\n\n const anim = reel.animate(\n [\n { transform: `translateY(calc(-1em * ${fromOffset}))` },\n { transform: `translateY(calc(-1em * ${toOffset}))` },\n ],\n { duration, easing, fill: `both` },\n );\n this._reelAnims.set(key, anim);\n anim.finished\n .then(() => {\n reel.style.setProperty(`--o`, String(10 + toDigit));\n anim.cancel();\n this._reelAnims.delete(key);\n })\n .catch(() => { /* superseded */ });\n }\n\n private _renderCell(cell: ViewCell) {\n if (cell.kind === `digit`) {\n return html`\n <span class=\"cell digit\" part=\"digit\" data-key=${cell.key} data-phase=${cell.phase}>\n <span class=\"reel\" style=${`--o:${10 + Number(cell.char)}`}>\n ${REEL_DIGITS.map(d => html`<span>${d}</span>`)}\n </span>\n </span>\n `;\n }\n return html`\n <span class=\"cell symbol\" part=\"symbol\" data-key=${cell.key} data-phase=${cell.phase}>${cell.char}</span>\n `;\n }\n\n protected override render() {\n const section = (name: CellSection) => this._cells.filter(c => c.section === name);\n const integer = [...section(`integer`)].reverse();\n\n return html`\n ${this.prefix ? html`<span class=\"affix\" part=\"prefix\">${this.prefix}</span>` : nothing}\n <span class=\"number\" part=\"number\" aria-hidden=\"true\">\n <span class=\"run lead\">${section(`lead`).map(c => this._renderCell(c))}</span>\n <span class=\"run integer\" part=\"integer\">\n ${repeat(integer, c => c.key, c => this._renderCell(c))}\n </span>\n ${section(`decimal`).map(c => this._renderCell(c))}\n <span class=\"run fraction\" part=\"fraction\">\n ${repeat(section(`fraction`), c => c.key, c => this._renderCell(c))}\n </span>\n <span class=\"run trail\">${section(`trail`).map(c => this._renderCell(c))}</span>\n </span>\n ${this.suffix ? html`<span class=\"affix\" part=\"suffix\">${this.suffix}</span>` : nothing}\n `;\n }\n\n static override styles = css`\n :host {\n --sliding-number-spin-duration: 0.7s;\n --sliding-number-spin-easing: cubic-bezier(0.16, 1, 0.3, 1);\n --sliding-number-transform-duration: 0.5s;\n --sliding-number-transform-easing: cubic-bezier(0.16, 1, 0.3, 1);\n --sliding-number-opacity-duration: 0.35s;\n --sliding-number-digit-width: 1ch;\n\n display: inline-flex;\n align-items: flex-end;\n line-height: 1;\n font-variant-numeric: tabular-nums;\n }\n\n .number,\n .run {\n display: inline-flex;\n /* Every cell is exactly 1em tall, so aligning bottom edges keeps\n every glyph on the same line without relying on synthesised\n flex baselines (which break under overflow: hidden). */\n align-items: flex-end;\n white-space: nowrap;\n }\n\n .affix {\n line-height: 1;\n }\n\n /* Integer digits stack right-to-left so the units column (next to the\n decimal point) stays put while higher places grow outward. */\n .run.integer {\n flex-direction: row-reverse;\n }\n\n .cell {\n display: block;\n height: 1em;\n line-height: 1;\n text-align: center;\n overflow: hidden;\n transition:\n width var(--sliding-number-transform-duration) var(--sliding-number-transform-easing),\n max-width var(--sliding-number-transform-duration) var(--sliding-number-transform-easing),\n opacity var(--sliding-number-opacity-duration) var(--sliding-number-transform-easing);\n }\n\n .cell.digit {\n position: relative;\n width: var(--sliding-number-digit-width);\n }\n\n .cell.symbol {\n max-width: 4ch;\n }\n\n .cell[data-phase='enter'],\n .cell[data-phase='leave'] {\n opacity: 0;\n }\n\n .cell.digit[data-phase='enter'],\n .cell.digit[data-phase='leave'] {\n width: 0;\n }\n\n .cell.symbol[data-phase='enter'],\n .cell.symbol[data-phase='leave'] {\n max-width: 0;\n }\n\n .reel {\n position: absolute;\n inset: 0 0 auto 0;\n display: flex;\n flex-direction: column;\n will-change: transform;\n transform: translateY(calc(-1em * var(--o, 10)));\n }\n\n .reel > span {\n display: block;\n height: 1em;\n line-height: 1;\n text-align: center;\n }\n\n :host([data-static]) .cell {\n transition: none;\n }\n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-sliding-number': SlidingNumberElement;\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: vertical padding for the tab content (default: var(--space-m))\n * --ixfx-tab-padding-horizontal: horizontal padding (default: same as --ixfx-tab-padding)\n */\n@customElement(`ixfx-tab-list-item`)\nexport class TabListItemElement extends LitElement {\n @property({ type: Boolean })\n closeable = false;\n\n @property({ type: Boolean, attribute: `hide-labels` })\n hideLabels = 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 @state() private _hasToolbarContent = 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 const toolbarSlot = this.shadowRoot?.querySelector(`slot[name=\"toolbar\"]`);\n toolbarSlot?.addEventListener(`slotchange`, this._onToolbarSlotChange);\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 const toolbarSlot = this.shadowRoot?.querySelector(`slot[name=\"toolbar\"]`);\n toolbarSlot?.removeEventListener(`slotchange`, this._onToolbarSlotChange);\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 private _onToolbarSlotChange = () => {\n this._updateToolbarContent();\n };\n\n private _updateToolbarContent() {\n const slot = this.shadowRoot?.querySelector(`slot[name=\"toolbar\"]`) as HTMLSlotElement | null;\n this._hasToolbarContent = (slot?.assignedElements().length ?? 0) > 0;\n }\n\n override firstUpdated() {\n this._updateToolbarContent();\n }\n\n override render() {\n const showLabel = !this.hideLabels || !this.iconName;\n const hasActions = this.closeable || this._hasToolbarContent;\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 ${hasActions\n ? html`\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 `\n : nothing}\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 height:fit-content;\n }\n\n :host > div {\n display: flex;\n align-items: center;\n padding: var(--tab-padding) calc(2 * var(--tab-padding-horizontal, var(--tab-padding)));\n min-width: 0;\n width: 100%;\n font-weight: 500;\n border: var(--selected-tab-border-width) solid transparent;\n gap: var(--space-s);\n\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 border-radius:var(--radius-m);\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 { css, html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\n\n/**\n * `ixfx-text-shimmer` — a label whose text is dimmed at rest, with a band of\n * brighter colour that sweeps horizontally across it on a loop. Useful as a\n * lightweight \"still working…\" indicator (as seen in Claude Code / Codex).\n *\n * Content comes from the `text` property, or failing that the default slot:\n * ```html\n * <ixfx-text-shimmer text=\"Thinking…\"></ixfx-text-shimmer>\n * <ixfx-text-shimmer>Reticulating splines…</ixfx-text-shimmer>\n * ```\n *\n * CSS variables (set on the element or an ancestor):\n * | Variable | Default | Purpose |\n * |---|---|---|\n * | `--text-shimmer-color` | `var(--surface-3-text)` | Resting / base text colour |\n * | `--text-shimmer-gradient-color` | `var(--surface-2-text)` | Colour of the moving highlight |\n * | `--text-shimmer-duration` | `2s` | Time for one sweep |\n * | `--text-shimmer-spread` | `15%` | Half-width of the highlight band along the sweep track (larger = wider, softer) |\n *\n * Add the `paused` attribute to stop the sweep and show flat base colour.\n * Respects `prefers-reduced-motion`.\n */\n@customElement(`ixfx-text-shimmer`)\nexport class TextShimmerElement extends LitElement {\n /** Text to display. When empty, the default slot is used instead. */\n @property({ type: String }) text = ``;\n\n /** When set, the sweep stops and the text shows flat base colour. */\n @property({ type: Boolean, reflect: true }) paused = false;\n\n protected override render() {\n return html`<span class=\"shimmer\" part=\"text\"\n >${this.text === `` ? html`<slot></slot>` : this.text}</span\n >`;\n }\n\n static override styles = css`\n :host {\n --text-shimmer-color: var(--surface-3-text, #888);\n --text-shimmer-gradient-color: var(--surface-2-text, #fff);\n --text-shimmer-duration: 2s;\n --text-shimmer-spread: 15%;\n\n display: inline-block;\n color: var(--text-shimmer-color);\n }\n\n .shimmer {\n background-image: linear-gradient(\n 90deg,\n var(--text-shimmer-color) 0%,\n var(--text-shimmer-color) calc(50% - var(--text-shimmer-spread)),\n var(--text-shimmer-gradient-color) 50%,\n var(--text-shimmer-color) calc(50% + var(--text-shimmer-spread)),\n var(--text-shimmer-color) 100%\n );\n background-size: 250% 100%;\n background-repeat: no-repeat;\n -webkit-background-clip: text;\n background-clip: text;\n color: transparent;\n -webkit-text-fill-color: transparent;\n animation: ixfx-text-shimmer-sweep var(--text-shimmer-duration) linear infinite;\n }\n\n /* Sweep the highlight band from the right edge to the left edge. */\n @keyframes ixfx-text-shimmer-sweep {\n from {\n background-position: 100% center;\n }\n to {\n background-position: 0% center;\n }\n }\n\n :host([paused]) .shimmer {\n animation: none;\n background-image: none;\n color: var(--text-shimmer-color);\n -webkit-text-fill-color: var(--text-shimmer-color);\n }\n\n @media (prefers-reduced-motion: reduce) {\n .shimmer {\n animation: none;\n background-image: none;\n color: var(--text-shimmer-color);\n -webkit-text-fill-color: var(--text-shimmer-color);\n }\n }\n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-text-shimmer': TextShimmerElement;\n }\n}\n","import { css, html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\n\n@customElement(`ixfx-toolbar-group`)\nexport class ToolbarGroupElement extends LitElement {\n @property({ type: String }) label = ``;\n @property({ type: Boolean, reflect: true }) grow = false;\n\n static override styles = [themeFallbacks, css`\n :host {\n display: flex;\n flex-direction: column;\n align-items: var(--toolbar-group-align-items, center);\n justify-content: var(--toolbar-group-justify-content, flex-start);\n gap: var(--toolbar-gap, var(--space-s));\n padding: var(--space-xs);\n border: 1px solid var(--border-subtle, var(--border));\n border-radius: var(--radius-s);\n background: var(--surface-3);\n min-width: 0;\n }\n :host(:not([label])) {\n border: none;\n background: transparent;\n padding: 0;\n }\n .label-row {\n display: none;\n font-size: var(--text-s, 12px);\n color: var(--surface-muted-text);\n padding-inline: var(--space-xs);\n white-space: nowrap;\n border-bottom: 1px solid var(--border-subtle);\n margin-bottom: var(--space-xs);\n }\n :host([label][show-label]) .label-row { display: block; }\n :host(:not([label])) .label-row { display: none; }\n :host([grow]) { flex: 1 1 auto; min-width: 0; }\n :host([hidden]) { display: none !important; }\n .components { display: flex; }\n ::slotted(*) { flex: 0 0 auto; }\n ::slotted([grow]) { flex: 1 1 auto; }\n `];\n\n protected override render() {\n return html`\n <div class=\"label-row\">${this.label}</div>\n <div class=\"components\">\n <slot></slot>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap { 'ixfx-toolbar-group': ToolbarGroupElement }\n}\n","import type { ToolbarLayout, ToolbarOrientation, ToolbarVerticalWriting } from './types.js';\nimport { css, html, LitElement } from 'lit';\nimport { property, query, 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\n@customElement(`ixfx-toolbar`)\nexport class ToolbarElement extends LitElement {\n @property({ type: String, reflect: true }) orientation: ToolbarOrientation = `horizontal`;\n @property({ type: String, reflect: true }) layout: ToolbarLayout = `one-line`;\n @property({ type: String, attribute: `vertical-writing`, reflect: true }) verticalWriting: ToolbarVerticalWriting = `auto`;\n @property({ type: Boolean, attribute: `show-group-labels`, reflect: true }) showGroupLabels = false;\n @property({ type: Boolean, attribute: `invisible-groups`, reflect: true }) invisibleGroups = false;\n\n @state() private _overflowCount = 0;\n private _ro: ResizeObserver | null = null;\n private static _cnt = 0;\n private _anchor = `--toolbar-${ToolbarElement._cnt++}`;\n /** Natural size of items, captured while they are measurable in the main slot. */\n private _sizes = new WeakMap<HTMLElement, number>();\n private _measureQueued = false;\n\n @query(`.inner`) private _inner!: HTMLElement;\n @query(`.overflow-popover`) private _popover!: HTMLElement;\n @query(`slot`) private _slot!: HTMLSlotElement;\n\n static override styles = [themeFallbacks, popupSurfaceStyles, css`\n :host {\n --toolbar-gap: var(--space-s);\n --toolbar-group-gap: var(--space-m);\n display: block;\n container-type: inline-size;\n }\n :host([orientation=\"vertical-left\"]),\n :host([orientation=\"vertical-right\"]) {\n container-type: normal;\n width: max-content;\n }\n :host([orientation=\"vertical-left\"]),\n :host([orientation=\"vertical-right\"]) { height: 100%; }\n :host([orientation=\"vertical-left\"]) .inner,\n :host([orientation=\"vertical-right\"]) .inner { height: 100%; box-sizing: border-box; width: max-content; }\n .inner {\n display: flex;\n gap: var(--toolbar-gap);\n background: var(--toolbar-bg, var(--surface-2));\n padding: var(--toolbar-padding, var(--space-s));\n border: var(--toolbar-border, var(--border-subtle));\n border-radius: var(--radius-s);\n align-items: center;\n }\n :host([orientation=\"horizontal\"]) .inner { flex-direction: row; justify-content: flex-start; }\n :host([orientation=\"vertical-left\"]) .inner { flex-direction: column-reverse; align-items: stretch; }\n :host([orientation=\"vertical-right\"]) .inner { flex-direction: column; align-items: stretch; }\n :host([layout=\"wrap\"]) .inner { flex-wrap: wrap; }\n :host([layout=\"one-line\"]) .inner { flex-wrap: nowrap; overflow: hidden; }\n :host([orientation=\"vertical-left\"][vertical-writing=\"auto\"]) ::slotted(*) { writing-mode: sideways-lr; }\n :host([orientation=\"vertical-right\"][vertical-writing=\"auto\"]) ::slotted(*) { writing-mode: vertical-lr; }\n :host([vertical-writing=\"up\"]) ::slotted(*) { writing-mode: vertical-rl; text-orientation: upright; }\n :host([vertical-writing=\"down\"]) ::slotted(*) { writing-mode: vertical-lr; }\n :host([vertical-writing=\"none\"]) ::slotted(*) { writing-mode: horizontal-tb; }\n ::slotted(*) { flex: 0 0 auto; }\n ::slotted([grow]), ::slotted(ixfx-toolbar-group[grow]) { flex: 1 1 auto; }\n ::slotted([hidden]) { display: none !important; }\n :host([invisible-groups]) ::slotted(ixfx-toolbar-group) { --toolbar-group-border: none; }\n .overflow-btn {\n anchor-name: var(--anchor-name);\n flex-shrink: 0;\n background: var(--surface-3);\n border: var(--border);\n border-radius: var(--radius-s);\n padding: var(--space-xs) var(--space-s);\n cursor: pointer;\n display: none;\n }\n .overflow-btn[visible] { display: inline-flex; }\n .overflow-popover {\n position: fixed;\n top: anchor(bottom);\n left: anchor(right);\n position-anchor: var(--anchor-name);\n position-try-fallbacks: flip-block, flip-inline, flip-block flip-inline;\n margin: 8px;\n max-height: min(60vh, 400px);\n max-width: min(90vw, 320px);\n overflow: auto;\n overscroll-behavior: contain;\n z-index: 100;\n padding: var(--space-s);\n flex-direction: column;\n gap: var(--space-s);\n }\n .overflow-popover:popover-open { display: flex; }\n .overflow-popover ::slotted(*) { writing-mode: horizontal-tb; text-orientation: mixed; }\n `];\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.style.setProperty(`--anchor-name`, this._anchor);\n }\n\n protected override firstUpdated(): void {\n this._slot.addEventListener(`slotchange`, () => this._scheduleMeasure());\n this._ro = new ResizeObserver(() => this._scheduleMeasure());\n this._ro.observe(this._inner);\n this._scheduleMeasure();\n this._updateGroupLabels();\n }\n\n protected override updated(changed: Map<string, unknown>): void {\n if (changed.has(`showGroupLabels`))\n this._updateGroupLabels();\n }\n\n private _updateGroupLabels(): void {\n for (const child of Array.from(this.children) as HTMLElement[]) {\n if (child.tagName === `IXFX-TOOLBAR-GROUP`) {\n if (this.showGroupLabels) {\n child.setAttribute(`show-label`, ``);\n } else {\n child.removeAttribute(`show-label`);\n }\n }\n }\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this._ro?.disconnect();\n }\n\n /** Coalesce measure passes into one per frame; prevents slotchange feedback loops. */\n private _scheduleMeasure(): void {\n if (this._measureQueued)\n return;\n this._measureQueued = true;\n requestAnimationFrame(() => {\n this._measureQueued = false;\n this._measure();\n });\n }\n\n private _measure(): void {\n const children = Array.from(this.children) as HTMLElement[];\n const isGrow = (el: HTMLElement) => el.hasAttribute(`grow`) || el.matches(`[grow]`);\n const overflowable = children.filter(el => !isGrow(el));\n const isHoriz = this.orientation === `horizontal`;\n\n if (this.layout !== `one-line`) {\n let mutated = false;\n for (const el of children) {\n if (el.getAttribute(`slot`) === `overflow`) {\n el.removeAttribute(`slot`); mutated = true;\n }\n if (el.hasAttribute(`hidden`)) {\n el.removeAttribute(`hidden`); mutated = true;\n }\n }\n if (this._overflowCount !== 0) {\n this._overflowCount = 0; mutated = true;\n }\n if (mutated)\n this.requestUpdate();\n return;\n }\n\n if (!this._inner)\n return;\n const cs = getComputedStyle(this._inner);\n const gap = (isHoriz ? Number.parseFloat(cs.columnGap) : Number.parseFloat(cs.rowGap)) || 0;\n const available = isHoriz ? this._inner.clientWidth : this._inner.clientHeight;\n const btnSize = 36;\n\n const inMain = overflowable.filter(el => el.getAttribute(`slot`) !== `overflow`);\n const inOverflow = overflowable.filter(el => el.getAttribute(`slot`) === `overflow`);\n\n // Cache natural sizes while items are measurable in the main slot\n let cum = 0;\n inMain.forEach((el, i) => {\n const s = isHoriz ? el.offsetWidth : el.offsetHeight;\n if (s > 0)\n this._sizes.set(el, s);\n cum += (i ? gap : 0) + (this._sizes.get(el) ?? s);\n });\n const btnAllowance = inOverflow.length > 0 ? gap + btnSize : 0;\n\n let mutated = false;\n\n // Move items to overflow, last-first, until the main run fits\n while (inMain.length > 0 && cum + btnAllowance > available) {\n const last = inMain[inMain.length - 1];\n const s = this._sizes.get(last) ?? 0;\n last.setAttribute(`slot`, `overflow`);\n inMain.pop();\n inOverflow.unshift(last);\n cum -= (inMain.length ? gap : 0) + s;\n mutated = true;\n }\n\n // Move items back, first-from-overflow, only while their cached natural size fits.\n // Cached sizes are always > 0, so this cannot oscillate with the 0px measurements\n // that items report inside the closed popover.\n while (inOverflow.length > 0) {\n const first = inOverflow[0];\n const s = this._sizes.get(first);\n if (s === undefined)\n break; // never measured in main slot; stay conservative\n const addGap = inMain.length ? gap : 0;\n const nextBtnAllowance = inOverflow.length > 1 ? gap + btnSize : 0;\n if (cum + addGap + s + nextBtnAllowance > available)\n break;\n first.removeAttribute(`slot`);\n inOverflow.shift();\n inMain.push(first);\n cum += addGap + s;\n mutated = true;\n }\n\n const newCount = inOverflow.length;\n if (newCount !== this._overflowCount) {\n this._overflowCount = newCount; mutated = true;\n }\n if (mutated)\n this.requestUpdate();\n }\n\n private _toggleOverflow(): void {\n try {\n (this._popover as any).togglePopover();\n } catch {\n (this._popover as any).showPopover();\n }\n }\n\n protected override render() {\n const hasOverflow = this._overflowCount > 0;\n return html`\n <div class=\"inner\" role=\"toolbar\" aria-orientation=${this.orientation}>\n <slot></slot>\n <button class=\"overflow-btn\" ?visible=${hasOverflow} @click=${this._toggleOverflow} aria-label=\"More\" aria-haspopup=\"true\" aria-expanded=${this._popover?.matches(`:popover-open`) ?? false}>⋯</button>\n </div>\n <div class=\"overflow-popover popup-surface\" popover=\"auto\" @click=${(e: Event) => e.stopPropagation()}>\n <slot name=\"overflow\"></slot>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap { 'ixfx-toolbar': ToolbarElement }\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 './data-grid/data-grid.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/manager.js';\nexport * from './notifier/notification-pill.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 './rating/rating.js';\nexport * from './select-horiz/select-horiz.js';\nexport * from './slider-input/slider-input.js';\nexport * from './slider-input/types.js';\nexport * from './sliding-number/sliding-number.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 './text-shimmer/text-shimmer.js';\nexport * from './timeline/index.js';\nexport * from './toolbar/toolbar-group.js';\nexport * from './toolbar/toolbar.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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"}
|