@ixfx/components 0.8.4 → 0.8.5
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 +78 -9
- package/bundle/index.d.ts.map +1 -1
- package/bundle/index.js +241 -47
- package/bundle/index.js.map +1 -1
- package/dist/ac-text.d.ts +1 -1
- package/dist/{ac-token--_vCHXWw.d.ts → ac-token-TCLAZeVg.d.ts} +2 -2
- package/dist/{ac-token--_vCHXWw.d.ts.map → ac-token-TCLAZeVg.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-D-z7bx5-.d.ts → data-grid-DCt0oack.d.ts} +2 -2
- package/dist/{data-grid-D-z7bx5-.d.ts.map → data-grid-DCt0oack.d.ts.map} +1 -1
- package/dist/data-grid.d.ts +1 -1
- package/dist/{detail-list-_ZJHYEBr.d.ts → detail-list-CqRzhFnv.d.ts} +2 -2
- package/dist/{detail-list-_ZJHYEBr.d.ts.map → detail-list-CqRzhFnv.d.ts.map} +1 -1
- package/dist/detail-list.d.ts +1 -1
- package/dist/{grid-list-BXfY3XXX.js → grid-list-j5C7qtlG.js} +148 -29
- package/dist/grid-list-j5C7qtlG.js.map +1 -0
- package/dist/grid-list-x550wJ0X.d.ts.map +1 -1
- package/dist/grid-list.js +1 -1
- package/dist/{grouped-item-lister-fdZHVxFM.d.ts → grouped-item-lister-CEZ72VOs.d.ts} +2 -2
- package/dist/{grouped-item-lister-fdZHVxFM.d.ts.map → grouped-item-lister-CEZ72VOs.d.ts.map} +1 -1
- package/dist/grouped-item-lister.d.ts +1 -1
- package/dist/{icon-CDGprSdE.d.ts → icon-DR_3rSyZ.d.ts} +2 -2
- package/dist/icon-DR_3rSyZ.d.ts.map +1 -0
- package/dist/icons.d.ts +2 -2
- package/dist/{index-tq6f8007.d.ts → index-BOUaDIW-.d.ts} +2 -2
- package/dist/{index-tq6f8007.d.ts.map → index-BOUaDIW-.d.ts.map} +1 -1
- package/dist/{index-CoqtMSd9.d.ts → index-BUB5SICW.d.ts} +2 -2
- package/dist/{index-CoqtMSd9.d.ts.map → index-BUB5SICW.d.ts.map} +1 -1
- package/dist/{index-9AhaHIT2.d.ts → index-C59-JEPl.d.ts} +3 -3
- package/dist/{index-9AhaHIT2.d.ts.map → index-C59-JEPl.d.ts.map} +1 -1
- package/dist/{index-UvnoZUAo.d.ts → index-CJ5fshD3.d.ts} +2 -2
- package/dist/{index-UvnoZUAo.d.ts.map → index-CJ5fshD3.d.ts.map} +1 -1
- package/dist/{index-CS9yM8L-.d.ts → index-DsjpDksO.d.ts} +2 -2
- package/dist/{index-CS9yM8L-.d.ts.map → index-DsjpDksO.d.ts.map} +1 -1
- package/dist/index.d.ts +92 -23
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +95 -20
- package/dist/index.js.map +1 -1
- package/dist/{labelled-input-base-DiTme1JO.d.ts → labelled-input-base-Dp_9KP0G.d.ts} +2 -2
- package/dist/{labelled-input-base-DiTme1JO.d.ts.map → labelled-input-base-Dp_9KP0G.d.ts.map} +1 -1
- package/dist/labelled-radial-input.d.ts +2 -2
- package/dist/labelled-radial-input.d.ts.map +1 -1
- package/dist/labelled-range-input.d.ts +1 -1
- package/dist/labelled-slider-input.d.ts +1 -1
- package/dist/{menu-item-CZi9vy5O.d.ts → menu-item-ZmkXNjek.d.ts} +2 -2
- package/dist/{menu-item-CZi9vy5O.d.ts.map → menu-item-ZmkXNjek.d.ts.map} +1 -1
- package/dist/menu.d.ts +2 -2
- package/dist/panel.d.ts +1 -1
- package/dist/{split-layout-JK3xWVX2.d.ts → split-layout-C5SYbDrq.d.ts} +2 -2
- package/dist/{split-layout-JK3xWVX2.d.ts.map → split-layout-C5SYbDrq.d.ts.map} +1 -1
- package/dist/split-layout.d.ts +1 -1
- package/dist/{tab-list-CGyPt07Z.d.ts → tab-list-DbMIL520.d.ts} +2 -2
- package/dist/{tab-list-CGyPt07Z.d.ts.map → tab-list-DbMIL520.d.ts.map} +1 -1
- package/dist/tabs.d.ts +1 -1
- package/dist/{titlebar-Tqu-VvMU.d.ts → titlebar-B5zSTZnF.d.ts} +2 -2
- package/dist/{titlebar-Tqu-VvMU.d.ts.map → titlebar-B5zSTZnF.d.ts.map} +1 -1
- package/dist/titlebar.d.ts +1 -1
- package/docs-user/grid-list.md +2 -1
- package/docs-user/index.json +2 -2
- package/package.json +1 -1
- package/dist/grid-list-BXfY3XXX.js.map +0 -1
- package/dist/icon-CDGprSdE.d.ts.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["#collapsedDragging","#dragStartY","#dragStartHeight","#onTabPointerMove","#onTabPointerUp","#displayHeight","#onResizeMove","#onResizeEnd","#maxHeight","#setHeight","#syncCommands","#teardownCommands","#ownedRegistry","#commandTarget","#commandName","#commandIds","#morphProgress","#dragOpacity","#onDrawerKeyDown","#onResizeStart","#onResizeKeyDown","customElement","#updateComputedItems","#handleToggleChange","#handleRadioChange","customElement","#handleArrowDown","#handleArrowUp","#handleArrowRight","#handleArrowLeft","#handleEnter","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","#resizeObserver","#lastWidth","#updateStacked","#detailTimer","#handlePointerLeave","#handlePointerEnter","#select","customElement","customElement","DRAG_THRESHOLD_PX","customElement","DRAG_THRESHOLD_PX","customElement","customElement","#scaleTo100","#userMin","#userMax","#scaleFrom100","#userClamp","#updateScale","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","#elementBounds","#startSizeA","#startSizeB","#onResizeHandleUp","#onResizeHandleMove","#collapsedAPointerAtCollapse","#hysteresisThreshold","#dispatchCollapsedEvent","#applyConstraints","#collapsedBPointerAtCollapse","#cornerStartX","#cornerStartY","#getNestedSplit","#nestedSplitInitialSizeA","#nestedSplitBounds","#nestedHandleBounds","#onCornerResizeUp","#onCornerResizeMove","#parseSizeAsFraction","#pendingNestedUpdate","#applyPendingNestedUpdate","#observer","#setupNestedSplitObserver","#updateCornerPosition","#updateDataCollapsed","#checkForNestedSplit","#nestedSplit","#minSizeToFraction","#maxSizeToFraction","#parseSizeToPx","#getIntersectionPoint","#onCornerResizeDown","#onResizeHandleDown","customElement"],"sources":["../src/bottom-drawer/bottom-drawer.ts","../src/button/radio-group.ts","../src/interaction/tree-keyboard-controller.ts","../src/button/split-button.ts","../src/crumbs/crumb-path-controller.ts","../src/crumbs/crumb-path.ts","../src/data-table/data-table.ts","../src/dock/dock-drag.ts","../src/dock/dock-model.ts","../src/tabs/tab-list-item.ts","../src/dock/dock-panel.ts","../src/dock/dock-host.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/drag.ts","../src/util/near.ts","../src/range/range-multi.ts","../src/rating/rating.ts","../src/sliding-number/sliding-number.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/twosplit-layout/split-layout.ts","../src/util/checkbox.ts","../src/index.ts"],"sourcesContent":["/* eslint-disable ts/no-unsafe-declaration-merging */\n/**\n * `ixfx-bottom-drawer` — container whose `drawer` slot slides over the bottom\n * of its default-slot content. The drawer can be resized from its top edge.\n *\n * Slots\n * (default) – main content underneath the drawer\n * `drawer` – drawer body content\n * `toolbar` – header toolbar items, forwarded into the `ixfx-titlebar` toolbar\n *\n * Properties\n * `open` – whether the drawer is visible (default: false)\n * `height` – drawer height in px (default: 320)\n * `min-height` – minimum height before fade-out (default: 160)\n * `dismiss-threshold` – drag below this height closes the drawer (default: 96)\n * `max-height-ratio` – max height as a fraction of host height (default: 0.85)\n * `label` – header title and accessible label (default: `Drawer`)\n * `icon-name` – header icon (default: ``)\n * `closable` – show the header close button (default: true)\n * `collapsible` – show the expand/collapse caret that toggles `open` (default: true)\n * `maintain-handle` – keep a drag handle docked to the bottom when\n * collapsed so users can drag up to reopen. Dragging the drawer down\n * gradually morphs it into the handle (default: false)\n * `name` – command namespace. When set, `expand`/`collapse`/`toggle`\n * commands are registered as `<name>.expand` etc. (default: `` = no commands)\n * `registry` – `@clinth/ui-commands` registry carrying this drawer's\n * commands. Created automatically; assign a shared registry to trigger\n * named drawers globally (default: owned registry)\n *\n * The header is an `ixfx-titlebar`. Theme variables (e.g. `--surface-4`,\n * `--accent`) set on the drawer inherit into the header, and `toolbar`-slotted\n * content stays in the consumer's light DOM so it can be styled directly.\n *\n * Commands (require `name`; see {@link bottomDrawerCommandId})\n * `<name>.expand` – open the drawer (`show()`)\n * `<name>.collapse` – close the drawer (`close()`, fires `drawer-close`)\n * `<name>.toggle` – open if closed, close if open\n *\n * ```typescript\n * drawer.registry?.invoke('inspector.expand');\n * ```\n *\n * Events\n * `drawer-close` – CustomEvent<void>, bubbles + composed\n * `drawer-resize` – CustomEvent { detail: { height: number } }, bubbles + composed\n *\n * CSS variables\n * `--bottom-drawer-background` – drawer fill\n * `--bottom-drawer-border` – drawer border\n * `--bottom-drawer-radius` – top corner radius\n * `--bottom-drawer-blur` – backdrop blur amount\n * `--bottom-drawer-shadow` – drawer drop shadow\n * `--ixfx-handle-*` – resize-grip look (shared handle primitive; see\n * docs/infra-handle.md)\n * `--bottom-drawer-collapsed-width` – width of the floating pill shown\n * when collapsed with `maintain-handle` (default: 96px)\n * `--bottom-drawer-title-background` – header fill (default: transparent,\n * so the header shares the drawer's translucency)\n */\nimport type { CommandRegistry } from '@clinth/ui-commands';\nimport type { PropertyValues } from 'lit';\nimport type { TitlebarCloseEvent, TitlebarToggleEvent } from '../titlebar/titlebar.js';\nimport { createCommandRegistry } from '@clinth/ui-commands';\nimport { css, html, LitElement } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { handleStyles } from '../styles/handle.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport '../titlebar/titlebar.js';\n\nexport type BottomDrawerResizeDetail = {\n readonly height: number;\n};\n\nexport type BottomDrawerResizeEvent = CustomEvent<BottomDrawerResizeDetail>;\nexport type BottomDrawerCloseEvent = CustomEvent<void>;\n\nexport interface BottomDrawerElementEventMap {\n 'drawer-close': BottomDrawerCloseEvent;\n 'drawer-resize': BottomDrawerResizeEvent;\n}\n\n/** Commands a named drawer registers, namespaced as `<name>.<command>`. */\nexport type BottomDrawerCommand = `expand` | `collapse` | `toggle`;\n\n/** Builds the command id for a named drawer's command, e.g. `inspector.expand`. */\nexport function bottomDrawerCommandId(name: string, command: BottomDrawerCommand): string {\n return `${name.trim()}.${command}`;\n}\n\nfunction clampRange(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n\n@customElement(`ixfx-bottom-drawer`)\nexport class BottomDrawerElement extends LitElement {\n static override styles = [themeFallbacks, handleStyles, css`\n :host {\n --bottom-drawer-background: color-mix(in srgb, var(--surface-2) 84%, transparent);\n --bottom-drawer-border: 1px solid color-mix(in srgb, var(--surface-2-text) 14%, transparent);\n --bottom-drawer-radius: var(--radius-l);\n --bottom-drawer-blur: 18px;\n --bottom-drawer-shadow: var(--shadow-l);\n --bottom-drawer-collapsed-width: 96px;\n\n display: block;\n position: relative;\n height: 100%;\n min-width: 0;\n min-height: 0;\n overflow: hidden;\n }\n .content {\n position: absolute;\n inset: 0;\n min-width: 0;\n min-height: 0;\n }\n .content ::slotted(*) {\n width: 100%;\n height: 100%;\n }\n .drawer {\n --m: 0;\n position: absolute;\n z-index: 2;\n right: calc(var(--m) * (50% - var(--bottom-drawer-collapsed-width) / 2));\n bottom: 0;\n left: calc(var(--m) * (50% - var(--bottom-drawer-collapsed-width) / 2));\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n height: var(--bottom-drawer-height);\n max-height: 100%;\n min-height: 0;\n color: var(--surface-2-text);\n background: var(--bottom-drawer-background);\n border: var(--bottom-drawer-border);\n border-bottom: 0;\n border-radius: var(--bottom-drawer-radius) var(--bottom-drawer-radius) 0 0;\n box-shadow: var(--bottom-drawer-shadow);\n backdrop-filter: blur(var(--bottom-drawer-blur)) saturate(1.15);\n -webkit-backdrop-filter: blur(var(--bottom-drawer-blur)) saturate(1.15);\n opacity: 0;\n transform: translateY(100%);\n visibility: hidden;\n transition:\n transform var(--transition),\n opacity var(--transition),\n left var(--transition),\n right var(--transition),\n height var(--transition),\n visibility 0s linear 0.16s;\n will-change: transform, opacity;\n }\n :host([open]) .drawer {\n opacity: var(--bottom-drawer-opacity, 1);\n transform: translateY(0);\n visibility: visible;\n transition:\n transform var(--transition),\n opacity var(--transition),\n left var(--transition),\n right var(--transition),\n height var(--transition);\n }\n :host([resizing]) {\n cursor: ns-resize;\n user-select: none;\n }\n :host([resizing]) .drawer {\n transition: none;\n }\n .resize-edge {\n position: absolute;\n z-index: 1;\n top: -5px;\n right: 0;\n left: 0;\n height: 11px;\n cursor: ns-resize;\n touch-action: none;\n outline: none;\n }\n .resize-edge .ixfx-handle {\n position: absolute;\n top: 7px;\n left: 50%;\n transform: translateX(-50%);\n --ixfx-handle-length: 44px;\n --ixfx-handle-thickness: 3px;\n --ixfx-handle-radius: 999px;\n }\n /* Inner content fades as the drawer morphs into its collapsed tab. */\n ixfx-titlebar,\n .body {\n opacity: calc(1 - var(--m, 0));\n transition: opacity var(--transition);\n }\n :host([resizing]) ixfx-titlebar,\n :host([resizing]) .body {\n transition: none;\n }\n /* Collapsed tab: docked to the bottom edge, narrowed to handle width. */\n :host([maintain-handle]:not([open])) .drawer {\n --m: 1;\n height: 20px;\n opacity: 1;\n transform: translateY(0);\n visibility: visible;\n transition:\n transform var(--transition),\n opacity var(--transition),\n left var(--transition),\n right var(--transition),\n height var(--transition);\n }\n :host([maintain-handle]:not([open])) ixfx-titlebar,\n :host([maintain-handle]:not([open])) .body {\n display: none;\n }\n :host([maintain-handle]:not([open])) .resize-edge {\n top: 0;\n height: 100%;\n }\n :host([maintain-handle]:not([open])) .resize-edge .ixfx-handle {\n top: 50%;\n transform: translate(-50%, -50%);\n }\n ixfx-titlebar {\n flex: none;\n --titlebar-background: var(--bottom-drawer-title-background, transparent);\n border-bottom: 1px solid color-mix(in srgb, var(--surface-2-text) 10%, transparent);\n }\n .body {\n flex: 1;\n min-height: 0;\n overflow: auto;\n overscroll-behavior: contain;\n }\n .body ::slotted(*) {\n box-sizing: border-box;\n }\n @media (prefers-reduced-motion: reduce) {\n .drawer,\n ixfx-titlebar,\n .body {\n transition-duration: 0s;\n }\n }\n `];\n\n @property({ type: Boolean, reflect: true })\n open = false;\n\n @property({ type: Number })\n height = 320;\n\n @property({ type: Number, attribute: `min-height` })\n minHeight = 160;\n\n @property({ type: Number, attribute: `dismiss-threshold` })\n dismissThreshold = 96;\n\n @property({ type: Number, attribute: `max-height-ratio` })\n maxHeightRatio = 0.85;\n\n @property({ type: String })\n label = `Drawer`;\n\n @property({ type: String, attribute: `icon-name` })\n iconName = ``;\n\n @property({ type: Boolean })\n closable = true;\n\n @property({ type: Boolean })\n collapsible = true;\n\n @property({ type: Boolean, attribute: `maintain-handle`, reflect: true })\n maintainHandle = false;\n\n @property({ type: String })\n name = ``;\n\n @property({ attribute: false })\n registry: CommandRegistry<unknown> | undefined;\n\n @state() private _dragHeight: number | undefined;\n\n #dragStartY = 0;\n #dragStartHeight = 0;\n #collapsedDragging = false;\n #ownedRegistry: CommandRegistry<unknown> | undefined;\n #commandTarget: CommandRegistry<unknown> | undefined;\n #commandName = ``;\n #commandIds: string[] = [];\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.#syncCommands();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.#teardownCommands();\n if (this.#ownedRegistry !== undefined) {\n if (this.registry === this.#ownedRegistry)\n this.registry = undefined;\n this.#ownedRegistry = undefined;\n }\n }\n\n protected override updated(changed: PropertyValues): void {\n super.updated(changed);\n if (changed.has(`name`) || changed.has(`registry`))\n this.#syncCommands();\n }\n\n show(): void {\n this.open = true;\n }\n\n close(): void {\n if (!this.open)\n return;\n this.open = false;\n this.dispatchEvent(new CustomEvent<void>(`drawer-close`, { bubbles: true, composed: true }));\n }\n\n toggle(): void {\n if (this.open)\n this.close();\n else\n this.show();\n }\n\n #syncCommands(): void {\n const name = this.name.trim();\n const target = this.registry ?? this.#ownedRegistry;\n if (name !== `` && this.isConnected && target !== undefined\n && this.#commandTarget === target && this.#commandName === name) {\n return;\n }\n this.#teardownCommands();\n if (name === `` || !this.isConnected)\n return;\n const resolved = this.registry ?? (this.#ownedRegistry ??= createCommandRegistry());\n if (this.#ownedRegistry !== undefined && resolved !== this.#ownedRegistry)\n this.#ownedRegistry = undefined;\n if (this.registry === undefined)\n this.registry = resolved;\n const registered: string[] = [];\n const commands: Array<{ command: BottomDrawerCommand; label: string; description: string; execute: () => void }> = [\n { command: `expand`, label: `Expand ${this.label}`, description: `Open the ${this.label} drawer`, execute: () => this.show() },\n { command: `collapse`, label: `Collapse ${this.label}`, description: `Close the ${this.label} drawer`, execute: () => this.close() },\n { command: `toggle`, label: `Toggle ${this.label}`, description: `Open the ${this.label} drawer if closed, close it if open`, execute: () => this.toggle() },\n ];\n for (const { command, label, description, execute } of commands) {\n const id = bottomDrawerCommandId(name, command);\n if (resolved.has(id))\n continue;\n resolved.register({ id, label, description, execute });\n registered.push(id);\n }\n this.#commandTarget = resolved;\n this.#commandName = name;\n this.#commandIds = registered;\n }\n\n #teardownCommands(): void {\n if (this.#commandTarget !== undefined) {\n for (const id of this.#commandIds)\n this.#commandTarget.unregister(id);\n this.#commandTarget = undefined;\n this.#commandName = ``;\n this.#commandIds = [];\n }\n }\n\n private _onTitlebarToggle(event: TitlebarToggleEvent): void {\n event.stopPropagation();\n if (event.detail.collapsed)\n this.close();\n else\n this.open = true;\n }\n\n private _onTitlebarClose(event: TitlebarCloseEvent): void {\n event.stopPropagation();\n this.close();\n }\n\n protected override render(): ReturnType<typeof html> {\n const raw = this.#displayHeight();\n const max = this.#maxHeight();\n const morph = this.#morphProgress(raw);\n const height = this.open ? raw * (1 - morph) + 20 * morph : 20;\n const opacity = this.maintainHandle && this.open ? 1 : this.#dragOpacity(raw);\n return html`\n <div class=\"content\"><slot></slot></div>\n <section\n class=\"drawer\"\n style=${`--bottom-drawer-height: ${height}px; --bottom-drawer-opacity: ${opacity}; --m: ${morph}`}\n role=\"region\"\n aria-label=${this.label}\n @keydown=${this.#onDrawerKeyDown}\n >\n <div\n class=\"resize-edge\"\n role=\"separator\"\n tabindex=\"0\"\n aria-label=${`${this.open ? `Resize` : `Expand`} ${this.label}`}\n aria-orientation=\"horizontal\"\n aria-valuemin=${this.minHeight}\n aria-valuemax=${max}\n aria-valuenow=${Math.round(raw)}\n @pointerdown=${this.#onResizeStart}\n @keydown=${this.#onResizeKeyDown}\n ><span class=\"ixfx-handle\" data-handle=\"dimpled\" data-shape=\"horizontal\" part=\"handle\"></span></div>\n <ixfx-titlebar\n .title=${this.label}\n .iconName=${this.iconName}\n .closable=${this.closable}\n .collapsible=${this.collapsible}\n .collapsed=${!this.open}\n ?inert=${!this.open}\n @toggle=${this._onTitlebarToggle}\n @close=${this._onTitlebarClose}\n >\n <slot name=\"toolbar\" slot=\"toolbar\"></slot>\n </ixfx-titlebar>\n <div class=\"body\" ?inert=${!this.open}><slot name=\"drawer\"></slot></div>\n </section>\n `;\n }\n\n #maxHeight(): number {\n const availableHeight = this.clientHeight || this.height;\n return Math.max(this.minHeight, availableHeight * clampRange(this.maxHeightRatio, 0, 1));\n }\n\n #displayHeight(): number {\n return clampRange(this._dragHeight ?? this.height, 0, this.#maxHeight());\n }\n\n #dragOpacity(height: number): number {\n if (this._dragHeight === undefined || height >= this.minHeight)\n return 1;\n const fadeRange = this.minHeight - this.dismissThreshold;\n if (fadeRange <= 0)\n return height >= this.dismissThreshold ? 1 : 0;\n return clampRange((height - this.dismissThreshold) / fadeRange, 0, 1);\n }\n\n #morphProgress(raw: number): number {\n if (!this.open)\n return this.maintainHandle ? 1 : 0;\n if (this._dragHeight === undefined || !this.maintainHandle)\n return 0;\n const range = this.minHeight - this.dismissThreshold;\n if (range <= 0)\n return raw < this.dismissThreshold ? 1 : 0;\n return clampRange((this.minHeight - raw) / range, 0, 1);\n }\n\n #setHeight(height: number): void {\n this.height = clampRange(height, this.minHeight, this.#maxHeight());\n this.dispatchEvent(new CustomEvent<BottomDrawerResizeDetail>(`drawer-resize`, {\n detail: { height: this.height },\n bubbles: true,\n composed: true,\n }));\n }\n\n #onResizeStart = (event: PointerEvent): void => {\n if (event.button !== 0)\n return;\n event.preventDefault();\n const edge = event.currentTarget as HTMLElement;\n edge.setPointerCapture(event.pointerId);\n if (!this.open) {\n this.#collapsedDragging = false;\n this.#dragStartY = event.clientY;\n this.#dragStartHeight = this.dismissThreshold;\n edge.addEventListener(`pointermove`, this.#onTabPointerMove);\n edge.addEventListener(`pointerup`, this.#onTabPointerUp, { once: true });\n edge.addEventListener(`pointercancel`, this.#onTabPointerUp, { once: true });\n return;\n }\n this.#dragStartY = event.clientY;\n this.#dragStartHeight = this.#displayHeight();\n this._dragHeight = this.#dragStartHeight;\n this.toggleAttribute(`resizing`, true);\n edge.addEventListener(`pointermove`, this.#onResizeMove);\n edge.addEventListener(`pointerup`, this.#onResizeEnd, { once: true });\n edge.addEventListener(`pointercancel`, this.#onResizeEnd, { once: true });\n };\n\n #onResizeMove = (event: PointerEvent): void => {\n this._dragHeight = clampRange(this.#dragStartHeight + this.#dragStartY - event.clientY, 0, this.#maxHeight());\n };\n\n #onResizeEnd = (event: PointerEvent): void => {\n const edge = event.currentTarget as HTMLElement;\n edge.removeEventListener(`pointermove`, this.#onResizeMove);\n edge.removeEventListener(`pointerup`, this.#onResizeEnd);\n edge.removeEventListener(`pointercancel`, this.#onResizeEnd);\n if (edge.hasPointerCapture(event.pointerId))\n edge.releasePointerCapture(event.pointerId);\n this.toggleAttribute(`resizing`, false);\n const height = this._dragHeight ?? this.height;\n this._dragHeight = undefined;\n if (height < this.dismissThreshold) {\n this.close();\n return;\n }\n this.#setHeight(height);\n };\n\n #onResizeKeyDown = (event: KeyboardEvent): void => {\n if (!this.open) {\n if (event.key === `ArrowUp` || event.key === `Enter` || event.key === ` ` || event.key === `Home` || event.key === `End`) {\n event.preventDefault();\n this.show();\n }\n return;\n }\n const delta = event.shiftKey ? 64 : 16;\n if (event.key === `ArrowUp`) {\n event.preventDefault();\n this.#setHeight(this.height + delta);\n } else if (event.key === `ArrowDown`) {\n event.preventDefault();\n if (this.height - delta < this.dismissThreshold)\n this.close();\n else\n this.#setHeight(this.height - delta);\n } else if (event.key === `Home`) {\n event.preventDefault();\n this.#setHeight(this.minHeight);\n } else if (event.key === `End`) {\n event.preventDefault();\n this.#setHeight(this.#maxHeight());\n }\n };\n\n #onTabPointerMove = (event: PointerEvent): void => {\n const delta = this.#dragStartY - event.clientY;\n if (!this.#collapsedDragging) {\n if (delta < 4)\n return;\n this.#collapsedDragging = true;\n this.show();\n this.toggleAttribute(`resizing`, true);\n }\n this._dragHeight = clampRange(this.#dragStartHeight + this.#dragStartY - event.clientY, 0, this.#maxHeight());\n };\n\n #onTabPointerUp = (event: PointerEvent): void => {\n const target = event.currentTarget as HTMLElement;\n target.removeEventListener(`pointermove`, this.#onTabPointerMove);\n target.removeEventListener(`pointerup`, this.#onTabPointerUp);\n target.removeEventListener(`pointercancel`, this.#onTabPointerUp);\n if (target.hasPointerCapture(event.pointerId))\n target.releasePointerCapture(event.pointerId);\n if (!this.#collapsedDragging) {\n this.show();\n return;\n }\n this.#collapsedDragging = false;\n this.toggleAttribute(`resizing`, false);\n const height = this._dragHeight ?? this.height;\n this._dragHeight = undefined;\n if (height < this.dismissThreshold) {\n this.close();\n return;\n }\n this.#setHeight(height);\n };\n\n #onDrawerKeyDown = (event: KeyboardEvent): void => {\n if (event.key !== `Escape`)\n return;\n event.preventDefault();\n event.stopPropagation();\n this.close();\n };\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-bottom-drawer': BottomDrawerElement;\n }\n}\n\nexport interface BottomDrawerElement {\n addEventListener: (<K extends keyof BottomDrawerElementEventMap>(\n type: K,\n listener: (this: BottomDrawerElement, event: BottomDrawerElementEventMap[K]) => void,\n options?: boolean | AddEventListenerOptions,\n ) => void) & ((\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ) => void);\n}\n","import type { PropertyValues } from 'lit';\nimport { css, html, LitElement } from 'lit';\nimport { property, query, state } from 'lit/decorators.js';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { prominenceStyles } from '../styles/prominence.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport '../icons/icon.js';\n\nexport type RadioGroupMode = `compact` | `max`;\n\nexport type RadioItem = Readonly<{\n value: string;\n label: string;\n disabled?: boolean;\n iconName?: string;\n iconNameOff?: string;\n}>;\n\n@customElement(`ixfx-radio-group`)\nexport class RadioGroup extends LitElement {\n @property({ type: String }) value = ``;\n @property({ type: String }) orientation: `horizontal` | `vertical` = `horizontal`;\n @property({ type: Array }) items: RadioItem[] = [];\n @property({ type: String }) name = ``;\n @property({ type: String }) mode: RadioGroupMode = `compact`;\n @property({ type: Boolean }) checked = false;\n @property({ type: String, attribute: `value-off` }) valueOff = ``;\n @property({ type: String, attribute: `icon-name` }) iconName = ``;\n @property({ type: String, attribute: `icon-name-off` }) iconNameOff = ``;\n @property({ type: Boolean, attribute: `hide-labels` }) hideLabels = false;\n\n @state() private _computedItems: RadioItem[] = [];\n @state() private _icons: Map<string, string> = new Map();\n @query(`slot`) private _slot?: HTMLSlotElement;\n\n private get _isSingleToggle(): boolean {\n return this._computedItems.length === 0 && Boolean(this.textContent?.trim());\n }\n\n private get _singleToggleIconName(): string | null {\n if (!this.iconName && !this.iconNameOff)\n return null;\n return this.checked ? this.iconName : (this.iconNameOff || this.iconName);\n }\n\n protected override firstUpdated(): void {\n this.#updateComputedItems();\n }\n\n protected override updated(changedProperties: PropertyValues): void {\n if (changedProperties.has(`checked`)) {\n const input = this.shadowRoot?.querySelector(`.radio-toggle-input`) as HTMLInputElement | undefined;\n if (input && input.checked !== this.checked) {\n input.checked = this.checked;\n const newValue = this.checked\n ? (this.value || `on`)\n : (this.valueOff || undefined);\n\n this.dispatchEvent(new CustomEvent<RadioGroupChangeDetail>(`change`, {\n detail: { checked: this.checked, value: newValue },\n bubbles: true,\n composed: true,\n }));\n }\n }\n\n if (changedProperties.has(`value`) && !this._isSingleToggle) {\n const inputs = this.shadowRoot?.querySelectorAll(`.radio-input`) as NodeListOf<HTMLInputElement>;\n if (inputs) {\n for (const input of inputs) {\n if (input.checked !== (input.value === this.value)) {\n input.checked = input.value === this.value;\n }\n }\n }\n }\n }\n\n #updateComputedItems(): void {\n const options = this.querySelectorAll(`option`);\n const icons = new Map<string, string>();\n\n if (options.length > 0) {\n this._computedItems = Array.from(options, (el) => {\n const tempDiv = document.createElement(`div`);\n tempDiv.innerHTML = el.innerHTML;\n const iconEl = tempDiv.querySelector(`svg`);\n if (iconEl) {\n icons.set(el.getAttribute(`value`) || ``, iconEl.outerHTML);\n }\n return {\n value: el.getAttribute(`value`) || ``,\n label: el.textContent?.trim() || ``,\n disabled: el.hasAttribute(`disabled`),\n iconName: el.getAttribute(`icon-name`) || undefined,\n iconNameOff: el.getAttribute(`icon-name-off`) || undefined,\n };\n });\n this._icons = icons;\n } else {\n this._computedItems = [...this.items];\n }\n }\n\n // #handleItemClick(item: RadioItem): void {\n // if (item.disabled || item.value === this.value)\n // return;\n\n // this.value = item.value;\n // this.dispatchEvent(new CustomEvent<RadioGroupChangeDetail>(`change`, {\n // detail: { checked: true, value: item.value },\n // bubbles: true,\n // composed: true,\n // }));\n // }\n\n #handleRadioChange(e: Event): void {\n e.stopImmediatePropagation();\n const input = e.target as HTMLInputElement;\n this.value = input.value;\n this.dispatchEvent(new CustomEvent<RadioGroupChangeDetail>(`change`, {\n detail: { checked: true, value: input.value },\n bubbles: true,\n composed: true,\n }));\n }\n\n #handleToggleChange(e: Event): void {\n e.stopImmediatePropagation();\n const input = e.target as HTMLInputElement;\n this.checked = input.checked;\n const newValue = this.checked\n ? (this.value || `on`)\n : (this.valueOff || undefined);\n\n this.dispatchEvent(new CustomEvent<RadioGroupChangeDetail>(`change`, {\n detail: { checked: this.checked, value: newValue },\n bubbles: true,\n composed: true,\n }));\n }\n\n #renderIcon(item: RadioItem): ReturnType<typeof html> | null {\n const isSelected = item.value === this.value;\n const iconName = isSelected ? (item.iconName || null) : (item.iconNameOff || item.iconName || null);\n if (iconName) {\n return html`<ixfx-icon class=\"radio-icon\" name=\"${iconName}\"></ixfx-icon>`;\n }\n const iconHtml = this._icons.get(item.value);\n if (!iconHtml)\n return null;\n return html`<span class=\"radio-icon\">${unsafeHTML(iconHtml)}</span>`;\n }\n\n protected override render(): unknown {\n if (this._isSingleToggle) {\n const iconName = this._singleToggleIconName;\n const showIcon = iconName || this.hideLabels;\n const iconPart = showIcon\n ? html`<ixfx-icon class=\"radio-icon\" name=\"${iconName || `check`}\"></ixfx-icon>`\n : null;\n const labelPart = !this.hideLabels\n ? html`<span class=\"radio-label\" data-text=\"${this.textContent?.trim()}\">${this.textContent?.trim()}</span>`\n : null;\n return html`\n <label class=\"radio-item ${this.checked ? `selected` : ``}\">\n <input\n type=\"checkbox\"\n class=\"radio-toggle-input\"\n ?checked=${this.checked}\n @change=${this.#handleToggleChange}\n />\n ${iconPart}\n ${labelPart}\n </label>\n `;\n }\n\n return html`\n <slot @slotchange=${this.#updateComputedItems} style=\"display: none;\"></slot>\n <div class=\"radio-group ${this.orientation} ${this.mode}\" role=\"radiogroup\" aria-label=${this.name}>\n ${this._computedItems.map((item) => {\n const isSelected = item.value === this.value;\n const iconName = isSelected\n ? (item.iconName || null)\n : (item.iconNameOff || item.iconName || null);\n const showIcon = iconName || this.hideLabels;\n const iconPart = showIcon\n ? html`<ixfx-icon class=\"radio-icon\" name=\"${iconName || `check`}\"></ixfx-icon>`\n : null;\n const labelPart = !this.hideLabels\n ? html`<span class=\"radio-label\" data-text=\"${item.label}\">${item.label}</span>`\n : null;\n return html`\n <label class=\"radio-item ${item.value === this.value ? `selected` : ``}\" ?disabled=${item.disabled}>\n <input\n type=\"radio\"\n class=\"radio-input\"\n name=${this.name}\n value=${item.value}\n ?disabled=${item.disabled}\n ?checked=${item.value === this.value}\n @change=${this.#handleRadioChange}\n />\n ${iconPart}\n ${labelPart}\n </label>\n `;\n })}\n </div>\n `;\n }\n\n static override styles = [themeFallbacks, prominenceStyles, css`\n :host {\n display: inline-flex;\n min-width: min-content;\n box-sizing: border-box;\n /* Default to looking like a cohesive control group */\n background: var(--surface-4, transparent);\n background: oklch(from var(--surface-4) l calc(c*0.2) h / 0.4);\n\n border: var(--border, none);\n border-radius: var(--radius-xl, 8px);\n }\n\n * {\n box-sizing: border-box;\n }\n\n .radio-toggle-input {\n position: absolute;\n opacity: 0;\n width: 0;\n height: 0;\n pointer-events: none;\n }\n\n .radio-input {\n position: absolute;\n opacity: 0;\n width: 0;\n height: 0;\n pointer-events: none;\n }\n\n .radio-group {\n display: flex;\n width: 100%;\n height: 100%;\n gap: var(--item-spacing, 0);\n overflow: hidden;\n border-radius: inherit;\n justify-content: center;\n }\n\n .radio-group.horizontal {\n flex-direction: row;\n }\n\n .radio-group.vertical {\n flex-direction: column;\n }\n\n .radio-group.max.horizontal .radio-item {\n flex: 1;\n justify-content: center;\n }\n\n .radio-group.max.vertical .radio-item {\n flex: 1;\n justify-content: flex-start;\n }\n\n .radio-item {\n display: inline-flex;\n align-items: center;\n justify-content: flex-start;\n gap: var(--icon-label-spacing, 0.5rem);\n padding: var(--space-m, 0.5rem) var(--space-l, 1rem);\n border: none;\n background: transparent;\n color: var(--color-fg-fade, var(--surface-muted-text));\n font-family: inherit;\n font-size: var(--text-m, inherit);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n cursor: pointer;\n transition: all var(--transition, 0.1s) ease;\n user-select: none;\n white-space: nowrap;\n }\n\n .radio-item:hover:not([disabled]) {\n opacity: 0.9;\n background: color-mix(in oklch, var(--surface-4) 80%, transparent);\n 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 { ReactiveController, ReactiveControllerHost } from 'lit';\nimport type { TickledController, TickledItem } from './tickled-controller.js';\n\nexport type TreeKeyboardNavItemId = string;\n\nexport type TreeKeyboardNavCallbacks = {\n getItems: () => ReadonlyArray<TickledItem<TreeKeyboardNavItemId>>;\n onExpand: (id: TreeKeyboardNavItemId) => void;\n onCollapse: (id: TreeKeyboardNavItemId) => void;\n onActivate: (id: TreeKeyboardNavItemId) => void;\n onSelect?: (id: TreeKeyboardNavItemId) => void;\n onEscape?: () => void;\n isLeaf: (id: TreeKeyboardNavItemId) => boolean;\n isExpanded: (id: TreeKeyboardNavItemId) => boolean;\n getParentId?: (id: TreeKeyboardNavItemId) => TreeKeyboardNavItemId | undefined;\n};\n\nexport type TreeKeyboardNavControllerConfig = {\n callbacks: TreeKeyboardNavCallbacks;\n disableKeyboardNavigation?: () => boolean;\n};\n\nexport class TreeKeyboardNavController implements ReactiveController {\n private host: ReactiveControllerHost;\n private tickled: TickledController<TreeKeyboardNavItemId>;\n private callbacks: TreeKeyboardNavCallbacks;\n private disableKeyboardNavigation: () => boolean;\n\n constructor(host: ReactiveControllerHost, tickled: TickledController<TreeKeyboardNavItemId>, config: TreeKeyboardNavControllerConfig) {\n this.host = host;\n this.tickled = tickled;\n this.callbacks = config.callbacks;\n this.disableKeyboardNavigation = config.disableKeyboardNavigation ?? (() => false);\n host.addController(this);\n }\n\n hostConnected(): void {}\n\n hostDisconnected(): void {}\n\n handleKeyDown = (event: KeyboardEvent): void => {\n if (this.disableKeyboardNavigation()) {\n return;\n }\n\n const { key } = event;\n\n if ([`ArrowDown`, `ArrowUp`, `ArrowLeft`, `ArrowRight`, `Enter`, `Escape`].includes(key)) {\n this.tickled.setInputMode(`keyboard`);\n }\n\n switch (key) {\n case `ArrowDown`:\n event.preventDefault();\n this.#handleArrowDown();\n break;\n case `ArrowUp`:\n event.preventDefault();\n this.#handleArrowUp();\n break;\n case `ArrowRight`:\n event.preventDefault();\n this.#handleArrowRight();\n break;\n case `ArrowLeft`:\n event.preventDefault();\n this.#handleArrowLeft();\n break;\n case `Enter`:\n event.preventDefault();\n this.#handleEnter();\n break;\n case `Escape`:\n event.preventDefault();\n this.callbacks.onEscape?.();\n break;\n }\n };\n\n #handleArrowDown(): void {\n this.tickled.handleKeyboardNavigation(`next`);\n }\n\n #handleArrowUp(): void {\n this.tickled.handleKeyboardNavigation(`previous`);\n }\n\n #handleArrowRight(): void {\n const currentId = this.tickled.tickledId;\n if (!currentId)\n return;\n\n if (this.callbacks.isLeaf(currentId)) {\n return;\n }\n\n if (!this.callbacks.isExpanded(currentId)) {\n this.callbacks.onExpand(currentId);\n this.tickled.setTickled(currentId);\n } else {\n const items = this.callbacks.getItems();\n const currentIdx = items.findIndex(item => item.id === currentId);\n if (currentIdx !== -1 && currentIdx + 1 < items.length) {\n const nextItem = items[currentIdx + 1];\n if (nextItem.enabled !== false) {\n this.tickled.setTickled(nextItem.id);\n }\n }\n }\n }\n\n #handleArrowLeft(): void {\n const currentId = this.tickled.tickledId;\n if (!currentId)\n return;\n\n if (this.callbacks.isLeaf(currentId)) {\n const parentId = this.callbacks.getParentId?.(currentId);\n if (parentId) {\n this.tickled.setTickled(parentId);\n if (this.callbacks.isExpanded(parentId)) {\n this.callbacks.onCollapse(parentId);\n }\n }\n } else if (this.callbacks.isExpanded(currentId)) {\n this.callbacks.onCollapse(currentId);\n } else {\n const parentId = this.callbacks.getParentId?.(currentId);\n if (parentId) {\n this.tickled.setTickled(parentId);\n }\n }\n }\n\n #handleEnter(): void {\n const currentId = this.tickled.tickledId;\n if (!currentId)\n return;\n\n this.callbacks.onActivate(currentId);\n this.callbacks.onSelect?.(currentId);\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","/* eslint-disable ts/no-unsafe-declaration-merging */\nimport type { PropertyValues, TemplateResult } from 'lit';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { TickledController, tickledItemStyles, tickledStyles } from '../interaction/index.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\n\nexport type DataTableRow = {\n label: string;\n value: string | number | boolean | Node | TemplateResult;\n fullWidth?: boolean;\n detail?: string | TemplateResult;\n id?: string;\n};\n\nexport type DataTableRowClickDetail = {\n readonly row: DataTableRow;\n readonly index: number;\n readonly selected: boolean;\n};\n\nexport type DataTableRowClickEvent = CustomEvent<DataTableRowClickDetail>;\n\nexport interface DataTableElementEventMap {\n 'data-table-row-click': DataTableRowClickEvent;\n}\n\n@customElement(`ixfx-data-table`)\nexport class DataTableElement extends LitElement {\n static override styles = [\n tickledStyles,\n tickledItemStyles,\n css`\n :host {\n display: block;\n container-type: inline-size;\n }\n\n .properties {\n display: grid;\n grid-template-columns: var(--data-table-name-width, max-content)\n var(--data-table-value-width, minmax(0, 1fr));\n /* No column gap: the tickled highlight reads as one solid block.\n Separation comes from cell padding, which the highlight covers. */\n gap: 2px 0;\n }\n\n /* Widening: 2 then 3 property-pairs per row on roomy containers.\n Suppressed when stacked, or when locked to 'columns'. */\n @container (min-width: 650px) {\n :host(:not([layout='columns'])) .properties:not(.stacked) {\n grid-template-columns:\n var(--data-table-name-width, max-content) var(--data-table-value-width, minmax(0, 1fr))\n var(--data-table-name-width, max-content) var(--data-table-value-width, minmax(0, 1fr));\n }\n }\n\n @container (min-width: 1000px) {\n :host(:not([layout='columns'])) .properties:not(.stacked) {\n grid-template-columns:\n var(--data-table-name-width, max-content) var(--data-table-value-width, minmax(0, 1fr))\n var(--data-table-name-width, max-content) var(--data-table-value-width, minmax(0, 1fr))\n var(--data-table-name-width, max-content) var(--data-table-value-width, minmax(0, 1fr));\n }\n }\n\n /* Stacked (key above value). Threshold is JS-driven via 'narrowBreakpoint'.\n minmax(0, 1fr) — not 1fr — so a long value's min-content size can't\n blow the column out past the container; the value then ellipsises. */\n .properties.stacked {\n grid-template-columns: minmax(0, 1fr);\n }\n\n /* A pair is its own subgrid so the whole row is one element:\n the tickled highlight can't split, and key/value share a baseline. */\n .pair {\n display: grid;\n grid-column: span 2;\n grid-template-columns: subgrid;\n align-items: var(--data-table-cell-align, baseline);\n cursor: pointer;\n }\n\n .pair[data-full] {\n grid-column: 1 / -1;\n }\n\n .pair[data-full] > .value {\n grid-column: 2 / -1;\n }\n\n .properties.stacked .pair {\n display: block;\n grid-column: 1 / -1;\n /* Let the block shrink below its content so .value-text can clip. */\n min-width: 0;\n }\n\n .properties.stacked .pair:not(:last-child) {\n margin-bottom: var(--space-s);\n }\n\n /* Stacked keys get their own line, so a long label must wrap rather than\n run off the edge (nowrap is only wanted for the max-content column). */\n .properties.stacked .key {\n white-space: normal;\n overflow-wrap: break-word;\n }\n\n .key,\n .value {\n min-width: 0;\n /* Row rhythm comes from this padding (tunable), not line-height. */\n padding: var(--data-table-row-padding, 0.35em) 0;\n }\n\n .key {\n padding-right: var(--space-m);\n opacity: 0.6;\n white-space: nowrap;\n text-align: var(--data-table-name-align, left);\n font-size: 10px;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n /* Uppercase keys have no descenders, so both edges can be trimmed to\n the glyphs for tight baseline / centre alignment. */\n text-box: trim-both cap alphabetic;\n }\n\n .value {\n position: relative;\n padding-right: var(--space-l);\n font: 12px ui-monospace, SFMono-Regular, Menlo, monospace;\n }\n\n /* The value text is clipped here — never on .value itself — so a long\n value stays within its cell even while tickled, and the detail\n popover (a child of .value) can still escape the cell. */\n .value-text {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n /* No text-box trim here: the natural line box gives descenders the room\n overflow:hidden would otherwise clip. Baseline alignment of key and\n value comes from align-items on .pair, which needs no trimming. */\n }\n\n .pair.tickled {\n background: var(--item-bg-tickled, color-mix(in oklch, var(--surface-2), var(--accent) 10%));\n }\n\n /* Lift the row whose detail is open above the rows it slides over. */\n .pair.show-detail {\n position: relative;\n z-index: 1;\n }\n\n .detail {\n position: absolute;\n z-index: 2;\n /* Flush with the bottom of the value (no gap) so the pointer can travel\n from value to panel without crossing a dead zone that would dismiss it.\n Left-aligned with the value; only as wide as its content, capped at\n the table width. */\n top: 100%;\n left: 0;\n right: auto;\n width: max-content;\n max-width: 100cqi;\n padding: var(--space-xs);\n background: var(--surface-2);\n visibility: hidden;\n transform: translateY(-4px);\n pointer-events: none;\n transition: transform var(--transition);\n }\n\n .pair.show-detail .detail {\n visibility: visible;\n transform: translateY(0);\n pointer-events: auto;\n }\n `,\n ];\n\n @property({ type: Array, attribute: false })\n rows: readonly DataTableRow[] = [];\n\n @property({ type: Number, attribute: false })\n selectedIndex: number | undefined;\n\n /**\n * How long (ms) the pointer must rest on a hovered row before its detail\n * panel is revealed. The tickled highlight itself appears immediately on\n * hover; only the detail panel is debounced. Clicking a row reveals its\n * detail straight away, ignoring this delay.\n */\n @property({ type: Number, attribute: `tickle-delay` })\n tickleDelay = 400;\n\n /**\n * Table layout.\n * - `auto` (default): responsive — widens to multiple pair-columns on wide\n * containers, and stacks key above value once narrower than\n * {@link narrowBreakpoint}.\n * - `rows`: always stacked (key above value), regardless of width.\n * - `columns`: always a two-column key/value grid, regardless of width.\n */\n @property({ type: String, reflect: true })\n layout: `auto` | `rows` | `columns` = `auto`;\n\n /**\n * Inline width (px) at or below which the `auto` layout switches to its\n * stacked, key-above-value form. Ignored when {@link layout} is locked.\n */\n @property({ type: Number, attribute: `narrow-breakpoint` })\n narrowBreakpoint = 420;\n\n @state()\n private _tickled = new TickledController<number>(this, {\n getItems: () => this.rows.map((_, i) => ({ id: i, enabled: true })),\n });\n\n /** Index of the row whose detail panel is currently revealed, if any. */\n @state()\n private _detailIndex: number | undefined;\n\n /** Whether the table is currently rendering in its stacked form. */\n @state()\n private _stacked = false;\n\n #detailTimer: ReturnType<typeof setTimeout> | undefined;\n #resizeObserver: ResizeObserver | undefined;\n #lastWidth = 0;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.#resizeObserver = new ResizeObserver((entries) => {\n const entry = entries[0];\n if (!entry)\n return;\n this.#lastWidth = entry.borderBoxSize?.[0]?.inlineSize ?? entry.contentRect.width;\n this.#updateStacked();\n });\n this.#resizeObserver.observe(this);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n clearTimeout(this.#detailTimer);\n this.#resizeObserver?.disconnect();\n this.#resizeObserver = undefined;\n }\n\n override willUpdate(changed: PropertyValues<this>): void {\n if (changed.has(`layout`) || changed.has(`narrowBreakpoint`)) {\n this.#updateStacked();\n }\n }\n\n #updateStacked(): void {\n const stacked = this.layout === `rows`\n ? true\n : this.layout === `columns`\n ? false\n : this.#lastWidth > 0 && this.#lastWidth <= this.narrowBreakpoint;\n if (stacked !== this._stacked)\n this._stacked = stacked;\n }\n\n #handlePointerEnter(i: number): void {\n // Tickle straight away, exactly as a click would.\n this._tickled.handlePointerEnter(i);\n // But hold the detail panel back until the pointer has rested a while.\n clearTimeout(this.#detailTimer);\n if (this._detailIndex !== undefined)\n this._detailIndex = undefined;\n this.#detailTimer = setTimeout(() => {\n if (this._tickled.isTickled(i))\n this._detailIndex = i;\n }, this.tickleDelay);\n }\n\n #handlePointerLeave(e: PointerEvent): void {\n clearTimeout(this.#detailTimer);\n this._detailIndex = undefined;\n this._tickled.handlePointerLeave(e);\n }\n\n #select(i: number): void {\n clearTimeout(this.#detailTimer);\n this.selectedIndex = this.selectedIndex === i ? undefined : i;\n this._tickled.setTickled(i);\n // A click reveals the detail immediately, no debounce.\n this._detailIndex = i;\n this.dispatchEvent(\n new CustomEvent<DataTableRowClickDetail>(`data-table-row-click`, {\n bubbles: true,\n composed: true,\n detail: {\n row: this.rows[i]!,\n index: i,\n selected: this.selectedIndex === i,\n },\n }),\n );\n }\n\n override render(): ReturnType<typeof html> {\n return html`<div\n class=\"properties ${this._stacked ? `stacked` : ``}\"\n @pointerleave=${(e: PointerEvent) => this.#handlePointerLeave(e)}\n >\n ${this.rows.map(\n (r, i) => html`<div\n class=\"pair ${this._tickled.isTickled(i) ? `tickled` : ``} ${\n this._detailIndex === i ? `show-detail` : ``\n }\"\n ?data-full=${r.fullWidth}\n @pointerenter=${() => this.#handlePointerEnter(i)}\n @click=${() => this.#select(i)}\n ><div class=\"key\">${r.label}</div><div class=\"value\"><span class=\"value-text\">${\n typeof r.value === `boolean`\n ? r.value\n ? `Yes`\n : `No`\n : r.value\n }</span>${r.detail === undefined ? nothing : html`<div class=\"detail\" part=\"detail\">${r.detail}</div>`}</div></div>`,\n )}</div>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-data-table': DataTableElement;\n }\n}\n\nexport interface DataTableElement {\n addEventListener<K extends keyof DataTableElementEventMap>(\n type: K,\n listener: (\n this: DataTableElement,\n event: DataTableElementEventMap[K],\n ) => void,\n options?: boolean | AddEventListenerOptions\n ): void;\n addEventListener(\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions\n ): void;\n}\n","import type { DragGhost } from '../util/drag-ghost.js';\nimport type { DockHostElement } from './dock-host.js';\nimport type { DockDragBoundaryDetail, DockOperation, DockPanelTearOutDetail } from './types.js';\nimport { createDragGhost } from '../util/drag-ghost.js';\n\nexport interface Rect {\n readonly x: number;\n readonly y: number;\n readonly w: number;\n readonly h: number;\n}\n\nexport interface DockDropZone {\n /** Host whose model would receive the drop. */\n readonly host: DockHostElement;\n readonly operation: DockOperation;\n /** Path of the target stack (`[]` = the host root). */\n readonly targetPath: number[];\n readonly side: `before` | `after`;\n /** Insert position for `tabs` drops (panel index in the target stack). */\n readonly gapIndex?: number;\n /** Highlight rect, relative to the host. */\n readonly rect: Rect;\n /** Optional insertion caret for strip gaps, relative to the host. */\n readonly caretRect?: Rect;\n}\n\ninterface DragState {\n panelId: string;\n /** Content kind at drag start — target hosts vet leaf rules without element access. */\n kind?: string;\n sourceHost: DockHostElement;\n pointerId: number;\n ghost: DragGhost | null;\n /** True while the pointer is outside every registered host (tear-out zone). */\n outside: boolean;\n}\n\nlet activeDrag: DragState | null = null;\nconst dragHosts: Set<DockHostElement> = new Set();\n\nexport function registerDockHost(host: DockHostElement): void {\n dragHosts.add(host);\n}\n\nexport function unregisterDockHost(host: DockHostElement): void {\n dragHosts.delete(host);\n if (activeDrag !== null && activeDrag.sourceHost === host) {\n abortDrag();\n }\n}\n\n/**\n * Begin a dock-panel drag. Called by hosts in response to their own\n * `dock-panel-drag-start` events (titlebar or tab-item handles).\n */\nexport function startDrag(\n panelId: string,\n sourceHost: DockHostElement,\n pointerId: number,\n clientX: number,\n clientY: number,\n kind?: string,\n): void {\n if (activeDrag !== null) {\n abortDrag();\n }\n\n const ghost = createGhostForPanel(sourceHost, panelId);\n activeDrag = { panelId, kind, sourceHost, pointerId, ghost, outside: false };\n\n for (const host of dragHosts) {\n host.setDragActive(true);\n }\n\n activeDrag.ghost?.move(clientX, clientY);\n\n window.addEventListener(`pointermove`, onPointerMove);\n window.addEventListener(`pointerup`, onPointerUp);\n window.addEventListener(`pointercancel`, onPointerCancel);\n window.addEventListener(`keydown`, onKeyDown);\n}\n\nfunction createGhostForPanel(host: DockHostElement, panelId: string): DragGhost | null {\n const panel = Array.from(host.children).find(\n (el): el is HTMLElement & { panelId: string; title: string; iconName: string } =>\n el instanceof HTMLElement && (el as { panelId?: string }).panelId === panelId,\n );\n if (!panel)\n return null;\n\n const content = document.createElement(`span`);\n content.style.display = `inline-flex`;\n content.style.alignItems = `center`;\n content.style.gap = `var(--space-xs, 4px)`;\n content.style.minWidth = `0`;\n\n if (panel.iconName) {\n const icon = document.createElement(`ixfx-icon`) as HTMLElement & { name: string };\n icon.name = panel.iconName;\n content.appendChild(icon);\n }\n\n const label = document.createElement(`span`);\n label.textContent = panel.title || panelId;\n label.style.overflow = `hidden`;\n label.style.textOverflow = `ellipsis`;\n label.style.whiteSpace = `nowrap`;\n content.appendChild(label);\n\n try {\n return createDragGhost({ anchor: panel, content });\n } catch {\n return null;\n }\n}\n\nfunction onPointerMove(event: PointerEvent): void {\n const drag = activeDrag;\n if (drag === null || event.pointerId !== drag.pointerId)\n return;\n\n drag.ghost?.move(event.clientX, event.clientY);\n\n const zone = findDropZone(drag, event.clientX, event.clientY);\n for (const host of dragHosts) {\n host.setDropZone(zone !== null && zone.host === host ? zone : null);\n }\n\n // Boundary crossings — the app uses these to start / stop a native window\n // drag when a panel is pulled out past every host.\n const outside = !pointerOverAnyHost(event.clientX, event.clientY);\n if (outside !== drag.outside) {\n drag.outside = outside;\n dispatchBoundary(drag, outside ? `dock-panel-drag-out` : `dock-panel-drag-in`, event);\n }\n}\n\nfunction onPointerUp(event: PointerEvent): void {\n const drag = activeDrag;\n if (drag === null || event.pointerId !== drag.pointerId)\n return;\n\n const zone = findDropZone(drag, event.clientX, event.clientY);\n if (zone !== null) {\n zone.host.handleDrop(drag.panelId, zone, drag.sourceHost);\n } else {\n // Released with no valid zone. If the pointer is outside every host this\n // is a tear-out request: hand the app a snapshot + screen coordinates so\n // it can open a new window and recreate the panel there. The panel is\n // left untouched in the source host — the app calls `detachPanel()` (or\n // `removePanel()`) once it has taken ownership.\n if (!pointerOverAnyHost(event.clientX, event.clientY)) {\n dispatchTearOut(drag, event);\n }\n }\n endDrag();\n}\n\nfunction onPointerCancel(event: PointerEvent): void {\n const drag = activeDrag;\n if (drag === null || event.pointerId !== drag.pointerId)\n return;\n abortDrag();\n endDrag();\n}\n\nfunction onKeyDown(event: KeyboardEvent): void {\n if (activeDrag === null)\n return;\n if (event.key !== `Escape`)\n return;\n abortDrag();\n endDrag();\n}\n\nfunction findDropZone(drag: DragState, clientX: number, clientY: number): DockDropZone | null {\n const sourceIsolated = drag.sourceHost.isolated;\n\n for (const host of dragHosts) {\n if (sourceIsolated && host !== drag.sourceHost)\n continue;\n\n const zone = host.computeDropZone(clientX, clientY, drag.panelId, drag.kind);\n if (zone !== null)\n return zone;\n }\n return null;\n}\n\n/** True when the point lies within the bounding box of any registered host. */\nexport function pointerOverAnyHost(clientX: number, clientY: number): boolean {\n for (const host of dragHosts) {\n const r = host.getBoundingClientRect();\n if (clientX >= r.left && clientX <= r.right && clientY >= r.top && clientY <= r.bottom)\n return true;\n }\n return false;\n}\n\nfunction dispatchBoundary(drag: DragState, type: string, event: PointerEvent): void {\n drag.sourceHost.dispatchEvent(new CustomEvent<DockDragBoundaryDetail>(type, {\n detail: {\n panelId: drag.panelId,\n clientX: event.clientX,\n clientY: event.clientY,\n screenX: event.screenX,\n screenY: event.screenY,\n },\n bubbles: true,\n composed: true,\n }));\n}\n\nfunction dispatchTearOut(drag: DragState, event: PointerEvent): void {\n const snapshot = drag.sourceHost.getPanelSnapshot(drag.panelId);\n if (snapshot === null)\n return;\n drag.sourceHost.dispatchEvent(new CustomEvent<DockPanelTearOutDetail>(`dock-panel-tear-out`, {\n detail: {\n panelId: drag.panelId,\n snapshot,\n clientX: event.clientX,\n clientY: event.clientY,\n screenX: event.screenX,\n screenY: event.screenY,\n },\n bubbles: true,\n composed: true,\n }));\n}\n\n/** Drop cancelled — no model mutation. */\nfunction abortDrag(): void {\n // Zone clearing happens in endDrag; nothing else to undo.\n}\n\nfunction endDrag(): void {\n const drag = activeDrag;\n if (drag === null)\n return;\n\n for (const host of dragHosts) {\n host.setDropZone(null);\n host.setDragActive(false);\n }\n\n drag.ghost?.destroy();\n activeDrag = null;\n\n window.removeEventListener(`pointermove`, onPointerMove);\n window.removeEventListener(`pointerup`, onPointerUp);\n window.removeEventListener(`pointercancel`, onPointerCancel);\n window.removeEventListener(`keydown`, onKeyDown);\n}\n\nexport function isDragging(): boolean {\n return activeDrag !== null;\n}\n\nexport function getActiveDragPanelId(): string | null {\n return activeDrag?.panelId ?? null;\n}\n","import type {\n DockAxis,\n DockDirection,\n DockEdge,\n DockLayout,\n DockLeafInfo,\n DockLeafRef,\n DockNeighbours,\n DockNode,\n DockSplitNode,\n DockStackNode,\n} from './types.js';\n\nexport type {\n DockAxis,\n DockDirection,\n DockEdge,\n DockLayout,\n DockLeafInfo,\n DockLeafRef,\n DockNeighbours,\n DockNode,\n DockSplitNode,\n DockStackNode,\n};\n\n/**\n * The dock model is a plain mutable tree owned exclusively by the host\n * element. Mutators below change the tree in place; the host calls\n * `normalize(root)` then `requestUpdate()` after batching mutations.\n */\nexport function isSplit(node: DockNode): node is DockSplitNode {\n return node.kind === `split`;\n}\n\nexport function isStack(node: DockNode): node is DockStackNode {\n return node.kind === `stack`;\n}\n\nexport function createEmptyStack(): DockStackNode {\n return { kind: `stack`, panels: [], active: `` };\n}\n\nexport function createEmptyLayout(): DockLayout {\n return { version: 1, root: createEmptyStack() };\n}\n\nexport function createStack(panels: string[], active?: string, name?: string): DockStackNode {\n const stack: DockStackNode = {\n kind: `stack`,\n panels: [...panels],\n active: active ?? panels[0] ?? ``,\n };\n const trimmed = name?.trim();\n if (trimmed) {\n stack.name = trimmed;\n }\n return stack;\n}\n\nexport function createSplit(direction: DockAxis, children: DockNode[], sizes?: number[]): DockSplitNode {\n const mean = children.length > 0 ? 1 / children.length : 1;\n return {\n kind: `split`,\n direction,\n children: [...children],\n sizes: sizes ? [...sizes] : children.map(() => mean),\n };\n}\n\n// ── Normalize ────────────────────────────────────────────────────────────────\n\n/**\n * Runs after every mutation:\n * - stack `active` fixed to a member of `panels` (or `''` when empty)\n * - empty *unnamed* stacks removed from their parent split (and their\n * `sizes` entry); named empty stacks are kept so the name stays addressable\n * - splits with ≤1 child replaced by that child (spliced into the parent)\n * - a child split whose direction equals its parent's is flattened into it,\n * spreading its sizes across the slot it vacated\n * - `sizes` kept parallel to `children` (padded with the mean weight)\n * - an empty root collapses to a single empty stack\n */\nexport function normalize(root: DockNode): DockNode {\n if (isStack(root)) {\n sanitizeStackName(root);\n if (!root.panels.includes(root.active)) {\n root.active = root.panels[0] ?? ``;\n }\n return root;\n }\n\n // Depth-first: normalize children, then flatten/carry-up at this level.\n for (let i = root.children.length - 1; i >= 0; i--) {\n normalize(root.children[i]);\n\n const child = root.children[i];\n\n // Drop empty stacks, unless named (names stay addressable)\n if (isStack(child) && child.panels.length === 0 && !child.name) {\n root.children.splice(i, 1);\n root.sizes.splice(i, 1);\n continue;\n }\n\n // Carry single-child splits up\n if (isSplit(child) && child.children.length === 1) {\n root.children.splice(i, 1, child.children[0]);\n root.sizes.splice(i, 1, child.sizes[0] ?? root.sizes[i] ?? 1);\n }\n }\n\n // Flatten same-direction child splits into this one\n for (let i = root.children.length - 1; i >= 0; i--) {\n const child = root.children[i];\n if (isSplit(child) && child.direction === root.direction) {\n root.children.splice(i, 1, ...child.children);\n root.sizes.splice(i, 1, ...child.sizes);\n }\n }\n\n // A split with ≤1 child dissolves\n if (root.children.length === 0) {\n return replaceNodeContents(root, createEmptyStack());\n }\n if (root.children.length === 1) {\n return root.children[0];\n }\n\n // Keep sizes parallel to children\n while (root.sizes.length < root.children.length) {\n root.sizes.push(1 / root.children.length);\n }\n if (root.sizes.length > root.children.length) {\n root.sizes.length = root.children.length;\n }\n\n return root;\n}\n\n/**\n * Turn `target` (a stack or split node object) into the shape of `source`'s\n * kind, used when the root itself must dissolve. Mutates `target` in place so\n * the host's root reference stays valid.\n */\nfunction replaceNodeContents(target: DockNode, source: DockNode): DockNode {\n if (isStack(source)) {\n target.kind = `stack`;\n const t = target as DockStackNode;\n t.panels = source.panels;\n t.active = source.active;\n if (source.name !== undefined) {\n t.name = source.name;\n } else {\n delete t.name;\n }\n if (source.hideLabels !== undefined) {\n t.hideLabels = source.hideLabels;\n } else {\n delete t.hideLabels;\n }\n delete t.collapsed;\n delete t.preCollapseSize;\n if (source.collapsed !== undefined)\n t.collapsed = source.collapsed;\n if (source.preCollapseSize !== undefined)\n t.preCollapseSize = source.preCollapseSize;\n } else {\n target.kind = `split`;\n const t = target as DockSplitNode;\n t.direction = source.direction;\n t.children = source.children;\n t.sizes = source.sizes;\n // Drop stale stack-only fields when morphing stack → split\n const stale = t as unknown as Record<string, unknown>;\n delete stale.panels;\n delete stale.active;\n delete stale.name;\n delete stale.collapsed;\n delete stale.preCollapseSize;\n }\n return target;\n}\n\n/** Trim `name`; drop it when empty / non-string so lookups stay predictable. */\nfunction sanitizeStackName(stack: DockStackNode): void {\n if (stack.name === undefined)\n return;\n const trimmed = typeof stack.name === `string` ? stack.name.trim() : ``;\n if (trimmed) {\n stack.name = trimmed;\n } else {\n delete stack.name;\n }\n}\n\n// ── Lookup ───────────────────────────────────────────────────────────────────\n\nexport function findNode(root: DockNode, path: number[]): DockNode | null {\n let current: DockNode = root;\n for (const index of path) {\n if (!isSplit(current))\n return null;\n const next = current.children[index];\n if (!next)\n return null;\n current = next;\n }\n return current;\n}\n\n/** Parent split of the node at `path`; null when path is empty or malformed. */\nexport function findParentOf(root: DockNode, path: number[]): DockSplitNode | null {\n if (path.length === 0)\n return null;\n const parent = findNode(root, path.slice(0, -1));\n return parent !== null && isSplit(parent) ? parent : null;\n}\n\n/** Path of the stack containing `panelId`, or null. */\nexport function findStackOf(root: DockNode, panelId: string): number[] | null {\n return findStackOfInner(root, panelId, []);\n}\n\nfunction findStackOfInner(node: DockNode, panelId: string, path: number[]): number[] | null {\n if (isStack(node)) {\n return node.panels.includes(panelId) ? path : null;\n }\n for (let i = 0; i < node.children.length; i++) {\n const found = findStackOfInner(node.children[i], panelId, [...path, i]);\n if (found !== null)\n return found;\n }\n return null;\n}\n\nexport function collectPanelIds(root: DockNode): string[] {\n if (isStack(root)) {\n return [...root.panels];\n }\n return root.children.flatMap(collectPanelIds);\n}\n\n/**\n * Path of the first stack (tree order) whose `name` matches, or null.\n * Names are expected to be unique per layout; duplicates resolve first-wins.\n */\nexport function findStackPathByName(root: DockNode, name: string): number[] | null {\n const wanted = name.trim();\n if (!wanted)\n return null;\n return findStackPathByNameInner(root, wanted, []);\n}\n\nfunction findStackPathByNameInner(node: DockNode, name: string, path: number[]): number[] | null {\n if (isStack(node)) {\n return node.name === name ? path : null;\n }\n for (let i = 0; i < node.children.length; i++) {\n const found = findStackPathByNameInner(node.children[i], name, [...path, i]);\n if (found !== null)\n return found;\n }\n return null;\n}\n\n/** Names of every named stack leaf, in tree order. */\nexport function collectContainerNames(root: DockNode): string[] {\n const out: string[] = [];\n const visit = (node: DockNode): void => {\n if (isStack(node)) {\n if (node.name)\n out.push(node.name);\n return;\n }\n node.children.forEach(visit);\n };\n visit(root);\n return out;\n}\n\n/**\n * Paths of every stack leaf, in tree order. `[]` is the root itself when it\n * is a stack.\n */\nexport function collectStackPaths(root: DockNode): number[][] {\n const result: number[][] = [];\n collectStackPathsInner(root, [], result);\n return result;\n}\n\nfunction collectStackPathsInner(node: DockNode, path: number[], out: number[][]): void {\n if (isStack(node)) {\n out.push(path);\n return;\n }\n node.children.forEach((child, i) => collectStackPathsInner(child, [...path, i], out));\n}\n\n// ── Mutations (in place; run `normalize` afterwards) ─────────────────────────\n\nexport function addPanelToStack(stack: DockStackNode, panelId: string, index?: number): void {\n const at = index === undefined ? stack.panels.length : Math.max(0, Math.min(index, stack.panels.length));\n stack.panels.splice(at, 0, panelId);\n stack.active = panelId;\n}\n\nexport function removePanelFromStack(stack: DockStackNode, panelId: string): void {\n const index = stack.panels.indexOf(panelId);\n if (index < 0)\n return;\n stack.panels.splice(index, 1);\n if (stack.active === panelId) {\n stack.active = stack.panels[Math.min(index, stack.panels.length - 1)] ?? ``;\n }\n}\n\nexport function setActive(stack: DockStackNode, panelId: string): boolean {\n if (!stack.panels.includes(panelId) || stack.active === panelId)\n return false;\n stack.active = panelId;\n return true;\n}\n\n/**\n * Insert `node` beside the child at `targetPath`, into the parent split when\n * its direction matches `direction`, otherwise wrap the target in a new split.\n * `side` selects before/after; the neighbour's weight is split 50/50.\n * Returns the path of the inserted node, or null.\n */\nexport function insertBeside(\n root: DockNode,\n targetPath: number[],\n direction: DockAxis,\n newNode: DockNode,\n side: `before` | `after`,\n): number[] | null {\n const target = findNode(root, targetPath);\n if (target === null)\n return null;\n\n // Root-level: insert at the edge if the root already matches, else wrap\n if (targetPath.length === 0) {\n if (isSplit(root) && root.direction === direction) {\n const edgeIndex = side === `before` ? 0 : root.children.length;\n const neighbourIndex = side === `before` ? 0 : root.children.length - 1;\n const neighbour = root.sizes[neighbourIndex];\n root.children.splice(edgeIndex, 0, newNode);\n root.sizes.splice(edgeIndex, 0, neighbour !== undefined ? neighbour / 2 : 1);\n if (neighbour !== undefined) {\n root.sizes[side === `before` ? neighbourIndex + 1 : neighbourIndex] = neighbour / 2;\n }\n return [edgeIndex];\n }\n wrapRoot(root, direction, newNode, side);\n return [side === `before` ? 0 : 1];\n }\n\n const parent = findParentOf(root, targetPath);\n if (parent === null)\n return null;\n\n const index = targetPath[targetPath.length - 1];\n\n if (parent.direction === direction) {\n const insertAt = side === `before` ? index : index + 1;\n const w = parent.sizes[index] !== undefined ? parent.sizes[index] / 2 : 1;\n parent.sizes[index] = w;\n parent.children.splice(insertAt, 0, newNode);\n parent.sizes.splice(insertAt, 0, w);\n const childPath = [...targetPath.slice(0, -1), insertAt];\n normalize(root);\n return childPath;\n }\n\n const wrapper = createSplit(direction, side === `before` ? [newNode, target] : [target, newNode]);\n parent.children[index] = wrapper;\n normalize(root);\n const childIndex = side === `before` ? 0 : 1;\n return [...targetPath.slice(0, -1), index, childIndex];\n}\n\n/**\n * Wrap the whole root in a new split of `direction`, replacing it in place so\n * the caller's reference stays valid. Returns true on success.\n */\nexport function wrapRoot(root: DockNode, direction: DockAxis, newNode: DockNode, side: `before` | `after`): boolean {\n // The wrapper's inner child must be a *copy* of the root's current contents,\n // not `root` itself: `replaceNodeContents` morphs `root` in place, so passing\n // the live reference would leave `root.children` holding `root` — a cycle that\n // makes `normalize` recurse until the stack overflows.\n const inner = cloneNodeShallow(root);\n const wrapper = createSplit(direction, side === `before` ? [newNode, inner] : [inner, newNode]);\n replaceNodeContents(root, wrapper);\n normalize(root);\n return true;\n}\n\n/**\n * Detached copy of `node` (own arrays copied) so it can become a child of a\n * wrapper that then replaces `node` in place.\n */\nfunction cloneNodeShallow(node: DockNode): DockNode {\n if (isStack(node)) {\n return { ...node, panels: [...node.panels] };\n }\n return { ...node, children: [...node.children], sizes: [...node.sizes] };\n}\n\n/**\n * Remove the stack at `stackPath` from the tree. Its panels are moved into\n * `fallbackStack` (if given and still attached) so they are not silently\n * lost; otherwise they are dropped from the model (elements return to the\n * pool). Returns the removed stack.\n */\nexport function extractStack(root: DockNode, stackPath: number[], fallbackStack?: DockStackNode): DockStackNode | null {\n const stack = findNode(root, stackPath);\n if (stack === null || !isStack(stack))\n return null;\n\n const isRoot = stackPath.length === 0;\n\n if (fallbackStack && fallbackStack !== stack) {\n for (const id of stack.panels) {\n addPanelToStack(fallbackStack, id);\n }\n // Only keep the panels in one place\n if (!isRoot) {\n stack.panels = [];\n stack.active = ``;\n }\n }\n\n if (isRoot) {\n replaceNodeContents(root, createEmptyStack());\n return stack;\n }\n\n const parent = findParentOf(root, stackPath);\n if (parent === null)\n return null;\n\n const index = stackPath[stackPath.length - 1];\n parent.children.splice(index, 1);\n parent.sizes.splice(index, 1);\n normalize(root);\n return stack;\n}\n\n// ── Spatial (geometry + leaf moves) ──────────────────────────────────────────\n//\n// Leaves are positioned by subdividing a unit square along each split\n// (child share = `sizes[i] / sum(sizes)`). Neighbour queries and moves below\n// are derived from that geometry, so they reflect what the user sees rather\n// than raw tree adjacency.\n\n/** Tolerance for edge-touch comparisons in unit-square geometry. */\nconst GEOM_EPS = 1e-9;\n\nexport interface DockRect {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nexport interface LeafGeom {\n path: number[];\n name: string | null;\n rect: DockRect;\n}\n\nfunction pathsEqual(a: readonly number[], b: readonly number[]): boolean {\n return a.length === b.length && a.every((v, i) => v === b[i]);\n}\n\n/**\n * Resolve a {@link DockLeafRef} to a stack path. Strings match container\n * `name` first-wins; arrays must index an existing stack leaf. Returns null\n * when unresolvable.\n */\nexport function resolveLeafPath(root: DockNode, ref: DockLeafRef): number[] | null {\n if (typeof ref === `string`) {\n return findStackPathByName(root, ref);\n }\n if (!Array.isArray(ref)) {\n return null;\n }\n let current: DockNode = root;\n for (const index of ref) {\n if (!Number.isInteger(index) || (index as number) < 0) {\n return null;\n }\n if (!isSplit(current)) {\n return null;\n }\n const next = current.children[index as number];\n if (!next) {\n return null;\n }\n current = next;\n }\n return isStack(current) ? [...ref] : null;\n}\n\n/** Absolute (unit-square) rect of every stack leaf, in tree order. */\nexport function computeLeafGeoms(root: DockNode): LeafGeom[] {\n const out: LeafGeom[] = [];\n const visit = (node: DockNode, path: number[], rect: DockRect): void => {\n if (isStack(node)) {\n out.push({ path, name: node.name ?? null, rect });\n return;\n }\n const total = node.sizes.reduce((sum, w) => sum + w, 0);\n const safe = total > 0 ? total : node.children.length || 1;\n let offset = 0;\n node.children.forEach((child, i) => {\n const frac = (node.sizes[i] ?? safe / node.children.length) / safe;\n if (node.direction === `row`) {\n const w = rect.w * frac;\n visit(child, [...path, i], { x: rect.x + offset, y: rect.y, w, h: rect.h });\n offset += w;\n } else {\n const h = rect.h * frac;\n visit(child, [...path, i], { x: rect.x, y: rect.y + offset, w: rect.w, h });\n offset += h;\n }\n });\n };\n visit(root, [], { x: 0, y: 0, w: 1, h: 1 });\n return out;\n}\n\nfunction intervalOverlap(a0: number, a1: number, b0: number, b1: number): number {\n return Math.min(a1, b1) - Math.max(a0, b0);\n}\n\n/**\n * Geometric neighbours of a leaf — what the user sees above / below / left /\n * right of it. Each list holds `{ name, path }` (name is null for unnamed\n * leaves), ordered most-overlapping first. Returns null when `ref` is\n * unresolvable.\n */\nexport function getLeafNeighbours(root: DockNode, ref: DockLeafRef): DockNeighbours | null {\n const path = resolveLeafPath(root, ref);\n if (path === null) {\n return null;\n }\n const geoms = computeLeafGeoms(root);\n const self = geoms.find(g => pathsEqual(g.path, path));\n if (!self) {\n return null;\n }\n const s = self.rect;\n type Hit = { info: DockLeafInfo; overlap: number; order: number };\n const above: Hit[] = [];\n const below: Hit[] = [];\n const left: Hit[] = [];\n const right: Hit[] = [];\n geoms.forEach((g, order) => {\n if (g === self) {\n return;\n }\n const r = g.rect;\n const info: DockLeafInfo = { name: g.name, path: [...g.path] };\n if (Math.abs(r.y + r.h - s.y) < GEOM_EPS) {\n const o = intervalOverlap(r.x, r.x + r.w, s.x, s.x + s.w);\n if (o > GEOM_EPS)\n above.push({ info, overlap: o, order });\n }\n if (Math.abs(s.y + s.h - r.y) < GEOM_EPS) {\n const o = intervalOverlap(r.x, r.x + r.w, s.x, s.x + s.w);\n if (o > GEOM_EPS)\n below.push({ info, overlap: o, order });\n }\n if (Math.abs(r.x + r.w - s.x) < GEOM_EPS) {\n const o = intervalOverlap(r.y, r.y + r.h, s.y, s.y + s.h);\n if (o > GEOM_EPS)\n left.push({ info, overlap: o, order });\n }\n if (Math.abs(s.x + s.w - r.x) < GEOM_EPS) {\n const o = intervalOverlap(r.y, r.y + r.h, s.y, s.y + s.h);\n if (o > GEOM_EPS)\n right.push({ info, overlap: o, order });\n }\n });\n const rank = (hits: Hit[]): DockLeafInfo[] =>\n hits.sort((a, b) => b.overlap - a.overlap || a.order - b.order).map(h => h.info);\n return { above: rank(above), below: rank(below), left: rank(left), right: rank(right) };\n}\n\n/**\n * Exchange two leaves' positions in the tree, each carrying its size slot so\n * the remaining structure and proportions are untouched. Returns false when\n * either path is not a stack leaf.\n */\nexport function swapLeaves(root: DockNode, pathA: number[], pathB: number[]): boolean {\n if (pathsEqual(pathA, pathB)) {\n return false;\n }\n const nodeA = findNode(root, pathA);\n const nodeB = findNode(root, pathB);\n if (nodeA === null || nodeB === null || !isStack(nodeA) || !isStack(nodeB)) {\n return false;\n }\n const parentA = findParentOf(root, pathA);\n const parentB = findParentOf(root, pathB);\n if (parentA === null || parentB === null) {\n return false;\n }\n const indexA = pathA[pathA.length - 1];\n const indexB = pathB[pathB.length - 1];\n if (parentA === parentB) {\n const p = parentA;\n [p.children[indexA], p.children[indexB]] = [p.children[indexB], p.children[indexA]];\n [p.sizes[indexA], p.sizes[indexB]] = [p.sizes[indexB] ?? 1, p.sizes[indexA] ?? 1];\n return true;\n }\n const carriedNode = parentA.children[indexA];\n const carriedSize = parentA.sizes[indexA] ?? 1;\n parentA.children[indexA] = parentB.children[indexB];\n parentA.sizes[indexA] = parentB.sizes[indexB] ?? 1;\n parentB.children[indexB] = carriedNode;\n parentB.sizes[indexB] = carriedSize;\n return true;\n}\n\n/**\n * Move a leaf one position in `direction`, swapping with the neighbour it\n * shares the longest edge with. Returns false when `ref` is unresolvable or\n * nothing adjoins in that direction. Run `normalize()` afterwards.\n */\nexport function moveLeafStep(root: DockNode, ref: DockLeafRef, direction: DockDirection): boolean {\n const path = resolveLeafPath(root, ref);\n if (path === null) {\n return false;\n }\n const neighbours = getLeafNeighbours(root, ref);\n if (neighbours === null) {\n return false;\n }\n const list = direction === `up`\n ? neighbours.above\n : direction === `down`\n ? neighbours.below\n : direction === `left`\n ? neighbours.left\n : neighbours.right;\n if (list.length === 0) {\n return false;\n }\n return swapLeaves(root, path, list[0].path);\n}\n\n/**\n * Move a leaf to an edge of the overall layout, keeping the rest of the\n * tree intact as a single subtree and preserving the leaf's absolute size\n * along the target axis. Returns false when `ref` is unresolvable or the\n * layout holds a single leaf. Run `normalize()` afterwards (also safe to\n * call it twice — the host's commit does).\n */\nexport function moveLeafNodeToEdge(root: DockNode, ref: DockLeafRef, edge: DockEdge): boolean {\n const path = resolveLeafPath(root, ref);\n if (path === null || path.length === 0) {\n return false;\n }\n const geoms = computeLeafGeoms(root);\n const self = geoms.find(g => pathsEqual(g.path, path));\n if (!self) {\n return false;\n }\n const horizontal = edge === `left` || edge === `right`;\n const frac = Math.min(Math.max(horizontal ? self.rect.w : self.rect.h, 0.05), 0.95);\n if (!(frac > 0) || frac >= 1) {\n return false;\n }\n\n const parent = findParentOf(root, path);\n if (parent === null) {\n return false;\n }\n const [node] = parent.children.splice(path[path.length - 1], 1);\n parent.sizes.splice(path[path.length - 1], 1);\n if (!node) {\n return false;\n }\n normalize(root);\n\n const atStart = edge === `left` || edge === `top`;\n const direction: DockAxis = horizontal ? `row` : `column`;\n\n if (isStack(root)) {\n // One leaf remains: wrap it so the moved leaf keeps its absolute share.\n const rest = root;\n const remaining: DockStackNode = { kind: `stack`, panels: [...rest.panels], active: rest.active };\n if (rest.name !== undefined)\n remaining.name = rest.name;\n if (rest.collapsed !== undefined)\n remaining.collapsed = rest.collapsed;\n if (rest.preCollapseSize !== undefined)\n remaining.preCollapseSize = rest.preCollapseSize;\n const wrapper: DockSplitNode = {\n kind: `split`,\n direction,\n children: atStart ? [node, remaining] : [remaining, node],\n sizes: atStart ? [frac, 1 - frac] : [1 - frac, frac],\n };\n replaceNodeContents(root, wrapper);\n return true;\n }\n\n if (isSplit(root) && root.direction === direction) {\n const sum = root.sizes.reduce((total, w) => total + w, 0) || root.children.length || 1;\n const size = frac * sum / (1 - frac);\n const at = atStart ? 0 : root.children.length;\n root.children.splice(at, 0, node);\n root.sizes.splice(at, 0, size);\n return true;\n }\n\n if (isSplit(root)) {\n // Other axis: nest the whole layout so its structure is untouched.\n const inner: DockSplitNode = { kind: `split`, direction: root.direction, children: root.children, sizes: root.sizes };\n const wrapper: DockSplitNode = {\n kind: `split`,\n direction,\n children: atStart ? [node, inner] : [inner, node],\n sizes: atStart ? [frac, 1 - frac] : [1 - frac, frac],\n };\n replaceNodeContents(root, wrapper);\n return true;\n }\n\n return false;\n}\n\n// ── Serialization ────────────────────────────────────────────────────────────\n\nexport function serializeLayout(root: DockNode): DockLayout {\n return {\n version: 1,\n root: serializeNode(root),\n };\n}\n\nfunction serializeNode(node: DockNode): DockNode {\n if (isStack(node)) {\n const out: DockStackNode = {\n kind: `stack`,\n panels: [...node.panels],\n active: node.active,\n };\n if (node.name !== undefined)\n out.name = node.name;\n if (node.hideLabels !== undefined)\n out.hideLabels = node.hideLabels;\n if (node.collapsed !== undefined)\n out.collapsed = node.collapsed;\n if (node.preCollapseSize !== undefined)\n out.preCollapseSize = node.preCollapseSize;\n return out;\n }\n return {\n kind: `split`,\n direction: node.direction,\n sizes: [...node.sizes],\n children: node.children.map(serializeNode),\n };\n}\n\n/**\n * Parse layout JSON, validate loosely, and normalize. Returns null when the\n * JSON is malformed or the root is missing/invalid.\n */\nexport function parseLayout(json: string): DockLayout | null {\n try {\n const parsed = JSON.parse(json) as DockLayout | null;\n if (parsed === null || typeof parsed !== `object`)\n return null;\n const root = (parsed as DockLayout).root;\n if (root === null || typeof root !== `object` || !(`kind` in root))\n return null;\n return { version: 1, root: normalize(root) };\n } catch {\n return null;\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 private _labelObserver: MutationObserver | null = null;\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 const labelSlot = this.shadowRoot?.querySelector(`slot:not([name])`);\n labelSlot?.addEventListener(`slotchange`, this._onLabelSlotChange);\n // In-place text edits (e.g. Lit re-rendering a title) don't fire\n // slotchange, so watch the light DOM too.\n this._labelObserver = new MutationObserver(() => this._syncLabelSizer());\n this._labelObserver.observe(this, { childList: true, characterData: true, subtree: true });\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 this._labelObserver?.disconnect();\n this._labelObserver = null;\n const toolbarSlot = this.shadowRoot?.querySelector(`slot[name=\"toolbar\"]`);\n toolbarSlot?.removeEventListener(`slotchange`, this._onToolbarSlotChange);\n const labelSlot = this.shadowRoot?.querySelector(`slot:not([name])`);\n labelSlot?.removeEventListener(`slotchange`, this._onLabelSlotChange);\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 _onLabelSlotChange = () => {\n this._syncLabelSizer();\n };\n\n /**\n * Mirror the default-slot text into `.label[data-label]` for the `::after`\n * width sizer. Slotted toolbar content is excluded.\n */\n private _syncLabelSizer(): void {\n const slot = this.shadowRoot?.querySelector(`slot:not([name])`) as HTMLSlotElement | null;\n const label = this.shadowRoot?.querySelector(`.label`);\n if (slot === null || slot === undefined || label === null || label === undefined) {\n return;\n }\n const text = slot.assignedNodes()\n .filter(node => !(node instanceof HTMLElement && node.hasAttribute(`slot`)))\n .map(node => node.textContent ?? ``)\n .join(``);\n if (text) {\n label.setAttribute(`data-label`, text);\n } else {\n label.removeAttribute(`data-label`);\n }\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 this._syncLabelSizer();\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-icon-color: var(--ixfx-selected-tab-icon-color, var(--accent));\n --selected-tab-border-width: var(--ixfx-selected-tab-border-width, 1px);\n --selected-tab-weight: var(--ixfx-selected-tab-weight, bold);\n --selected-tab-text-decoration: var(--ixfx-selected-tab-text-decoration, none);\n --selected-tab-text-decoration-color: var(--ixfx-selected-tab-text-decoration-color, var(--accent));\n --selected-tab-text-decoration-thickness: var(--ixfx-selected-tab-text-decoration-thickness, 0px);\n --selected-tab-text-decoration-offset: var(--ixfx-selected-tab-text-decoration-offset, 2px);\n --selected-background: var(--ixfx-tab-selected-background, var(--surface-5));\n --tab-padding: var(--ixfx-tab-padding, var(--space-s));\n display: inline-flex;\n min-width: 0;\n user-select: none;\n box-sizing: border-box;\n font-size: var(--text-m);\n color: inherit;\n /* No explicit height: items stretch (align-self: stretch via the\n list's flex container) so every tab in a strip shares one height\n even when toolbars give some items taller 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 transition: background var(--transition, 0.15s);\n }\n\n /* Hover (\"tickle\") background. When --ixfx-tab-hover-background is\n unset each state keeps its resting background, so existing\n consumers see no change. */\n :host(:hover:not([selected])) > div {\n background: var(--ixfx-tab-hover-background, transparent);\n }\n\n :host([selected]:hover) > div {\n background: var(--ixfx-tab-hover-background, var(--selected-background));\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 :host([selected]) .label {\n text-decoration: var(--selected-tab-text-decoration);\n text-decoration-color: var(--selected-tab-text-decoration-color);\n text-decoration-thickness: var(--selected-tab-text-decoration-thickness);\n text-decoration-offset: var(--selected-tab-text-decoration-offset);\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 /* Width sizer: an invisible copy of the label, always set at the\n selected weight, so activating a tab (bold) never shifts the strip.\n Text is mirrored from the default slot via the data-label attribute\n (see _syncLabelSizer). */\n .label::after {\n content: attr(data-label);\n display: block;\n height: 0;\n overflow: hidden;\n visibility: hidden;\n font-weight: var(--selected-tab-weight);\n }\n\n ixfx-icon {\n flex-shrink: 0;\n }\n\n /* Leading icon (direct child — not close/toolbar icons) picks up the\n accent when selected, so icon-only tabs read as active. */\n :host([selected]) > div > ixfx-icon {\n color: var(--selected-tab-icon-color);\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 /* Slotted buttons inherit these through the shadow boundary; keeps a\n toolbar button from inflating the strip height. */\n .toolbar ::slotted(ixfx-button) {\n --ixfx-button-padding-block: var(--space-xs);\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","/* eslint-disable ts/no-unsafe-declaration-merging */\nimport type { TitlebarCloseEvent, TitlebarToggleDetail, TitlebarToggleEvent } from '../titlebar/titlebar.js';\nimport type { DockPanelDragStartDetail, DockPanelDragStartEvent } from './types.js';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport '../titlebar/titlebar.js';\n\n/** Pointer movement threshold before a titlebar press becomes a dock drag. */\nconst DRAG_THRESHOLD_PX = 5;\n\nexport type { DockPanelDragStartEvent };\n\nexport interface DockPanelElementEventMap {\n 'dock-panel-drag-start': DockPanelDragStartEvent;\n 'toggle': TitlebarToggleEvent;\n 'close': TitlebarCloseEvent;\n}\n\n/**\n * Leaf content + metadata + drag handle. Renders `ixfx-titlebar` chrome when\n * standalone (`presentation=\"solo\"`) and content only when docked\n * (`presentation=\"tabbed\"` — the host's tab strip carries the title chrome).\n * Adds `panel-id` and the titlebar drag handle. Works standalone outside a\n * host (the drag-start event has no listener and is inert).\n */\n@customElement(`ixfx-dock-panel`)\nexport class DockPanelElement extends LitElement {\n /** Stable identity: model key, slot name suffix, serialization id. */\n @property({ type: String, attribute: `panel-id`, reflect: true })\n panelId = ``;\n\n /**\n * Display text (tab label, titlebar). Stored in the `label` attribute —\n * deliberately not `title`, so browsers never tooltip it.\n */\n @property({ type: String, attribute: `label` })\n title = ``;\n\n @property({ type: String, attribute: `icon-name` })\n iconName = ``;\n\n @property({ type: Boolean })\n closable = false;\n\n @property({ type: Boolean })\n collapsible = false;\n\n /**\n * Content kind for the host's leaf placement rules\n * (`setLeafExclusiveContents` / `setLeafDenyContents`). Matched literally;\n * defaults to `'any'`.\n */\n @property({ type: String, reflect: true })\n kind = `any`;\n\n /**\n * Per-panel restriction when this panel is itself a drop target (solo\n * leaf). Space-separated `tabs` / `horizontal` / `vertical` / `all`;\n * `none` rejects everything; default is unrestricted.\n */\n @property({ type: String, attribute: `accepts` })\n accepts = ``;\n\n /**\n * Host-controlled. Docked panels are always `tabbed` (content only — the\n * leaf's tab strip carries the title chrome). `solo` (full titlebar chrome)\n * applies to panels outside a host or not currently docked.\n */\n @property({ type: String, reflect: true })\n presentation: `solo` | `tabbed` = `solo`;\n\n /** Solo-mode collapse state, mirrored from the titlebar. */\n @state()\n private _collapsed = false;\n\n private _dragPointerId: number | null = null;\n private _dragStartX = 0;\n private _dragStartY = 0;\n private _dragStarted = false;\n\n override connectedCallback(): void {\n super.connectedCallback();\n // Legacy alias: adopt a `title` attribute into the property, then drop\n // it — a lingering native `title` attribute would tooltip on hover.\n // (`title` is unobserved, so removal has no side effects.)\n if (this.hasAttribute(`title`)) {\n if (!this.hasAttribute(`label`)) {\n this.title = this.getAttribute(`title`) ?? ``;\n }\n this.removeAttribute(`title`);\n }\n this.addEventListener(`pointerdown`, this._onPointerDown as EventListener);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this._teardownDragListeners();\n this.removeEventListener(`pointerdown`, this._onPointerDown as EventListener);\n }\n\n // ── Titlebar drag handle ─────────────────────────────────────────────────\n\n private _onPointerDown = (event: PointerEvent): void => {\n if (event.button !== 0)\n return;\n if (this.presentation === `tabbed`)\n return; // tab items are the drag handle in tabbed mode (host-driven)\n if (!this._isDragHandle(event))\n return;\n\n this._dragPointerId = event.pointerId;\n this._dragStartX = event.clientX;\n this._dragStartY = event.clientY;\n this._dragStarted = false;\n\n window.addEventListener(`pointermove`, this._onPointerMove);\n window.addEventListener(`pointerup`, this._onPointerUp);\n window.addEventListener(`pointercancel`, this._onPointerUp);\n };\n\n private _onPointerMove = (event: PointerEvent): void => {\n if (this._dragPointerId === null || event.pointerId !== this._dragPointerId)\n return;\n\n if (!this._dragStarted) {\n const distance = Math.hypot(event.clientX - this._dragStartX, event.clientY - this._dragStartY);\n if (distance < DRAG_THRESHOLD_PX)\n return;\n this._dragStarted = true;\n const pointerId = this._dragPointerId;\n this._teardownDragListeners();\n this._dispatchDragStart(pointerId, event.clientX, event.clientY);\n }\n };\n\n private _onPointerUp = (event: PointerEvent): void => {\n if (this._dragPointerId === null || event.pointerId !== this._dragPointerId)\n return;\n this._teardownDragListeners();\n };\n\n private _teardownDragListeners(): void {\n this._dragPointerId = null;\n this._dragStarted = false;\n window.removeEventListener(`pointermove`, this._onPointerMove);\n window.removeEventListener(`pointerup`, this._onPointerUp);\n window.removeEventListener(`pointercancel`, this._onPointerUp);\n }\n\n /** Clicks that begin on the close / caret buttons or the toolbar are not drags. */\n private _isDragHandle(event: PointerEvent): boolean {\n for (const node of event.composedPath()) {\n if (!(node instanceof HTMLElement))\n continue;\n if (node.classList.contains(`close-btn`) || node.classList.contains(`caret-btn`) || node.classList.contains(`toolbar`)) {\n return false;\n }\n }\n return true;\n }\n\n private _dispatchDragStart(pointerId: number, clientX: number, clientY: number): void {\n if (!this.panelId)\n return;\n this.dispatchEvent(new CustomEvent<DockPanelDragStartDetail>(`dock-panel-drag-start`, {\n detail: {\n panelId: this.panelId,\n pointerId,\n clientX,\n clientY,\n },\n bubbles: true,\n composed: true,\n }));\n }\n\n // ── Chrome event forwarding ──────────────────────────────────────────────\n\n private _onTitlebarToggle = (event: TitlebarToggleEvent): void => {\n event.stopPropagation();\n this._collapsed = event.detail.collapsed;\n this.dispatchEvent(new CustomEvent<TitlebarToggleDetail>(`toggle`, {\n detail: event.detail,\n bubbles: true,\n composed: true,\n }));\n };\n\n private _onTitlebarClose = (event: Event): void => {\n event.stopPropagation();\n this.dispatchEvent(new CustomEvent<void>(`close`, {\n bubbles: true,\n composed: true,\n }));\n // Mirror ixfx-panel's contract: a close removes the element. When docked,\n // the host's slotchange handler routes this through removePanel().\n this.remove();\n };\n\n protected override render() {\n const tabbed = this.presentation === `tabbed`;\n // Collapsed state only applies to solo chrome; docked leaves collapse at\n // the split-layout level, so ignore it there.\n const collapsed = !tabbed && this._collapsed;\n return html`\n ${tabbed\n ? nothing\n : html`\n <ixfx-titlebar\n .title=${this.title}\n .iconName=${this.iconName}\n .closable=${this.closable}\n .collapsible=${this.collapsible}\n .collapsed=${collapsed}\n .toggleInteraction=${this.collapsible ? `implicit` : `disabled`}\n @toggle=${this._onTitlebarToggle}\n @close=${this._onTitlebarClose}\n >\n <slot name=\"toolbar\" slot=\"toolbar\"></slot>\n </ixfx-titlebar>\n `}\n <div class=\"content\" ?collapsed=${collapsed}>\n <slot></slot>\n </div>\n `;\n }\n\n static override styles = [\n themeFallbacks,\n css`\n :host {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n min-width: 0;\n min-height: 0;\n }\n\n ixfx-titlebar {\n flex-shrink: 0;\n }\n\n .content {\n flex: 1;\n min-height: 0;\n min-width: 0;\n overflow: hidden;\n }\n\n .content[collapsed] {\n display: none;\n }\n `,\n ];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-dock-panel': DockPanelElement;\n }\n}\n\nexport interface DockPanelElement {\n addEventListener: (<K extends keyof DockPanelElementEventMap>(\n type: K,\n listener: (this: DockPanelElement, event: DockPanelElementEventMap[K]) => void,\n options?: boolean | AddEventListenerOptions,\n ) => void) & ((\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ) => void);\n}\n","/* eslint-disable ts/no-unsafe-declaration-merging */\nimport type { SplitLayoutElement } from '../split-layout/split-layout.js';\nimport type { TabListChangeEvent } from '../tabs/tab-list.js';\nimport type { DockDropZone, Rect } from './dock-drag.js';\nimport type { DockPanelElement } from './dock-panel.js';\nimport type {\n DockAddPanelTarget,\n DockChangeEvent,\n DockDirection,\n DockDragBoundaryEvent,\n DockDropTarget,\n DockEdge,\n DockLayout,\n DockLeafContentRules,\n DockLeafRef,\n DockNeighbours,\n DockNode,\n DockOperation,\n DockPanelActivatedEvent,\n DockPanelAddedEvent,\n DockPanelDragStartEvent,\n DockPanelInit,\n DockPanelRemovedEvent,\n DockPanelSnapshot,\n DockPanelTearOutEvent,\n DockStackNode,\n} from './types.js';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { repeat } from 'lit/directives/repeat.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { handleStyles } from '../styles/handle.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport { registerDockHost, startDrag, unregisterDockHost } from './dock-drag.js';\nimport {\n addPanelToStack,\n collectContainerNames,\n collectPanelIds,\n collectStackPaths,\n createStack,\n extractStack,\n findNode,\n findStackOf,\n findStackPathByName,\n getLeafNeighbours,\n insertBeside,\n isSplit,\n isStack,\n moveLeafNodeToEdge,\n moveLeafStep,\n normalize,\n parseLayout,\n removePanelFromStack,\n serializeLayout,\n setActive,\n wrapRoot,\n} from './dock-model.js';\nimport '../split-layout/split-layout.js';\nimport '../tabs/tab-list.js';\nimport '../tabs/tab-list-item.js';\nimport './dock-panel.js';\n\nexport type {\n DockAddPanelTarget,\n DockChangeEvent,\n DockDirection,\n DockDragBoundaryEvent,\n DockEdge,\n DockLeafContentRules,\n DockLeafRef,\n DockNeighbours,\n DockPanelActivatedEvent,\n DockPanelAddedEvent,\n DockPanelDragStartEvent,\n DockPanelRemovedEvent,\n DockPanelTearOutEvent,\n};\n\nexport interface DockHostElementEventMap {\n 'dock-change': DockChangeEvent;\n 'dock-panel-added': DockPanelAddedEvent;\n 'dock-panel-removed': DockPanelRemovedEvent;\n 'dock-panel-activated': DockPanelActivatedEvent;\n 'dock-panel-drag-start': DockPanelDragStartEvent;\n /** Panel released outside every host — request to move it to a new window. */\n 'dock-panel-tear-out': DockPanelTearOutEvent;\n /** Drag pointer left every host's bounds during a drag. */\n 'dock-panel-drag-out': DockDragBoundaryEvent;\n /** Drag pointer re-entered a host's bounds after being outside. */\n 'dock-panel-drag-in': DockDragBoundaryEvent;\n}\n\n/** Fraction of the leaf rect (from each edge) that forms the split bands. */\nconst BAND = 0.25;\n\n/** Pointer movement threshold before a press becomes a dock drag (matches tab-list). */\nconst DRAG_THRESHOLD_PX = 5;\n\n/** Tolerance (px) when matching a child gutter endpoint to a parent gutter line. */\nconst JUNCTION_TOL_PX = 6;\n\n/** Junction points closer than this merge into one handle (a 4-way cross yields one per side). */\nconst JUNCTION_MERGE_PX = 8;\n\ninterface DockJunctionTarget {\n split: SplitLayoutElement;\n gutterIndex: number;\n}\n\n/** A point where a parent split's gutter line crosses a nested split's gutter. */\ninterface DockJunction {\n /** Host-relative coordinates. */\n x: number;\n y: number;\n targets: DockJunctionTarget[];\n}\n\n@customElement(`ixfx-dock-host`)\nexport class DockHostElement extends LitElement {\n /** Initial layout as `DockLayout` JSON. Absent ⇒ all pooled panels go into one root stack. */\n @property({ type: String, attribute: `layout` })\n layout: string | null = null;\n\n /**\n * Space-separated drop operations this host allows: `tabs`, `horizontal`,\n * `vertical`, and convenience `all`. `\"\"` / `none` ⇒ nothing may be dropped.\n */\n @property({ type: String, attribute: `accepts` })\n accepts = `tabs horizontal vertical`;\n\n /**\n * When true, panels can be freely reorganised within this host, but\n * cannot be dragged out to another host.\n */\n @property({ type: Boolean, attribute: `isolated` })\n isolated = false;\n\n /** Finest-grained veto, consulted per candidate zone. */\n @property({ attribute: false })\n canAccept: ((panelId: string, op: DockOperation) => boolean) | undefined;\n\n @state()\n private _model: DockNode = createStack([]);\n\n @state()\n private _pool: DockPanelElement[] = [];\n\n @state()\n private _dropZone: DockDropZone | null = null;\n\n @state()\n private _dragActive = false;\n\n @state()\n private _junctions: DockJunction[] = [];\n\n /** panelId → toolbar nodes currently moved out into a tab item. */\n private _toolbarsOut: Map<string, HTMLElement[]> = new Map();\n\n /**\n * Placement policy per named leaf: `{ allow, deny }` kind sets.\n * Host-level only — never serialized into the layout, but kept across\n * `loadLayout()` calls. Existing panels are grandfathered; rules govern\n * future placements (drags, `addPanel`, re-homing).\n */\n private _leafContentRules: Map<string, { allow: Set<string> | null; deny: Set<string> }> = new Map();\n\n private _tabDragPending: { panelId: string; pointerId: number; startX: number; startY: number } | null = null;\n\n private _junctionsKey = ``;\n private _junctionsRaf: number | null = null;\n private _hostResizeObserver: ResizeObserver | null = null;\n\n /** `toolbar-<name>` slot names currently provided as light-DOM children. */\n private _toolbarSlots: Set<string> = new Set();\n private _toolbarObserver: MutationObserver | null = null;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this._buildInitialModel();\n registerDockHost(this);\n this.addEventListener(`dock-panel-drag-start`, this._onDragStart as EventListener);\n this._hostResizeObserver = new ResizeObserver(() => this._scheduleJunctions());\n this._hostResizeObserver.observe(this);\n this._scanToolbarSlots();\n this._toolbarObserver = new MutationObserver(() => this._scanToolbarSlots());\n this._toolbarObserver.observe(this, { childList: true, subtree: true, attributes: true, attributeFilter: [`slot`] });\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n unregisterDockHost(this);\n this.removeEventListener(`dock-panel-drag-start`, this._onDragStart as EventListener);\n this._toolbarObserver?.disconnect();\n this._toolbarObserver = null;\n this._hostResizeObserver?.disconnect();\n this._hostResizeObserver = null;\n if (this._junctionsRaf !== null) {\n cancelAnimationFrame(this._junctionsRaf);\n this._junctionsRaf = null;\n }\n this._junctions = [];\n this._junctionsKey = ``;\n this._returnAllToolbars();\n }\n\n private _onDragStart = (event: DockPanelDragStartEvent): void => {\n const { panelId, pointerId, clientX, clientY } = event.detail;\n startDrag(panelId, this, pointerId, clientX, clientY, this._findPanelEl(panelId)?.kind);\n };\n\n override willUpdate(changed: Map<string, unknown>): void {\n super.willUpdate(changed);\n if (changed.has(`layout`) && this.layout !== null) {\n const parsed = parseLayout(this.layout);\n if (parsed) {\n this._model = parsed.root;\n this._mergePoolIntoModel();\n }\n }\n }\n\n override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n this._syncSlots();\n this._syncToolbars();\n this._scheduleJunctions();\n }\n\n // ── Model setup ──────────────────────────────────────────────────────────\n\n private _buildInitialModel(): void {\n if (this.layout !== null) {\n const parsed = parseLayout(this.layout);\n if (parsed) {\n this._model = parsed.root;\n this._mergePoolIntoModel();\n return;\n }\n }\n this._model = createStack([]);\n this._mergePoolIntoModel();\n }\n\n /** Ensure every pooled panel element appears in the model (appended to the first stack). */\n private _mergePoolIntoModel(): void {\n const known = new Set(collectPanelIds(this._model));\n let changed = false;\n for (const el of this._scanPanels()) {\n if (!known.has(el.panelId)) {\n this._appendPanelToFirstStack(el.panelId);\n known.add(el.panelId);\n changed = true;\n }\n }\n if (changed) {\n normalize(this._model);\n }\n }\n\n private _scanPanels(): DockPanelElement[] {\n return Array.from(this.children).filter((el): el is DockPanelElement =>\n el instanceof HTMLElement && el.tagName === `IXFX-DOCK-PANEL` && Boolean((el as DockPanelElement).panelId),\n );\n }\n\n /** Refresh the set of provided `toolbar-<name>` slots; re-render on change. */\n private _scanToolbarSlots(): void {\n const found = new Set<string>();\n for (const child of this.children) {\n if (!(child instanceof HTMLElement))\n continue;\n const slot = child.getAttribute(`slot`) ?? ``;\n if (slot.startsWith(`toolbar-`) && slot.length > `toolbar-`.length) {\n found.add(slot);\n }\n }\n if (found.size !== this._toolbarSlots.size || [...found].some(s => !this._toolbarSlots.has(s))) {\n this._toolbarSlots = found;\n this.requestUpdate();\n }\n }\n\n private _findPanelEl(panelId: string): DockPanelElement | undefined {\n return this._pool.find(p => p.panelId === panelId)\n ?? this._scanPanels().find(p => p.panelId === panelId);\n }\n\n private _firstStack(): DockStackNode {\n const paths = collectStackPaths(this._model);\n const node = paths.length > 0 ? findNode(this._model, paths[0]) : null;\n if (node !== null && isStack(node))\n return node;\n const fresh = createStack([]);\n wrapRoot(this._model, `row`, fresh, `after`);\n normalize(this._model);\n return fresh;\n }\n\n private _appendPanelToFirstStack(panelId: string): void {\n const kind = this._panelKind(panelId);\n if (this._model.kind === `stack` && this._stackAllowsKind(this._model, kind)) {\n addPanelToStack(this._model, panelId);\n return;\n }\n addPanelToStack(this._firstStackAllowing(kind), panelId);\n }\n\n /** Normalized content kind of a panel (`'any'` when unknown/unset). */\n private _panelKind(panelId: string): string {\n return normalizeKind(this._findPanelEl(panelId)?.kind);\n }\n\n /** Whether `kind` may live in `stack` under the current leaf rules. */\n private _stackAllowsKind(stack: DockStackNode, kind: string): boolean {\n if (stack.name === undefined) {\n return true;\n }\n const rules = this._leafContentRules.get(stack.name);\n if (rules === undefined) {\n return true;\n }\n if (rules.deny.has(kind)) {\n return false;\n }\n return rules.allow === null || rules.allow.has(kind);\n }\n\n /** First stack (tree order) whose rules admit `kind`, else the first stack. */\n private _firstStackAllowing(kind: string): DockStackNode {\n for (const path of collectStackPaths(this._model)) {\n const node = findNode(this._model, path);\n if (node !== null && isStack(node) && this._stackAllowsKind(node, kind)) {\n return node;\n }\n }\n console.warn(`[ixfx-dock-host] no leaf admits kind \"${kind}\", using first stack`);\n return this._firstStack();\n }\n\n private _onPoolSlotChange = (): void => {\n this._syncPool();\n };\n\n private _syncPool(): void {\n // Scan the light DOM for all panel elements — panels placed in the model\n // carry named slots and are therefore NOT assigned to the pool slot.\n const current = this._scanPanels();\n const currentIds = new Set(current.map(p => p.panelId));\n let structuralChange = false;\n\n // Removed from DOM → drop from model\n for (const el of [...this._pool]) {\n if (!currentIds.has(el.panelId)) {\n this._toolbarsOut.delete(el.panelId);\n this._removeFromModel(el.panelId);\n this.dispatchEvent(new CustomEvent<{ panelId: string }>(`dock-panel-removed`, {\n detail: { panelId: el.panelId },\n bubbles: true,\n composed: true,\n }));\n structuralChange = true;\n }\n }\n\n // New in DOM → add to model\n for (const el of current) {\n if (!collectPanelIds(this._model).includes(el.panelId)) {\n this._appendPanelToFirstStack(el.panelId);\n normalize(this._model);\n this.dispatchEvent(new CustomEvent<{ panelId: string }>(`dock-panel-added`, {\n detail: { panelId: el.panelId },\n bubbles: true,\n composed: true,\n }));\n structuralChange = true;\n }\n }\n\n this._pool = current;\n this.requestUpdate();\n if (structuralChange) {\n this._emitChange();\n }\n }\n\n // ── Public API ───────────────────────────────────────────────────────────\n\n /** Serialize the current layout, folding live split weights from the DOM. */\n saveLayout(): DockLayout {\n this._foldLiveWeights();\n return serializeLayout(this._model);\n }\n\n loadLayout(layout: DockLayout): void {\n this._returnAllToolbars();\n this._model = normalize(cloneNode(layout.root));\n this._mergePoolIntoModel();\n this.requestUpdate();\n this._emitChange();\n }\n\n /**\n * Dock a panel. Returns false (without touching the DOM) when the\n * explicitly targeted container denies the panel's `kind`.\n */\n addPanel(panel: DockPanelElement | DockPanelInit, target?: DockAddPanelTarget): boolean {\n const kind = panel instanceof HTMLElement ? normalizeKind(panel.kind) : normalizeKind(panel.kind);\n const op = target?.op ?? `tabs`;\n\n // Resolve an explicit target first so kind denials can refuse cleanly.\n let stackPath: number[] | null = null;\n let splitTarget: number[] | null = null;\n if (target?.container !== undefined) {\n const namedPath = findStackPathByName(this._model, target.container);\n if (namedPath === null) {\n console.warn(`[ixfx-dock-host] addPanel: unknown container \"${target.container}\", appending to first admitting stack`);\n } else if (op === `tabs` && !this._stackAllowsKindAt(namedPath, kind)) {\n console.warn(`[ixfx-dock-host] addPanel: container \"${target.container}\" does not admit kind \"${kind}\"`);\n return false;\n } else {\n stackPath = namedPath;\n }\n } else if (target?.stack) {\n const found = findStackOf(this._model, target.stack);\n if (found === null) {\n console.warn(`[ixfx-dock-host] addPanel: unknown stack panel \"${target.stack}\", appending to first admitting stack`);\n } else if (op === `tabs` && !this._stackAllowsKindAt(found, kind)) {\n console.warn(`[ixfx-dock-host] addPanel: target stack does not admit kind \"${kind}\"`);\n return false;\n } else {\n stackPath = found;\n }\n }\n if (stackPath !== null && op !== `tabs`) {\n splitTarget = stackPath;\n stackPath = null;\n }\n\n let el: DockPanelElement;\n if (panel instanceof HTMLElement) {\n el = panel as DockPanelElement;\n } else {\n el = document.createElement(`ixfx-dock-panel`) as DockPanelElement;\n el.panelId = panel.panelId;\n if (panel.title !== undefined)\n el.title = panel.title;\n if (panel.iconName !== undefined)\n el.iconName = panel.iconName;\n if (panel.closable !== undefined)\n el.closable = panel.closable;\n if (panel.collapsible !== undefined)\n el.collapsible = panel.collapsible;\n if (panel.kind !== undefined)\n el.kind = panel.kind;\n }\n\n if (el.parentElement !== this) {\n this.appendChild(el);\n }\n if (!this._pool.some(p => p.panelId === el.panelId)) {\n this._pool = [...this._pool, el];\n }\n\n this._returnAllToolbars();\n\n // Moves are idempotent: drop an existing entry before re-inserting.\n if (collectPanelIds(this._model).includes(el.panelId)) {\n this._removeFromModel(el.panelId);\n }\n\n if (splitTarget !== null) {\n insertBeside(this._model, splitTarget, opToDirection(op), createStack([el.panelId]), `after`);\n } else if (stackPath !== null) {\n const stack = findNode(this._model, stackPath);\n if (stack !== null && isStack(stack)) {\n addPanelToStack(stack, el.panelId, target?.index);\n }\n } else {\n this._appendPanelToFirstStack(el.panelId);\n }\n\n normalize(this._model);\n this.requestUpdate();\n\n this.dispatchEvent(new CustomEvent<{ panelId: string }>(`dock-panel-added`, {\n detail: { panelId: el.panelId },\n bubbles: true,\n composed: true,\n }));\n this._emitChange();\n return true;\n }\n\n /** Whether the stack at `stackPath` admits `kind` under the leaf rules. */\n private _stackAllowsKindAt(stackPath: number[], kind: string): boolean {\n const stack = findNode(this._model, stackPath);\n return stack !== null && isStack(stack) && this._stackAllowsKind(stack, kind);\n }\n\n removePanel(panelId: string): boolean {\n if (!collectPanelIds(this._model).includes(panelId))\n return false;\n\n this._returnAllToolbars();\n this._removeFromModel(panelId);\n this._pool = this._pool.filter(p => p.panelId !== panelId);\n this._toolbarsOut.delete(panelId);\n\n const el = this._scanPanels().find(p => p.panelId === panelId);\n el?.remove();\n\n normalize(this._model);\n this.requestUpdate();\n\n this.dispatchEvent(new CustomEvent<{ panelId: string }>(`dock-panel-removed`, {\n detail: { panelId },\n bubbles: true,\n composed: true,\n }));\n this._emitChange();\n return true;\n }\n\n activatePanel(panelId: string): boolean {\n const stackPath = findStackOf(this._model, panelId);\n if (stackPath === null)\n return false;\n const stack = findNode(this._model, stackPath);\n if (stack === null || !isStack(stack))\n return false;\n if (!setActive(stack, panelId))\n return false;\n\n this.requestUpdate();\n this.dispatchEvent(new CustomEvent<{ panelId: string }>(`dock-panel-activated`, {\n detail: { panelId },\n bubbles: true,\n composed: true,\n }));\n return true;\n }\n\n getPanelIds(): string[] {\n return collectPanelIds(this._model);\n }\n\n /** Names of every named stack leaf, in tree order. */\n getContainerNames(): string[] {\n return collectContainerNames(this._model);\n }\n\n /**\n * Snapshot of a named container (`{ name, panels, active }`), or null when\n * no stack carries that name. First match wins when duplicated.\n */\n getContainer(name: string): { name: string; panels: string[]; active: string } | null {\n const path = findStackPathByName(this._model, name);\n if (path === null)\n return null;\n const node = findNode(this._model, path);\n if (node === null || !isStack(node) || node.name === undefined)\n return null;\n return { name: node.name, panels: [...node.panels], active: node.active };\n }\n\n /** Panel-ids in a named container, in tab order (`[]` when unknown/empty). */\n getContainerPanels(name: string): string[] {\n return this.getContainer(name)?.panels ?? [];\n }\n\n /** Panel elements in a named container, in tab order — for iterating children. */\n getContainerElements(name: string): DockPanelElement[] {\n return this.getContainerPanels(name)\n .map(id => this._findPanelEl(id))\n .filter((el): el is DockPanelElement => el !== undefined);\n }\n\n // ── Leaf content rules (kind-based placement) ────────────────────────────\n\n /**\n * Restrict a named container to only the given panel kinds — e.g.\n * `setLeafExclusiveContents('editor', ['document'])`. `tabs` drops,\n * `addPanel`, and re-homing into the leaf then refuse other kinds, while\n * edge splits beside the leaf stay allowed (they create a new leaf).\n * Pass `[]` to seal the leaf (nothing admitted). Warns when no stack\n * currently carries `name`, but the rule is still stored and applies once\n * one appears. Rules are host policy: kept across `loadLayout()`, never\n * serialized.\n */\n setLeafExclusiveContents(name: string, kinds: readonly string[]): void {\n const key = name.trim();\n if (!key) {\n console.warn(`[ixfx-dock-host] setLeafExclusiveContents: empty container name`);\n return;\n }\n const allow = new Set(kinds.map(k => k.trim()).filter(k => k.length > 0));\n const entry = this._leafContentRules.get(key) ?? { allow: null, deny: new Set<string>() };\n entry.allow = allow;\n this._leafContentRules.set(key, entry);\n if (findStackPathByName(this._model, key) === null) {\n console.warn(`[ixfx-dock-host] setLeafExclusiveContents: no container named \"${key}\" yet; rule stored`);\n }\n }\n\n /**\n * Forbid the given panel kinds in a named container — e.g.\n * `setLeafDenyContents('footer', ['files', 'document'])`. Everything else\n * stays admitted. Pass `[]` to lift the denial. See\n * {@link setLeafExclusiveContents} for scope/ordering notes.\n */\n setLeafDenyContents(name: string, kinds: readonly string[]): void {\n const key = name.trim();\n if (!key) {\n console.warn(`[ixfx-dock-host] setLeafDenyContents: empty container name`);\n return;\n }\n const deny = new Set(kinds.map(k => k.trim()).filter(k => k.length > 0));\n const entry = this._leafContentRules.get(key) ?? { allow: null, deny: new Set<string>() };\n entry.deny = deny;\n if (entry.allow === null && entry.deny.size === 0) {\n this._leafContentRules.delete(key);\n } else {\n this._leafContentRules.set(key, entry);\n }\n if (findStackPathByName(this._model, key) === null) {\n console.warn(`[ixfx-dock-host] setLeafDenyContents: no container named \"${key}\" yet; rule stored`);\n }\n }\n\n /** Remove every content rule for a named container. */\n clearLeafContentRestrictions(name: string): void {\n this._leafContentRules.delete(name.trim());\n }\n\n /** Copy of a container's rules, or null when unrestricted. */\n getLeafContentRestrictions(name: string): DockLeafContentRules | null {\n const rules = this._leafContentRules.get(name.trim());\n if (rules === undefined) {\n return null;\n }\n return { allow: rules.allow === null ? null : [...rules.allow], deny: [...rules.deny] };\n }\n\n // ── Spatial (leaf geometry + moves) ──────────────────────────────────────\n\n /**\n * Geometric neighbours of a leaf (`name` or numeric `path`) — what sits\n * above / below / left / right of it on screen. Each entry is\n * `{ name, path }` (`name` is null for unnamed leaves), ordered\n * most-overlapping first. Returns null when the leaf is unknown.\n */\n getNeighbours(leaf: DockLeafRef): DockNeighbours | null {\n return getLeafNeighbours(this._model, leaf);\n }\n\n /**\n * Move a leaf one position in `direction`, swapping with the neighbour it\n * shares the longest edge with (both keep the remaining structure intact).\n * Returns false when the leaf is unknown or nothing adjoins that way.\n */\n moveLeaf(leaf: DockLeafRef, direction: DockDirection): boolean {\n if (!moveLeafStep(this._model, leaf, direction)) {\n return false;\n }\n this._commit();\n return true;\n }\n\n /**\n * Move a leaf to an edge of the overall layout (e.g. toggle a sidebar from\n * `left` to `right`). The rest of the layout stays intact as a single\n * subtree and the leaf keeps its absolute size along the target axis.\n * Returns false when the leaf is unknown or the layout holds one leaf.\n */\n moveLeafToEdge(leaf: DockLeafRef, edge: DockEdge): boolean {\n if (!moveLeafNodeToEdge(this._model, leaf, edge)) {\n return false;\n }\n this._commit();\n return true;\n }\n\n // ── Cross-window (tear-out / tear-in) ───────────────────────────────────\n //\n // The shared drag coordinator is per-document, so it never spans separate\n // windows / `BrowserWindow`s / `WebContentsView`s. These methods give an\n // outer coordinator (e.g. an Electron main process talking over IPC) the\n // hooks to move a panel between windows: capture a serializable snapshot on\n // one side, hit-test and recreate it on the other. See the README.\n\n /**\n * Capture a structured-clone-safe {@link DockPanelSnapshot} of a panel\n * (identity, chrome attributes, and a best-effort `innerHTML`). Returns\n * null when no such panel element is known to this host.\n */\n getPanelSnapshot(panelId: string): DockPanelSnapshot | null {\n const el = this._findPanelEl(panelId);\n if (el === undefined)\n return null;\n return {\n panelId: el.panelId,\n title: el.title,\n iconName: el.iconName,\n closable: el.closable,\n collapsible: el.collapsible,\n kind: normalizeKind(el.kind),\n accepts: el.accepts,\n contentHTML: el.innerHTML,\n };\n }\n\n /**\n * {@link getPanelSnapshot} + {@link removePanel} in one step: take the\n * snapshot, then drop the panel (and its element) from this host. Call this\n * from a `dock-panel-tear-out` handler once the receiving window has\n * recreated the panel.\n */\n detachPanel(panelId: string): DockPanelSnapshot | null {\n const snapshot = this.getPanelSnapshot(panelId);\n if (snapshot === null)\n return null;\n this.removePanel(panelId);\n return snapshot;\n }\n\n /**\n * Hit-test viewport coordinates against this host and return a plain,\n * serializable {@link DockDropTarget} (no element references) — or null when\n * the point is outside the host or the resulting zone is disallowed by\n * `accepts` / `canAccept`. Pure query: no model mutation, no overlay.\n *\n * `panelId` is passed to `canAccept`; use any stable id for an external\n * panel (defaults to `\"__external__\"`). `kind` covers leaf content rules\n * for panels unknown to this host (defaults to `'any'`).\n */\n queryDropTarget(clientX: number, clientY: number, panelId = `__external__`, kind?: string): DockDropTarget | null {\n const zone = this.computeDropZone(clientX, clientY, panelId, kind);\n return zone === null ? null : zoneToTarget(zone);\n }\n\n /**\n * Like {@link queryDropTarget}, but also shows the drop overlay so an\n * external (cross-window) drag gets the same visual feedback as an in-page\n * one. Call on every pointer update from the outer coordinator, then\n * {@link endExternalDrop} when the drag leaves or ends.\n */\n previewExternalDrop(clientX: number, clientY: number, panelId = `__external__`, kind?: string): DockDropTarget | null {\n this.setDragActive(true);\n const zone = this.computeDropZone(clientX, clientY, panelId, kind);\n this.setDropZone(zone);\n return zone === null ? null : zoneToTarget(zone);\n }\n\n /** Clear any overlay left by {@link previewExternalDrop}. */\n endExternalDrop(): void {\n this.setDropZone(null);\n this.setDragActive(false);\n }\n\n /**\n * Recreate a panel from a {@link DockPanelSnapshot} (or a bare\n * {@link DockPanelInit}) and dock it. With `at` viewport coordinates the\n * panel lands where a drop there would put it (respecting `accepts` /\n * `canAccept` and leaf content rules); without them, or when the point\n * misses the host, it goes into the first stack admitting its kind.\n * Returns the created element, or null when a panel\n * with that id is already docked here.\n */\n acceptExternalPanel(\n snapshot: DockPanelSnapshot | DockPanelInit,\n at?: { clientX: number; clientY: number },\n ): DockPanelElement | null {\n if (collectPanelIds(this._model).includes(snapshot.panelId))\n return null;\n\n const el = document.createElement(`ixfx-dock-panel`) as DockPanelElement;\n el.panelId = snapshot.panelId;\n if (snapshot.title !== undefined)\n el.title = snapshot.title;\n if (snapshot.iconName !== undefined)\n el.iconName = snapshot.iconName;\n if (snapshot.closable !== undefined)\n el.closable = snapshot.closable;\n if (snapshot.collapsible !== undefined)\n el.collapsible = snapshot.collapsible;\n if (`kind` in snapshot && snapshot.kind !== undefined)\n el.kind = snapshot.kind;\n if (`accepts` in snapshot && snapshot.accepts)\n el.setAttribute(`accepts`, snapshot.accepts);\n if (`contentHTML` in snapshot && snapshot.contentHTML)\n el.innerHTML = snapshot.contentHTML;\n\n this._returnAllToolbars();\n this.appendChild(el);\n this._pool = [...this._pool, el];\n this._appendPanelToFirstStack(el.panelId);\n normalize(this._model);\n\n this.endExternalDrop();\n const zone = at ? this.computeDropZone(at.clientX, at.clientY, el.panelId) : null;\n if (zone !== null) {\n this._applyZone(el.panelId, zone);\n }\n\n normalize(this._model);\n this.requestUpdate();\n this.dispatchEvent(new CustomEvent<{ panelId: string }>(`dock-panel-added`, {\n detail: { panelId: el.panelId },\n bubbles: true,\n composed: true,\n }));\n this._emitChange();\n return el;\n }\n\n // ── Drop targeting (called by the drag coordinator) ──────────────────────\n\n /**\n * Hit-test a pointer position against this host's leaves and edges. Returns\n * a zone with rects relative to the host, or null when the pointer is\n * outside the host or the candidate zone is disallowed.\n */\n computeDropZone(clientX: number, clientY: number, panelId: string, kind?: string): DockDropZone | null {\n const hostRect = this.getBoundingClientRect();\n if (clientX < hostRect.left || clientX > hostRect.right\n || clientY < hostRect.top || clientY > hostRect.bottom) {\n return null;\n }\n // Explicit kind wins (cross-host / external drags); otherwise read the\n // panel element, defaulting to `'any'` for unknown panels.\n const resolvedKind = kind?.trim() ? kind.trim() : this._panelKind(panelId);\n const rel = (r: DOMRect): Rect => ({\n x: r.left - hostRect.left,\n y: r.top - hostRect.top,\n w: r.width,\n h: r.height,\n });\n\n // Leaf under the pointer?\n for (const path of collectStackPaths(this._model)) {\n const leaf = this.shadowRoot?.querySelector(`[data-dock-path=\"${path.join(`-`)}\"]`) as HTMLElement | null;\n if (!leaf)\n continue;\n const leafRect = leaf.getBoundingClientRect();\n if (clientX < leafRect.left || clientX > leafRect.right\n || clientY < leafRect.top || clientY > leafRect.bottom) {\n continue;\n }\n\n const stack = findNode(this._model, path);\n if (stack === null || !isStack(stack))\n continue;\n\n // Tab strip has priority over the leaf body\n const strip = leaf.querySelector(`ixfx-tab-list`);\n if (strip !== null) {\n const stripRect = strip.getBoundingClientRect();\n if (clientX >= stripRect.left && clientX <= stripRect.right\n && clientY >= stripRect.top && clientY <= stripRect.bottom) {\n const gapIndex = computeStripGapIndex(strip, clientX, clientY);\n const zone: DockDropZone = {\n host: this,\n operation: `tabs`,\n targetPath: path,\n side: `after`,\n gapIndex,\n rect: rel(leafRect),\n caretRect: this._stripCaretRect(strip, gapIndex, hostRect),\n };\n return this._zoneAllowed(panelId, zone, resolvedKind) ? zone : null;\n }\n }\n\n const relX = (clientX - leafRect.left) / Math.max(leafRect.width, 1);\n const relY = (clientY - leafRect.top) / Math.max(leafRect.height, 1);\n\n if (relX >= BAND && relX <= 1 - BAND && relY >= BAND && relY <= 1 - BAND) {\n const zone: DockDropZone = {\n host: this,\n operation: `tabs`,\n targetPath: path,\n side: `after`,\n gapIndex: stack.panels.length,\n rect: rel(leafRect),\n };\n return this._zoneAllowed(panelId, zone, resolvedKind) ? zone : null;\n }\n\n const r: Rect = rel(leafRect);\n let operation: DockOperation;\n let side: `before` | `after`;\n let zoneRect: Rect;\n if (relX < BAND) {\n operation = `split-vertical`;\n side = `before`;\n zoneRect = { ...r, w: r.w / 2 };\n } else if (relX > 1 - BAND) {\n operation = `split-vertical`;\n side = `after`;\n zoneRect = { x: r.x + r.w / 2, y: r.y, w: r.w / 2, h: r.h };\n } else if (relY < BAND) {\n operation = `split-horizontal`;\n side = `before`;\n zoneRect = { ...r, h: r.h / 2 };\n } else {\n operation = `split-horizontal`;\n side = `after`;\n zoneRect = { x: r.x, y: r.y + r.h / 2, w: r.w, h: r.h / 2 };\n }\n const zone: DockDropZone = { host: this, operation, targetPath: path, side, rect: zoneRect };\n return this._zoneAllowed(panelId, zone, resolvedKind) ? zone : null;\n }\n\n // Outside every leaf: split the root against the nearest host edge\n const fromLeft = clientX - hostRect.left;\n const fromRight = hostRect.right - clientX;\n const fromTop = clientY - hostRect.top;\n const fromBottom = hostRect.bottom - clientY;\n const min = Math.min(fromLeft, fromRight, fromTop, fromBottom);\n const full: Rect = { x: 0, y: 0, w: hostRect.width, h: hostRect.height };\n\n let operation: DockOperation;\n let side: `before` | `after`;\n let zoneRect: Rect;\n if (min === fromLeft) {\n operation = `split-vertical`;\n side = `before`;\n zoneRect = { ...full, w: full.w / 2 };\n } else if (min === fromRight) {\n operation = `split-vertical`;\n side = `after`;\n zoneRect = { x: full.x + full.w / 2, y: full.y, w: full.w / 2, h: full.h };\n } else if (min === fromTop) {\n operation = `split-horizontal`;\n side = `before`;\n zoneRect = { ...full, h: full.h / 2 };\n } else {\n operation = `split-horizontal`;\n side = `after`;\n zoneRect = { x: full.x, y: full.y + full.h / 2, w: full.w, h: full.h / 2 };\n }\n const zone: DockDropZone = { host: this, operation, targetPath: [], side, rect: zoneRect };\n return this._zoneAllowed(panelId, zone, resolvedKind) ? zone : null;\n }\n\n private _zoneAllowed(panelId: string, zone: DockDropZone, kind?: string): boolean {\n if (!tokenAllows(this.accepts, operationToToken(zone.operation)))\n return false;\n\n // Per-panel restriction applies only when the drop target is a solo leaf\n const stack = findNode(this._model, zone.targetPath);\n if (stack !== null && isStack(stack) && stack.panels.length === 1) {\n const target = this._findPanelEl(stack.panels[0]);\n if (target && !panelAllows(target.accepts, operationToToken(zone.operation))) {\n return false;\n }\n }\n\n // Leaf content rules govern tabbing *into* a leaf. Edge splits create a\n // new sibling leaf, so they stay allowed.\n if (zone.operation === `tabs` && stack !== null && isStack(stack)) {\n if (!this._stackAllowsKind(stack, kind?.trim() ? kind.trim() : this._panelKind(panelId))) {\n return false;\n }\n }\n\n if (this.canAccept && !this.canAccept(panelId, zone.operation)) {\n return false;\n }\n return true;\n }\n\n /**\n * Apply a drop. `sourceHost` differs from `this` when the drag crossed\n * hosts; the panel element is adopted into this host first.\n */\n handleDrop(panelId: string, zone: DockDropZone, sourceHost?: DockHostElement): void {\n if (sourceHost !== undefined && sourceHost !== this) {\n sourceHost.releasePanel(panelId, this);\n }\n\n if (!collectPanelIds(this._model).includes(panelId)) {\n const el = this._findPanelEl(panelId);\n if (!el)\n return;\n this._appendPanelToFirstStack(panelId);\n normalize(this._model);\n }\n\n // In-page moves may carry a vacated leaf's name to the merge target (so\n // merging tabs back together doesn't strand an empty named placeholder).\n // Cross-host drops skip this: their source here is just the temporary\n // adoption stack, not the leaf the panel came from.\n this._applyZone(panelId, zone, sourceHost === undefined || sourceHost === this);\n this._commit();\n }\n\n /**\n * Move `panelId` (already present somewhere in the model) to the position\n * described by `zone`. Shared by in-page drops and external panel adoption.\n */\n private _applyZone(panelId: string, zone: DockDropZone, transferName = false): void {\n const sourcePath = findStackOf(this._model, panelId);\n let vacated: DockStackNode | null = null;\n if (sourcePath !== null) {\n const source = findNode(this._model, sourcePath);\n if (source !== null && isStack(source)) {\n removePanelFromStack(source, panelId);\n if (source.panels.length === 0) {\n vacated = source;\n }\n }\n }\n\n if (zone.operation === `tabs`) {\n const target = findNode(this._model, zone.targetPath);\n if (target !== null && isStack(target)) {\n addPanelToStack(target, panelId, zone.gapIndex);\n // A tabs drop that empties a named stack into an unnamed one hands\n // the name over, so the merged leaf keeps the container identity\n // (and its content rules) instead of leaving a placeholder behind.\n if (transferName && vacated !== null && vacated !== target\n && vacated.name !== undefined && target.name === undefined) {\n target.name = vacated.name;\n delete vacated.name;\n }\n }\n } else {\n insertBeside(this._model, zone.targetPath, opToDirection(zone.operation), createStack([panelId]), zone.side);\n }\n }\n\n /**\n * Move a panel element out of this host into `target`, dropping it from\n * this host's model. Used for cross-host drags.\n */\n releasePanel(panelId: string, target: DockHostElement): void {\n this._returnAllToolbars();\n const el = this._pool.find(p => p.panelId === panelId);\n const stackPath = findStackOf(this._model, panelId);\n if (stackPath !== null) {\n const stack = findNode(this._model, stackPath);\n if (stack !== null && isStack(stack)) {\n removePanelFromStack(stack, panelId);\n }\n }\n normalize(this._model);\n this._pool = this._pool.filter(p => p !== el);\n if (el !== undefined) {\n target.adoptPanelElement(el);\n }\n this.requestUpdate();\n }\n\n /** Adopt a panel element from another host (the one sanctioned reparent). */\n adoptPanelElement(el: DockPanelElement): void {\n this.appendChild(el);\n if (!this._pool.some(p => p.panelId === el.panelId)) {\n this._pool = [...this._pool, el];\n }\n this._appendPanelToFirstStack(el.panelId);\n normalize(this._model);\n this.dispatchEvent(new CustomEvent<{ panelId: string }>(`dock-panel-added`, {\n detail: { panelId: el.panelId },\n bubbles: true,\n composed: true,\n }));\n }\n\n // ── Drag overlay (driven by the coordinator) ─────────────────────────────\n\n setDragActive(active: boolean): void {\n if (this._dragActive !== active) {\n this._dragActive = active;\n this.requestUpdate();\n }\n }\n\n setDropZone(zone: DockDropZone | null): void {\n if (this._dropZone !== zone) {\n this._dropZone = zone;\n this.requestUpdate();\n }\n }\n\n // ── Junction resize handles ──────────────────────────────────────────────\n\n private _scheduleJunctions(): void {\n if (this._junctionsRaf !== null)\n return;\n this._junctionsRaf = requestAnimationFrame(() => {\n this._junctionsRaf = null;\n this._computeJunctions();\n });\n }\n\n /**\n * Find points where a parent split's gutter line meets a nested split's\n * gutter (T and + crossings). Each junction handle starts both gutter drags\n * at once, like a corner resize in VS Code.\n */\n private _computeJunctions(): void {\n const shadow = this.shadowRoot;\n if (shadow === null)\n return;\n const hostRect = this.getBoundingClientRect();\n const found: DockJunction[] = [];\n\n for (const child of shadow.querySelectorAll<SplitLayoutElement>(`ixfx-split-layout`)) {\n // Nested splits are light children of their parent split\n const parent = child.parentElement?.closest<SplitLayoutElement>(`ixfx-split-layout`) ?? null;\n if (parent === null)\n continue;\n if (typeof child.getGutterRects !== `function` || typeof parent.getGutterRects !== `function`)\n continue;\n const childRect = child.getBoundingClientRect();\n\n for (const [pi, pg] of parent.getGutterRects().entries()) {\n for (const [ci, cg] of child.getGutterRects().entries()) {\n const pgVertical = pg.width <= pg.height;\n const cgVertical = cg.width <= cg.height;\n if (pgVertical === cgVertical)\n continue;\n let x: number;\n let y: number;\n if (pgVertical) {\n // Vertical parent line × horizontal child line: they meet where\n // the child's gutter endpoint abuts the parent's gutter.\n x = pg.left + pg.width / 2;\n y = cg.top + cg.height / 2;\n if (Math.abs(x - childRect.left) > JUNCTION_TOL_PX && Math.abs(x - childRect.right) > JUNCTION_TOL_PX)\n continue;\n if (y < pg.top || y > pg.bottom)\n continue;\n } else {\n y = pg.top + pg.height / 2;\n x = cg.left + cg.width / 2;\n if (Math.abs(y - childRect.top) > JUNCTION_TOL_PX && Math.abs(y - childRect.bottom) > JUNCTION_TOL_PX)\n continue;\n if (x < pg.left || x > pg.right)\n continue;\n }\n found.push({\n x: x - hostRect.left,\n y: y - hostRect.top,\n targets: [\n { split: parent, gutterIndex: pi },\n { split: child, gutterIndex: ci },\n ],\n });\n }\n }\n }\n\n // Merge coincident points so a 4-way cross is a single handle\n const merged: DockJunction[] = [];\n for (const j of found) {\n const near = merged.find(m => Math.abs(m.x - j.x) <= JUNCTION_MERGE_PX && Math.abs(m.y - j.y) <= JUNCTION_MERGE_PX);\n if (near === undefined) {\n merged.push(j);\n continue;\n }\n for (const t of j.targets) {\n if (!near.targets.some(o => o.split === t.split && o.gutterIndex === t.gutterIndex))\n near.targets.push(t);\n }\n }\n\n const key = merged\n .map(j => `${Math.round(j.x)},${Math.round(j.y)}:${j.targets.map(t => `${t.split.getAttribute(`data-dock-path`) ?? ``}#${t.gutterIndex}`).join(`|`)}`)\n .join(`;`);\n if (key === this._junctionsKey)\n return;\n this._junctionsKey = key;\n this._junctions = merged;\n }\n\n private _onJunctionPointerDown = (event: PointerEvent, junction: DockJunction): void => {\n if (event.button !== 0)\n return;\n event.preventDefault();\n event.stopPropagation();\n\n let started = false;\n for (const target of junction.targets) {\n if (!target.split.isConnected)\n continue;\n if (target.split.beginGutterDrag(target.gutterIndex, event.pointerId, event.clientX, event.clientY))\n started = true;\n }\n if (!started)\n return;\n\n // Swallow the trailing click so it cannot focus/select anything beneath.\n this._suppressNextClick();\n\n // Keep the handle following the intersection while both drags run.\n const follow = (): void => this._scheduleJunctions();\n const stop = (): void => {\n window.removeEventListener(`pointermove`, follow);\n window.removeEventListener(`pointerup`, stop);\n window.removeEventListener(`pointercancel`, stop);\n };\n window.addEventListener(`pointermove`, follow);\n window.addEventListener(`pointerup`, stop);\n window.addEventListener(`pointercancel`, stop);\n };\n\n // ── Split-element event consumption ──────────────────────────────────────\n\n /** Fold live weights from each rendered `ixfx-split-layout` into the model. */\n private _foldLiveWeights(): void {\n const splits = this.shadowRoot?.querySelectorAll<SplitLayoutElement>(`ixfx-split-layout[data-dock-path]`);\n if (splits === undefined)\n return;\n for (const el of splits) {\n const pathStr = el.getAttribute(`data-dock-path`);\n if (pathStr === null)\n continue;\n const node = findNode(this._model, parsePath(pathStr));\n if (node === null || !isSplit(node))\n continue;\n const live = Object.values(el.getSizes());\n if (live.length === node.children.length && !weightsEqual(live, node.sizes)) {\n node.sizes = live;\n }\n }\n }\n\n private _onSplitWeightsChanged = (): void => {\n // Live gutter weights; fold silently (no re-render, so drags aren't fought).\n this._foldLiveWeights();\n this._scheduleJunctions();\n };\n\n private _onSplitCollapsed = (event: Event, collapsed: boolean): void => {\n const detail = (event as CustomEvent<{ id?: string }>).detail;\n if (!detail?.id)\n return;\n const pathStr = this.shadowRoot?.getElementById(detail.id)?.getAttribute(`data-dock-path`);\n if (pathStr === null || pathStr === undefined)\n return;\n const node = findNode(this._model, parsePath(pathStr));\n if (node === null || !isStack(node))\n return;\n // Model mirrors the element; no re-render needed (attrs already match).\n if (collapsed) {\n node.collapsed = true;\n } else {\n delete node.collapsed;\n }\n };\n\n private _onSplitClose = (event: Event): void => {\n // Route leaf closes through the model so panel elements survive: each\n // panel re-homes into the first other stack admitting its kind (or the\n // pool when none does).\n event.preventDefault();\n const detail = (event as CustomEvent<{ id?: string }>).detail;\n if (!detail?.id)\n return;\n const pathStr = this.shadowRoot?.getElementById(detail.id)?.getAttribute(`data-dock-path`);\n if (pathStr === null || pathStr === undefined)\n return;\n const path = parsePath(pathStr);\n const closing = findNode(this._model, path);\n if (closing === null || !isStack(closing))\n return;\n const moving = [...closing.panels];\n this._returnAllToolbars();\n extractStack(this._model, path);\n for (const panelId of moving) {\n addPanelToStack(this._firstStackAllowing(this._panelKind(panelId)), panelId);\n }\n this._commit();\n };\n\n // ── Tab-strip events ─────────────────────────────────────────────────────\n\n private _onTabChange = (event: Event, path: number[]): void => {\n const panelId = (event as TabListChangeEvent).detail.selected;\n const stack = findNode(this._model, path);\n if (stack === null || !isStack(stack))\n return;\n if (!setActive(stack, panelId))\n return;\n this.requestUpdate();\n this.dispatchEvent(new CustomEvent<{ panelId: string }>(`dock-panel-activated`, {\n detail: { panelId },\n bubbles: true,\n composed: true,\n }));\n };\n\n private _onStripPointerDown = (event: PointerEvent): void => {\n if (event.button !== 0)\n return;\n\n // Presses that begin on strip chrome (toolbar buttons, close buttons) are\n // not drag handles.\n const path = event.composedPath();\n for (const node of path) {\n if (!(node instanceof HTMLElement))\n continue;\n if (node.classList.contains(`list-toolbar`) || node.classList.contains(`close-btn`)) {\n return;\n }\n }\n\n const item = path.find((node): node is HTMLElement =>\n node instanceof HTMLElement && node.tagName === `IXFX-TAB-LIST-ITEM`) ?? null;\n if (item === null || !item.id)\n return;\n\n this._tabDragPending = {\n panelId: item.id,\n pointerId: event.pointerId,\n startX: event.clientX,\n startY: event.clientY,\n };\n\n window.addEventListener(`pointermove`, this._onTabDragMove);\n window.addEventListener(`pointerup`, this._onTabDragUp);\n window.addEventListener(`pointercancel`, this._onTabDragUp);\n };\n\n private _onTabDragMove = (event: PointerEvent): void => {\n const pending = this._tabDragPending;\n if (pending === null || event.pointerId !== pending.pointerId)\n return;\n\n const distance = Math.hypot(event.clientX - pending.startX, event.clientY - pending.startY);\n if (distance < DRAG_THRESHOLD_PX)\n return;\n\n this._tabDragPending = null;\n this._teardownTabDragListeners();\n this._suppressNextClick();\n\n this.dispatchEvent(new CustomEvent<{ panelId: string; pointerId: number; clientX: number; clientY: number }>(`dock-panel-drag-start`, {\n detail: {\n panelId: pending.panelId,\n pointerId: pending.pointerId,\n clientX: event.clientX,\n clientY: event.clientY,\n },\n bubbles: true,\n composed: true,\n }));\n };\n\n private _onTabDragUp = (event: PointerEvent): void => {\n if (this._tabDragPending === null || event.pointerId !== this._tabDragPending.pointerId)\n return;\n this._tabDragPending = null;\n this._teardownTabDragListeners();\n };\n\n private _teardownTabDragListeners(): void {\n window.removeEventListener(`pointermove`, this._onTabDragMove);\n window.removeEventListener(`pointerup`, this._onTabDragUp);\n window.removeEventListener(`pointercancel`, this._onTabDragUp);\n }\n\n /** After a dock drag from a tab/titlebar, swallow the trailing click so it cannot re-select or toggle. */\n private _suppressNextClick(): void {\n const swallow = (e: MouseEvent): void => {\n e.preventDefault();\n e.stopPropagation();\n window.removeEventListener(`click`, swallow, true);\n };\n window.addEventListener(`click`, swallow, true);\n }\n\n // ── Internal plumbing ────────────────────────────────────────────────────\n\n private _removeFromModel(panelId: string): void {\n const stackPath = findStackOf(this._model, panelId);\n if (stackPath === null)\n return;\n const stack = findNode(this._model, stackPath);\n if (stack !== null && isStack(stack)) {\n removePanelFromStack(stack, panelId);\n }\n normalize(this._model);\n }\n\n /** Normalize, re-render, and announce the structural change. */\n private _commit(): void {\n normalize(this._model);\n this.requestUpdate();\n this._emitChange();\n }\n\n private _syncSlots(): void {\n const inModel = new Set<string>();\n const visit = (node: DockNode): void => {\n if (isStack(node)) {\n for (const id of node.panels) {\n inModel.add(id);\n const el = this._findPanelEl(id);\n if (el === undefined)\n continue;\n el.setAttribute(`slot`, `dock-panel-${id}`);\n // Docked panels always render content-only; the leaf strip carries\n // the title chrome for every stack, single-panel or not.\n el.presentation = `tabbed`;\n }\n } else {\n node.children.forEach(visit);\n }\n };\n visit(this._model);\n\n for (const el of this._pool) {\n if (!inModel.has(el.panelId)) {\n el.setAttribute(`slot`, ``);\n el.presentation = `solo`;\n }\n }\n }\n\n /**\n * Per-panel toolbar routing: docked panels render content-only, so the\n * active panel's toolbar nodes live in its generated tab item (shown\n * right-aligned while active). Node moves preserve element state. Panels\n * outside the model keep their toolbar in their own (solo) chrome.\n */\n private _syncToolbars(): void {\n const wanted = new Map<string, HTMLElement[]>();\n const visit = (node: DockNode): void => {\n if (isStack(node)) {\n if (node.panels.length > 0 && node.active) {\n const el = this._findPanelEl(node.active);\n if (el !== undefined) {\n wanted.set(node.active, toolbarNodesOf(el));\n }\n }\n } else {\n node.children.forEach(visit);\n }\n };\n visit(this._model);\n\n for (const [panelId, nodes] of this._toolbarsOut) {\n if (!wanted.has(panelId)) {\n this._returnToolbar(panelId, nodes);\n }\n }\n\n for (const [panelId, nodes] of wanted) {\n if (this._toolbarsOut.has(panelId) || nodes.length === 0)\n continue;\n const item = this.shadowRoot?.getElementById(panelId);\n if (item === null || item === undefined)\n continue;\n for (const node of nodes) {\n item.appendChild(node);\n }\n this._toolbarsOut.set(panelId, nodes);\n }\n }\n\n private _returnToolbar(panelId: string, nodes: HTMLElement[]): void {\n const el = this._findPanelEl(panelId);\n if (el !== undefined) {\n for (const node of nodes) {\n if (node.isConnected) {\n el.appendChild(node);\n }\n }\n }\n this._toolbarsOut.delete(panelId);\n }\n\n private _returnAllToolbars(): void {\n for (const [panelId, nodes] of [...this._toolbarsOut]) {\n this._returnToolbar(panelId, nodes);\n }\n }\n\n private _emitChange(): void {\n this.dispatchEvent(new CustomEvent<{ layout: DockLayout }>(`dock-change`, {\n detail: { layout: this.saveLayout() },\n bubbles: true,\n composed: true,\n }));\n }\n\n // ── Render ───────────────────────────────────────────────────────────────\n\n protected override render() {\n return html`\n <div class=\"root\">\n ${this._renderNode(this._model, [])}\n </div>\n <div class=\"overlay\" ?hidden=${!this._dragActive}>\n ${this._dropZone === null\n ? nothing\n : html`\n <div class=\"zone-rect\" style=${rectStyle(this._dropZone.rect)}></div>\n ${this._dropZone.caretRect === undefined\n ? nothing\n : html`<div class=\"zone-caret\" style=${rectStyle(this._dropZone.caretRect)}></div>`}\n `}\n </div>\n <div class=\"junctions\" ?hidden=${this._dragActive}>\n ${this._junctions.map(junction => html`\n <div\n class=\"junction-handle\"\n style=${`left:${junction.x}px; top:${junction.y}px;`}\n role=\"separator\"\n aria-label=\"Resize adjacent panels\"\n @pointerdown=${(e: PointerEvent) => this._onJunctionPointerDown(e, junction)}\n ><span class=\"ixfx-handle\" data-handle=\"dotted\" data-shape=\"spot\" part=\"junction-handle\"></span></div>\n `)}\n </div>\n <slot @slotchange=${this._onPoolSlotChange}></slot>\n `;\n }\n\n private _renderNode(node: DockNode, path: number[], size?: number): unknown {\n if (isStack(node)) {\n return this._renderLeaf(node, path, size);\n }\n return this._renderSplit(node, path, size);\n }\n\n private _renderSplit(node: DockNode & { kind: `split` }, path: number[], size?: number): unknown {\n const pathStr = path.join(`-`);\n return html`\n <ixfx-split-layout\n class=\"split\"\n direction=${node.direction}\n size=${size === undefined ? nothing : String(size)}\n style=${`--split-gutter-size: var(--dock-split-bar-size, 2px)`}\n data-dock-path=${pathStr}\n @ixfx-split-resize=${this._onSplitWeightsChanged}\n @ixfx-split-change=${this._onSplitWeightsChanged}\n @ixfx-split-collapse=${(e: Event) => this._onSplitCollapsed(e, true)}\n @ixfx-split-expand=${(e: Event) => this._onSplitCollapsed(e, false)}\n @ixfx-split-close=${this._onSplitClose}\n >\n ${node.children.map((child, i) => this._renderNode(child, [...path, i], node.sizes[i]))}\n </ixfx-split-layout>\n `;\n }\n\n private _renderLeaf(stack: DockStackNode, path: number[], size?: number): unknown {\n const pathStr = path.join(`-`);\n const collapsible = stack.panels.length === 1\n ? (this._findPanelEl(stack.panels[0])?.collapsible ?? false)\n : false;\n\n const leafAttrs = (content: unknown): unknown => html`\n <div\n id=${`dock-leaf-${pathStr}`}\n class=\"leaf\"\n data-dock-path=${pathStr}\n data-dock-name=${stack.name ?? nothing}\n size=${size === undefined ? nothing : String(size)}\n min=${collapsible ? `1px` : nothing}\n when-small=${collapsible ? `collapse` : nothing}\n ?collapsed=${stack.collapsed === true}\n >${content}</div>\n `;\n\n if (stack.panels.length === 0) {\n return leafAttrs(html`\n <div class=\"empty\" part=\"empty\">\n <slot name=\"empty\"><span>Drop panels here</span></slot>\n </div>\n `);\n }\n\n // Every leaf renders the same strip + body chrome, so titlebars are\n // consistent whether a stack holds one panel or many. Named leaves\n // forward light-DOM `toolbar-<name>` content into the strip's toolbar.\n const toolbarSlot = stack.name !== undefined && this._toolbarSlots.has(`toolbar-${stack.name}`)\n ? html`<slot name=\"toolbar-${stack.name}\" slot=\"toolbar\"></slot>`\n : nothing;\n return leafAttrs(html`\n <ixfx-tab-list\n class=\"strip\"\n orientation=\"horizontal\"\n scrollable\n shrink\n ?hide-labels=${stack.hideLabels === true}\n @change=${(e: Event) => this._onTabChange(e, path)}\n @pointerdown=${this._onStripPointerDown}\n >\n ${repeat(stack.panels, id => id, id => this._renderTabItem(stack, id))}\n ${toolbarSlot}\n </ixfx-tab-list>\n <div class=\"leaf-body\">\n <slot name=\"dock-panel-${stack.active}\"></slot>\n </div>\n `);\n }\n\n private _renderTabItem(stack: DockStackNode, panelId: string): unknown {\n const el = this._findPanelEl(panelId);\n return html`\n <ixfx-tab-list-item\n id=${panelId}\n ?selected=${panelId === stack.active}\n .iconName=${el?.iconName ?? ``}\n .closeable=${el?.closable ?? false}\n @close=${() => this.removePanel(panelId)}\n >${el?.title ?? panelId}</ixfx-tab-list-item>\n `;\n }\n\n private _stripCaretRect(strip: Element, gapIndex: number | undefined, hostRect: DOMRect): Rect | undefined {\n const items = Array.from(strip.querySelectorAll(`ixfx-tab-list-item`)) as HTMLElement[];\n if (items.length === 0)\n return undefined;\n const index = Math.max(0, Math.min(gapIndex ?? items.length, items.length));\n const edge = index < items.length\n ? items[index].getBoundingClientRect().left\n : items[items.length - 1].getBoundingClientRect().right;\n const stripRect = strip.getBoundingClientRect();\n return {\n x: edge - hostRect.left - 1,\n y: stripRect.top - hostRect.top,\n w: 2,\n h: stripRect.height,\n };\n }\n\n static override styles = [\n themeFallbacks,\n handleStyles,\n css`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n --dock-drop-zone-color: var(--accent);\n --dock-drop-zone-opacity: 0.25;\n --dock-collapsed-size: 40px;\n --dock-split-bar-size: 2px;\n position: relative;\n }\n\n .root {\n width: 100%;\n height: 100%;\n }\n\n ixfx-split-layout.split {\n width: 100%;\n height: 100%;\n }\n\n .leaf {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n min-width: 0;\n min-height: 0;\n box-sizing: border-box;\n overflow: hidden;\n border: 1px solid var(--surface-4);\n border-radius: var(--radius-m);\n }\n\n .leaf[collapsed] {\n pointer-events: none;\n }\n\n .leaf[collapsed] .leaf-body,\n .leaf[collapsed] .empty {\n visibility: hidden;\n }\n\n .strip {\n flex-shrink: 0;\n border: 0;\n /* The leaf background shows through selected tabs; a text underline\n (not the border indicator) carries the selection. */\n --ixfx-tab-selected-background: transparent;\n --ixfx-selected-tab-border-width: 0;\n --ixfx-selected-tab-text-decoration: underline;\n --ixfx-selected-tab-text-decoration-thickness: 2px;\n --ixfx-selected-tab-text-decoration-offset: 4px;\n --ixfx-tab-hover-background: var(--surface-4);\n }\n\n /* Uniform tab height: a panel toolbar button would otherwise inflate\n its tab item, giving strips of different stacks different heights. */\n .strip ixfx-tab-list-item {\n height: var(--dock-tab-height, 30px);\n }\n\n /* Breathing room between strip toolbars and the leaf edge. */\n .strip::part(list-toolbar) {\n padding-right: var(--space-xs);\n }\n\n .leaf-body {\n flex: 1;\n min-height: 0;\n min-width: 0;\n box-sizing: border-box;\n padding: var(--dock-leaf-body-padding, var(--space-s));\n }\n\n .empty {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--surface-3-text);\n opacity: 0.6;\n font-size: var(--text-m);\n border: 1px dashed var(--border-subtle);\n border-radius: var(--radius-m);\n margin: var(--space-s);\n }\n\n .overlay {\n position: absolute;\n inset: 0;\n pointer-events: none;\n z-index: 100;\n }\n\n .zone-rect {\n position: absolute;\n background: var(--dock-drop-zone-color);\n opacity: var(--dock-drop-zone-opacity);\n border-radius: var(--radius-s);\n }\n\n .zone-caret {\n position: absolute;\n background: var(--dock-drop-zone-color);\n border-radius: 1px;\n }\n\n .junctions {\n position: absolute;\n inset: 0;\n pointer-events: none;\n z-index: 99;\n }\n\n .junctions[hidden] {\n display: none;\n }\n\n .junction-handle {\n position: absolute;\n width: 14px;\n height: 14px;\n transform: translate(-50%, -50%);\n border-radius: 50%;\n cursor: nwse-resize;\n pointer-events: auto;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .junction-handle .ixfx-handle {\n --ixfx-handle-spot-size: 12px;\n --ixfx-handle-dot-size: 3px;\n --ixfx-handle-opacity: 0;\n --ixfx-handle-opacity-active: 0.9;\n }\n\n slot:not([name]) {\n display: none;\n }\n `,\n ];\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\n/** `split-horizontal` = horizontal divider = panels stacked vertically. */\nfunction opToDirection(op: DockOperation): `row` | `column` {\n return op === `split-horizontal` ? `column` : `row`;\n}\n\nfunction operationToToken(op: DockOperation): string {\n if (op === `tabs`)\n return `tabs`;\n return op === `split-horizontal` ? `horizontal` : `vertical`;\n}\n\n/** Host-level `accepts`: empty or `none` rejects everything. */\nfunction tokenAllows(tokens: string, token: string): boolean {\n const list = tokens.trim().split(/\\s+/).filter(t => t.length > 0);\n if (list.length === 0 || (list.length === 1 && list[0] === `none`))\n return false;\n return list.includes(`all`) || list.includes(token);\n}\n\n/** Panel-level `accepts`: empty means unrestricted (host rules still apply). */\nfunction panelAllows(tokens: string, token: string): boolean {\n const list = tokens.trim().split(/\\s+/).filter(t => t.length > 0);\n if (list.length === 0)\n return true;\n if (list.length === 1 && list[0] === `none`)\n return false;\n return list.includes(`all`) || list.includes(token);\n}\n\nfunction weightsEqual(a: number[], b: number[]): boolean {\n if (a.length !== b.length)\n return false;\n return a.every((v, i) => Math.abs(v - b[i]) < 0.0001);\n}\n\nfunction rectStyle(r: Rect): string {\n return `left:${r.x}px; top:${r.y}px; width:${r.w}px; height:${r.h}px;`;\n}\n\n/** Strip a live `DockDropZone` down to its serializable {@link DockDropTarget}. */\nfunction zoneToTarget(zone: DockDropZone): DockDropTarget {\n return {\n operation: zone.operation,\n targetPath: [...zone.targetPath],\n side: zone.side,\n ...(zone.gapIndex === undefined ? {} : { gapIndex: zone.gapIndex }),\n };\n}\n\nfunction cloneNode(node: DockNode): DockNode {\n return JSON.parse(JSON.stringify(node)) as DockNode;\n}\n\n/** Panel content kind, normalized (`'any'` when unset/blank). */\nfunction normalizeKind(kind: string | undefined): string {\n const trimmed = kind?.trim() ?? ``;\n return trimmed || `any`;\n}\n\nfunction parsePath(pathStr: string): number[] {\n return pathStr.length === 0 ? [] : pathStr.split(`-`).filter(s => s.length > 0).map(Number);\n}\n\n/** Toolbar-slot light children of a dock panel. */\nfunction toolbarNodesOf(el: DockPanelElement): HTMLElement[] {\n return Array.from(el.children).filter((c): c is HTMLElement =>\n c instanceof HTMLElement && c.getAttribute(`slot`) === `toolbar`);\n}\n\n/** Nearest strip gap to the pointer (reuses the tab-list midpoint rule). */\nfunction computeStripGapIndex(strip: Element, clientX: number, _clientY: number): number {\n const items = Array.from(strip.querySelectorAll(`ixfx-tab-list-item`)) as HTMLElement[];\n if (items.length === 0)\n return 0;\n for (let i = 0; i < items.length; i++) {\n const r = items[i].getBoundingClientRect();\n const mid = (r.left + r.right) / 2;\n if (clientX < mid)\n return i;\n }\n return items.length;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-dock-host': DockHostElement;\n }\n}\n\nexport interface DockHostElement {\n addEventListener: (<K extends keyof DockHostElementEventMap>(\n type: K,\n listener: (this: DockHostElement, event: DockHostElementEventMap[K]) => void,\n options?: boolean | AddEventListenerOptions,\n ) => void) & ((\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ) => void);\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","/* eslint-disable ts/no-unsafe-declaration-merging */\nimport type { DragGhost } from '../util/drag-ghost.js';\nimport type { PanelElement, PanelOrientation, PanelToggleInteraction, PanelVariant } from './panel.js';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { property, queryAssignedElements } from 'lit/decorators.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport { createDragGhost } from '../util/drag-ghost.js';\n\nexport type PanelGroupOrientation = `horizontal` | `vertical`;\n\nexport interface PanelGroupReorderDetail {\n readonly fromIndex: number;\n readonly toIndex: number;\n readonly panel: PanelElement;\n}\n\nexport type PanelGroupReorderEvent = CustomEvent<PanelGroupReorderDetail>;\n\nexport interface PanelGroupElementEventMap {\n reorder: PanelGroupReorderEvent;\n}\n\n/** Pointer movement threshold (px) before a press becomes a drag. */\nconst DRAG_THRESHOLD_PX = 5;\n\n/**\n * Pure helper: nearest gap index for a pointer position along one axis.\n * `edges` are the [start, end] of each sibling (excluding the drag source),\n * in DOM order. Returns 0..edges.length.\n */\nexport function panelGapIndex(edges: ReadonlyArray<readonly [number, number]>, pos: number): number {\n let bestGap = 0;\n let bestDist = Number.POSITIVE_INFINITY;\n for (let i = 0; i < edges.length; i++) {\n const [start, end] = edges[i];\n const mid = (start + end) / 2;\n if (pos < mid) {\n const d = Math.abs(pos - start);\n if (d < bestDist) {\n bestDist = d;\n bestGap = i;\n }\n } else {\n const d = Math.abs(pos - end);\n if (d < bestDist) {\n bestDist = d;\n bestGap = i + 1;\n }\n }\n }\n return bestGap;\n}\n\nlet panelGhostStylesInjected = false;\n\n/**\n * Global ghost styling so the drag preview matches `ixfx-titlebar` chrome\n * (font, colours, padding). Injected once; the ghost lives outside shadow DOM\n * (body/theme container) so component styles cannot reach it.\n */\nfunction injectPanelGhostStyles(): void {\n if (panelGhostStylesInjected) {\n return;\n }\n panelGhostStylesInjected = true;\n const style = document.createElement(`style`);\n style.textContent = `\n .ixfx-drag-ghost.ixfx-panel-group-ghost {\n padding: var(--space-s, 8px) var(--space-m, 16px);\n background: var(--surface-4);\n color: var(--surface-3-text);\n border: none;\n border-radius: var(--radius-s, 4px);\n font-family: var(--font-family);\n font-size: var(--text-m);\n font-weight: var(--font-weight-bold, 600);\n min-height: 2em;\n user-select: none;\n -webkit-user-select: none;\n }\n .ixfx-drag-ghost.ixfx-panel-group-ghost ixfx-icon {\n width: 1.25em;\n height: 1.25em;\n flex-shrink: 0;\n }\n `;\n document.head.appendChild(style);\n}\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 }) collapsible = true;\n @property({ type: Boolean, attribute: `accordion`, reflect: true }) accordion = false;\n @property({ type: Boolean, attribute: `allow-reorder`, reflect: true }) allowReorder = false;\n /** Explicit gap between panels. When unset, `--group-gap` (falling back to `--space-l`) controls the gap. */\n @property() gap?: string;\n\n @queryAssignedElements({ slot: `` }) private _panels!: PanelElement[];\n\n private _dragState: {\n pointerId: number;\n source: PanelElement;\n fromIndex: number;\n startX: number;\n startY: number;\n active: boolean;\n ghost: DragGhost | null;\n gapIndex: number | undefined;\n } | null = null;\n\n private _suppressNextClick = false;\n\n private _onPanelToggle(e: Event) {\n const panel = e.target as PanelElement;\n if (panel.collapsed) {\n return;\n }\n\n if (!this.accordion) {\n return;\n }\n\n for (const p of this._panels) {\n if (p !== panel) {\n p.collapsed = true;\n }\n }\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n // Capture phase so we can swallow the trailing click after a real reorder\n // before it reaches the titlebar toggle handler inside ixfx-panel.\n this.addEventListener(`click`, this._onClickCapture, true);\n }\n\n override disconnectedCallback(): void {\n this.removeEventListener(`click`, this._onClickCapture, true);\n if (this._dragState) {\n this._abortDrag();\n this._endDrag(this._dragState.pointerId);\n }\n super.disconnectedCallback();\n }\n\n protected override firstUpdated(): void {\n if (this.gap !== undefined) {\n this.style.setProperty(`--group-gap`, this.gap);\n }\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(`gap`)) {\n if (this.gap !== undefined) {\n this.style.setProperty(`--group-gap`, this.gap);\n } else {\n this.style.removeProperty(`--group-gap`);\n }\n }\n if (changed.has(`variant`) || changed.has(`toggleInteraction`) || changed.has(`orientation`) || changed.has(`collapsible`)) {\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 if (this.collapsible) {\n panel.setAttribute(`collapsible`, ``);\n } else {\n panel.removeAttribute(`collapsible`);\n }\n }\n }\n\n private _onSlotChange(): void {\n this.updateComplete.then(() => {\n this._propagateAll();\n });\n }\n\n private _onClickCapture = (event: Event): void => {\n if (!this._suppressNextClick) {\n return;\n }\n this._suppressNextClick = false;\n event.preventDefault();\n event.stopPropagation();\n };\n\n private _onKeyDown = (event: KeyboardEvent): void => {\n const state = this._dragState;\n if (event.key !== `Escape` || !state?.active) {\n return;\n }\n event.preventDefault();\n const pointerId = state.pointerId;\n this._abortDrag();\n this._endDrag(pointerId);\n };\n\n /**\n * Walk composedPath for the nearest ixfx-panel, requiring the press to have\n * gone through an ixfx-titlebar (titlebar-anywhere drag). Bails when the\n * path crosses interactive chrome (buttons/links/inputs/toolbar/caret/close)\n * so those controls always win over dragging.\n */\n private _findDragTarget(event: PointerEvent): PanelElement | null {\n if (!this.allowReorder) {\n return null;\n }\n const path = event.composedPath();\n let panel: PanelElement | null = null;\n let viaTitlebar = false;\n for (const node of path) {\n if (!(node instanceof HTMLElement)) {\n continue;\n }\n const tag = node.tagName;\n if (tag === `BUTTON` || tag === `A` || tag === `INPUT` || tag === `SELECT` || tag === `TEXTAREA`) {\n return null;\n }\n if (node.classList.contains(`toolbar`) || node.classList.contains(`close-btn`) || node.classList.contains(`caret-btn`)) {\n return null;\n }\n if (node.hasAttribute?.(`slot`) && node.getAttribute(`slot`) === `toolbar`) {\n return null;\n }\n if (tag === `IXFX-TITLEBAR`) {\n viaTitlebar = true;\n }\n if (!panel && tag === `IXFX-PANEL`) {\n panel = node as PanelElement;\n }\n }\n if (!panel || !viaTitlebar) {\n return null;\n }\n return panel;\n }\n\n private _onPointerDown = (event: PointerEvent): void => {\n if (!this.allowReorder || event.button !== 0) {\n return;\n }\n const target = this._findDragTarget(event);\n if (!target?.parentNode) {\n return;\n }\n const fromIndex = Array.prototype.indexOf.call(target.parentNode.children, target);\n if (fromIndex < 0) {\n return;\n }\n // Don't capture yet — capturing on pointerdown would redirect the trailing\n // click to the capture target and break the normal titlebar toggle press.\n // Capture only once the drag activates.\n this._dragState = {\n pointerId: event.pointerId,\n source: target,\n fromIndex,\n startX: event.clientX,\n startY: event.clientY,\n active: false,\n ghost: null,\n gapIndex: undefined,\n };\n window.addEventListener(`pointermove`, this._onPointerMove);\n window.addEventListener(`pointerup`, this._onPointerUp);\n window.addEventListener(`pointercancel`, this._onPointerCancel);\n };\n\n private _onPointerMove = (event: PointerEvent): void => {\n const state = this._dragState;\n if (!state || event.pointerId !== state.pointerId) {\n return;\n }\n const distance = Math.hypot(event.clientX - state.startX, event.clientY - state.startY);\n if (!state.active) {\n if (distance < DRAG_THRESHOLD_PX) {\n return;\n }\n this._beginDrag(event);\n }\n state.ghost?.move(event.clientX, event.clientY);\n const gap = this._computeGapIndex(event.clientX, event.clientY);\n if (gap !== state.gapIndex) {\n state.gapIndex = gap;\n this.requestUpdate();\n }\n };\n\n private _onPointerUp = (event: PointerEvent): void => {\n const state = this._dragState;\n if (!state || event.pointerId !== state.pointerId) {\n return;\n }\n if (state.active) {\n const gap = this._computeGapIndex(event.clientX, event.clientY);\n this._commitDrag(state.source, state.fromIndex, gap);\n }\n this._endDrag(event.pointerId);\n };\n\n private _onPointerCancel = (event: PointerEvent): void => {\n const state = this._dragState;\n if (!state || event.pointerId !== state.pointerId) {\n return;\n }\n this._abortDrag();\n this._endDrag(event.pointerId);\n };\n\n private _beginDrag(event: PointerEvent): void {\n const state = this._dragState;\n if (!state || state.active) {\n return;\n }\n try {\n this.setPointerCapture(event.pointerId);\n } catch {\n // Fall through — window listeners still catch move/up.\n }\n state.active = true;\n // `dragging` kills text selection for the gesture (see styles).\n this.setAttribute(`dragging`, ``);\n state.source.setAttribute(`drag-source`, ``);\n state.ghost = this._createGhost(state.source);\n state.ghost?.move(event.clientX, event.clientY);\n }\n\n private _abortDrag(): void {\n const state = this._dragState;\n if (!state) {\n return;\n }\n state.source.removeAttribute(`drag-source`);\n if (state.gapIndex !== undefined) {\n state.gapIndex = undefined;\n this.requestUpdate();\n }\n }\n\n private _endDrag(pointerId: number): void {\n const state = this._dragState;\n if (!state) {\n return;\n }\n state.ghost?.destroy();\n state.ghost = null;\n this.removeAttribute(`dragging`);\n this._dragState = null;\n window.removeEventListener(`pointermove`, this._onPointerMove);\n window.removeEventListener(`pointerup`, this._onPointerUp);\n window.removeEventListener(`pointercancel`, this._onPointerCancel);\n try {\n this.releasePointerCapture(pointerId);\n } catch { /* already released */ }\n this.requestUpdate();\n }\n\n private _commitDrag(source: PanelElement, fromIndex: number, gapIndex: number | undefined): void {\n source.removeAttribute(`drag-source`);\n // Gap is an index into the without-source panel list; resolve the reference\n // node from that list, then measure the public indices against the real\n // light-DOM children (which may include non-panel elements).\n const siblings = (this._panels ?? []).filter(el => el !== source);\n const target = gapIndex === undefined\n ? siblings.length\n : Math.max(0, Math.min(gapIndex, siblings.length));\n const parent = source.parentNode;\n if (!parent) {\n return;\n }\n const ref = siblings[target] ?? null;\n parent.insertBefore(source, ref);\n const toIndex = Array.prototype.indexOf.call(parent.children, source);\n if (toIndex === fromIndex) {\n return;\n }\n // A real reorder happened — swallow the trailing click so the titlebar\n // implicit toggle doesn't also collapse/expand the dragged panel.\n this._suppressNextClick = true;\n this.dispatchEvent(new CustomEvent<PanelGroupReorderDetail>(`reorder`, {\n bubbles: true,\n composed: true,\n detail: { fromIndex, toIndex, panel: source },\n }));\n }\n\n private _createGhost(source: PanelElement): DragGhost | null {\n // Mirror ixfx-titlebar's title-text-wrapper: icon + title with 1ch indent.\n const content = document.createElement(`span`);\n content.style.display = `inline-flex`;\n content.style.alignItems = `center`;\n content.style.padding = `0 var(--space-s, 8px)`;\n content.style.minWidth = `0`;\n if (source.iconName) {\n const icon = document.createElement(`ixfx-icon`) as HTMLElement & { name: string };\n icon.name = source.iconName;\n content.appendChild(icon);\n }\n const label = document.createElement(`span`);\n label.textContent = (source.title || (source.textContent ?? ``).trim()).slice(0, 60);\n label.style.paddingLeft = `1ch`;\n label.style.overflow = `hidden`;\n label.style.textOverflow = `ellipsis`;\n label.style.whiteSpace = `nowrap`;\n content.appendChild(label);\n try {\n injectPanelGhostStyles();\n return createDragGhost({ anchor: source, content, className: `ixfx-panel-group-ghost` });\n } catch {\n return null;\n }\n }\n\n /**\n * Nearest panel gap to the pointer, ignoring the drag source.\n * The perpendicular axis is ignored — the pointer always resolves to a gap.\n */\n private _computeGapIndex(clientX: number, clientY: number): number | undefined {\n const state = this._dragState;\n if (!state) {\n return undefined;\n }\n const siblings = (this._panels ?? []).filter(el => el !== state.source);\n if (siblings.length === 0) {\n return 0;\n }\n const useX = this.orientation === `horizontal`;\n const pos = useX ? clientX : clientY;\n const edges = siblings.map((el) => {\n const rect = el.getBoundingClientRect();\n return [useX ? rect.left : rect.top, useX ? rect.right : rect.bottom] as const;\n });\n return panelGapIndex(edges, pos);\n }\n\n private _computeCaretStyle(): string | undefined {\n const state = this._dragState;\n if (!state?.active || state.gapIndex === undefined) {\n return undefined;\n }\n const siblings = (this._panels ?? []).filter(el => el !== state.source);\n if (siblings.length === 0) {\n return undefined;\n }\n const hostRect = this.getBoundingClientRect();\n if (!hostRect) {\n return undefined;\n }\n const gap = Math.max(0, Math.min(state.gapIndex, siblings.length));\n const rect = gap < siblings.length\n ? siblings[gap].getBoundingClientRect()\n : siblings[siblings.length - 1].getBoundingClientRect();\n if (this.orientation === `horizontal`) {\n const x = (gap < siblings.length ? rect.left : rect.right) - hostRect.left;\n return `transform: translate(${x - 1}px, 0); width: 2px; height: ${hostRect.height}px;`;\n }\n const y = (gap < siblings.length ? rect.top : rect.bottom) - hostRect.top;\n return `transform: translate(0, ${y - 1}px); width: ${hostRect.width}px; height: 2px;`;\n }\n\n protected override render() {\n const caretStyle = this._computeCaretStyle();\n return html`\n <slot\n @toggle=${this._onPanelToggle}\n @slotchange=${this._onSlotChange}\n @pointerdown=${this._onPointerDown}\n @keydown=${this._onKeyDown}\n ></slot>\n ${caretStyle ? html`<div class=\"drop-caret\" style=${caretStyle}></div>` : nothing}\n `;\n }\n\n static override styles = css`\n :host {\n position: relative;\n display: flex;\n flex-direction: column;\n gap: var(--group-gap, var(--space-l));\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 :host([allow-reorder]) ::slotted(ixfx-panel) {\n cursor: grab;\n }\n\n :host([allow-reorder]) ::slotted(ixfx-panel[drag-source]) {\n cursor: grabbing;\n opacity: 0.4;\n }\n\n /* While dragging, suppress text selection inside the panels. */\n :host([dragging]),\n :host([dragging]) ::slotted(*) {\n user-select: none;\n -webkit-user-select: none;\n }\n\n :host([dragging]) ::slotted(ixfx-panel) {\n cursor: grabbing;\n }\n\n .drop-caret {\n position: absolute;\n top: 0;\n left: 0;\n background: var(--accent);\n border-radius: 1px;\n pointer-events: none;\n z-index: 1;\n }\n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-panel-group': PanelGroupElement;\n }\n}\n\nexport interface PanelGroupElement {\n addEventListener: (<K extends keyof PanelGroupElementEventMap>(\n type: K,\n listener: (this: PanelGroupElement, event: PanelGroupElementEventMap[K]) => void,\n options?: boolean | AddEventListenerOptions,\n ) => void) & ((\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ) => void);\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 { 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(--toolbar-group-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 { ToolbarAlign, 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: String, attribute: `toolbar-align`, reflect: true }) toolbarAlign: ToolbarAlign = `near`;\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 --toolbar-overflow: auto;\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([toolbar-align=\"far\"][orientation=\"horizontal\"]) .inner { justify-content: flex-end; }\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 }\n .overflow-btn[hidden] { display: none; }\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 const overflowMode = getComputedStyle(this).getPropertyValue(`--toolbar-overflow`).trim() as string;\n\n if (this.layout !== `one-line` || overflowMode === `disabled`) {\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\n let mutated = false;\n\n // 'collapsed' mode: all overflowable items start in overflow\n if (overflowMode === `collapsed`) {\n if (inMain.length > 0) {\n for (const el of inMain) {\n el.setAttribute(`slot`, `overflow`);\n }\n inOverflow.push(...inMain);\n inMain.length = 0;\n mutated = true;\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 return;\n }\n\n // 'auto' mode: normal overflow handling\n const btnAllowance = inOverflow.length > 0 ? gap + btnSize : 0;\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 overflowMode = getComputedStyle(this).getPropertyValue(`--toolbar-overflow`).trim();\n const hasOverflow = this._overflowCount > 0 || overflowMode === `collapsed`;\n return html`\n <div class=\"inner\" role=\"toolbar\" aria-orientation=${this.orientation}>\n <slot></slot>\n <ixfx-button class=\"overflow-btn\" ?hidden=${!hasOverflow} @click=${this._toggleOverflow} aria-label=\"More\" aria-haspopup=\"true\" aria-expanded=${this._popover?.matches(`:popover-open`) ?? false}>⋯</ixfx-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 { clamp } from \"@ixfx/numbers\";\nimport { css, html, LitElement } from \"lit\";\nimport { property, state } from \"lit/decorators.js\";\nimport { themeFallbacks } from \"../styles/fallbacks.js\";\nimport { handleStyles } from \"../styles/handle.js\";\nimport { safeCustomElement as customElement } from \"../util/custom-elements.js\";\n\n// TODO: Fire event when panels have been resized\n/**\n * Lays out two elements within a container, with a bar to resize them\n * proportionally.\n *\n * Events\n * ixfx-split-collapsed: Dispatched when a panel is collapsed/uncollapsed via drag.\n * detail: { panel: 'A' | 'B', collapsed: boolean }\n *\n * Attributes\n * layout: `vertical`|`horizontal`\n * sizeA/B: CSS size of section A or B. Can use relative or absolute values\n * fixedA/B: If _true_ size will be calculated in pixels. By default (_false_) it uses % of whole\n * collapsible: If _true_, panels can be collapsed by dragging to edge (default: false)\n * minSizeA/B: Minimum size for panel A or B (e.g., \"100px\" or \"20%\"). Default: none\n * maxSizeA/B: Maximum size for panel A or B (e.g., \"200px\" or \"80%\"). Default: none\n *\n * CSS variables\n * --handle-size: 2px; // Width/height of split bar\n * --handle-colour: var(--surface-5); // Colour of split bar\n * --handle-hover-colour: var(--surface-6); // Split bar on hover\n * --handle-active-colour: var(--accent); // Split bar while dragging\n * --ixfx-handle-* // Grip look — shared handle primitive\n * // (see docs/infra-handle.md)\n */\n@customElement(`ixfx-twosplit-layout`)\nexport class TwoSplitLayoutElement extends LitElement {\n @property({ type: String })\n layout: `vertical` | `horizontal` = `vertical`;\n\n @property({ type: String })\n sizeA = ``;\n\n @property({ type: String })\n sizeB = ``;\n\n @property({ type: Boolean })\n fixedA = false;\n\n @property({ type: Boolean })\n fixedB = false;\n\n @property({ type: Boolean })\n collapsible = false;\n\n @property({ type: Boolean, reflect: true })\n collapsedA = false;\n\n @property({ type: Boolean, reflect: true })\n collapsedB = false;\n\n @property({ type: String })\n minSizeA = ``;\n\n @property({ type: String })\n maxSizeA = ``;\n\n @property({ type: String })\n minSizeB = ``;\n\n @property({ type: String })\n maxSizeB = ``;\n\n @state()\n private _hasCorner = false;\n\n private get showGrabHandle(): boolean {\n const size = getComputedStyle(this).getPropertyValue(`--handle-size`).trim();\n const num = Number.parseFloat(size);\n return !Number.isNaN(num) && num > 3;\n }\n\n #elementBounds: DOMRect | undefined;\n #startSizeA = ``;\n #startSizeB = ``;\n #cornerStartX = 0;\n #cornerStartY = 0;\n #nestedSplitInitialSizeA = ``;\n\n #cornerZone: HTMLElement | undefined;\n #nestedSplit: TwoSplitLayoutElement | undefined;\n #nestedSplitBounds: DOMRect | undefined;\n #nestedHandleBounds: DOMRect | undefined;\n #observer: MutationObserver | undefined;\n #pendingNestedUpdate: { sizeA: number; sizeB: number } | null = null;\n #collapsedAPointerAtCollapse: number | undefined;\n #collapsedBPointerAtCollapse: number | undefined;\n #hysteresisThreshold = 0.1;\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.#observer?.disconnect();\n }\n\n firstUpdated() {\n this.#setupNestedSplitObserver();\n }\n\n updated(changedProperties: Map<string, unknown>) {\n if (changedProperties.has(`sizeA`) || changedProperties.has(`sizeB`)\n || changedProperties.has(`collapsedA`) || changedProperties.has(`collapsedB`)) {\n this.#updateCornerPosition();\n }\n if (changedProperties.has(`sizeA`) || changedProperties.has(`sizeB`)) {\n this.#updateDataCollapsed();\n }\n }\n\n #updateDataCollapsed() {\n if (this.collapsedA) {\n this.setAttribute(`data-collapsed-a`, ``);\n } else {\n this.removeAttribute(`data-collapsed-a`);\n }\n if (this.collapsedB) {\n this.setAttribute(`data-collapsed-b`, ``);\n } else {\n this.removeAttribute(`data-collapsed-b`);\n }\n }\n\n #dispatchCollapsedEvent(panel: `A` | `B`, collapsed: boolean) {\n this.dispatchEvent(new CustomEvent(`ixfx-split-collapsed`, {\n detail: { panel, collapsed },\n bubbles: true,\n composed: true,\n }));\n }\n\n #setupNestedSplitObserver() {\n const slotA = this.shadowRoot?.querySelector(`slot[name=\"a\"]`) as HTMLSlotElement | undefined;\n if (!slotA)\n return;\n\n this.#observer = new MutationObserver(() => {\n this.#checkForNestedSplit();\n });\n\n this.#observer.observe(slotA, { characterData: true, childList: true, subtree: true });\n this.#checkForNestedSplit();\n }\n\n #checkForNestedSplit() {\n const slotA = this.shadowRoot?.querySelector(`slot[name=\"a\"]`) as HTMLSlotElement | undefined;\n if (!slotA)\n return;\n\n const assignedElements = slotA.assignedElements();\n\n const findNestedSplit = (elements: Element[]): TwoSplitLayoutElement | undefined => {\n for (const el of elements) {\n if (el.tagName === `IXFX-SPLIT-LAYOUT`) {\n return el as TwoSplitLayoutElement;\n }\n const nested = findNestedSplit(Array.from(el.children));\n if (nested)\n return nested;\n }\n return undefined;\n };\n\n const nestedSplit = findNestedSplit(assignedElements);\n\n if (nestedSplit) {\n this.#nestedSplit = nestedSplit;\n this._hasCorner = true;\n requestAnimationFrame(() => this.#updateCornerPosition());\n } else {\n this.#nestedSplit = undefined;\n this._hasCorner = false;\n }\n }\n\n #getNestedSplit(): TwoSplitLayoutElement | undefined {\n if (this.#nestedSplit)\n return this.#nestedSplit;\n\n const slotA = this.shadowRoot?.querySelector(`slot[name=\"a\"]`) as HTMLSlotElement | undefined;\n if (!slotA)\n return undefined;\n const assignedElements = slotA.assignedElements();\n return assignedElements.find(\n el => el.tagName === `IXFX-SPLIT-LAYOUT`,\n ) as TwoSplitLayoutElement | undefined;\n }\n\n #parseSizeAsFraction(size: string, total: number): number {\n if (size.endsWith(`px`)) {\n return Number.parseFloat(size.replace(`px`, ``)) / total;\n } else if (size.endsWith(`%`)) {\n return Number.parseFloat(size.replace(`%`, ``)) / 100;\n }\n return 0.5;\n }\n\n #parseSizeToPx(size: string, total: number): number | null {\n if (size.endsWith(`px`)) {\n return Number.parseFloat(size.replace(`px`, ``));\n } else if (size.endsWith(`%`)) {\n return (Number.parseFloat(size.replace(`%`, ``)) / 100) * total;\n }\n return null;\n }\n\n #applyConstraints(sizeA: string, sizeB: string, total: number): { sizeA: string; sizeB: string } {\n let fractionA = this.#parseSizeAsFraction(sizeA, total);\n let fractionB = this.#parseSizeAsFraction(sizeB, total);\n\n const minA = this.#minSizeToFraction(this.minSizeA, total);\n const minB = this.#minSizeToFraction(this.minSizeB, total);\n const maxA = this.#maxSizeToFraction(this.maxSizeA, total);\n const maxB = this.#maxSizeToFraction(this.maxSizeB, total);\n\n if (minA !== null || minB !== null) {\n const minSum = (minA ?? 0) + (minB ?? 0);\n if (minSum > 1) {\n const scale = 1 / minSum;\n if (minA !== null)\n minA !== null ? fractionA = minA * scale : fractionA = 0;\n if (minB !== null)\n minB !== null ? fractionB = minB * scale : fractionB = 0;\n }\n\n if (fractionA < (minA ?? 0))\n fractionA = minA ?? 0;\n if (fractionB < (minB ?? 0))\n fractionB = minB ?? 0;\n }\n\n if (maxA !== null) {\n if (fractionA > maxA)\n fractionA = maxA;\n }\n if (maxB !== null) {\n if (fractionB > maxB)\n fractionB = maxB;\n }\n\n fractionB = 1 - fractionA;\n\n const isPercentA = !this.sizeA.endsWith(`px`);\n const _isPercentB = !this.sizeB.endsWith(`px`);\n\n if (isPercentA) {\n return { sizeA: `${fractionA * 100}%`, sizeB: `${fractionB * 100}%` };\n } else {\n return { sizeA: `${fractionA * total}px`, sizeB: `${fractionB * total}px` };\n }\n }\n\n #minSizeToFraction(minSize: string, total: number): number | null {\n if (minSize.length === 0)\n return null;\n const px = this.#parseSizeToPx(minSize, total);\n if (px !== null)\n return px / total;\n if (minSize.endsWith(`%`))\n return Number.parseFloat(minSize.replace(`%`, ``)) / 100;\n return null;\n }\n\n #maxSizeToFraction(maxSize: string, total: number): number | null {\n if (maxSize.length === 0)\n return null;\n const px = this.#parseSizeToPx(maxSize, total);\n if (px !== null)\n return px / total;\n if (maxSize.endsWith(`%`))\n return Number.parseFloat(maxSize.replace(`%`, ``)) / 100;\n return null;\n }\n\n #getIntersectionPoint(): { x: number; y: number } | null {\n const outerBounds = this.getBoundingClientRect();\n const zoneEl = this.getZone();\n if (!zoneEl)\n return null;\n\n const nestedSplit = this.#getNestedSplit();\n if (!nestedSplit)\n return null;\n\n const _zoneBounds = zoneEl.getBoundingClientRect();\n\n const outerFraction = this.#parseSizeAsFraction(this.sizeA || `50%`, outerBounds.width);\n\n let x: number, y: number;\n\n if (this.layout === `vertical` && nestedSplit.layout === `horizontal`) {\n x = outerFraction * outerBounds.width;\n const nestedFraction = this.#parseSizeAsFraction(nestedSplit.sizeA || `50%`, outerBounds.height);\n y = nestedFraction * outerBounds.height;\n } else if (this.layout === `horizontal` && nestedSplit.layout === `vertical`) {\n const nestedFraction = this.#parseSizeAsFraction(nestedSplit.sizeA || `50%`, outerBounds.width);\n x = nestedFraction * outerBounds.width;\n y = outerFraction * outerBounds.height;\n } else {\n return null;\n }\n\n return { x, y };\n }\n\n #updateCornerPosition() {\n if (!this._hasCorner)\n return;\n\n const cornerZone = this.shadowRoot?.querySelector(`.corner-zone`) as HTMLElement | undefined;\n if (!cornerZone)\n return;\n\n const zoneEl = this.getZone();\n if (!zoneEl)\n return;\n\n const intersection = this.#getIntersectionPoint();\n if (!intersection) {\n cornerZone.style.display = `none`;\n return;\n }\n\n const cornerX = intersection.x - 6;\n const cornerY = intersection.y - 6;\n\n cornerZone.style.left = `${cornerX}px`;\n cornerZone.style.top = `${cornerY}px`;\n cornerZone.style.display = `block`;\n\n const nestedSplit = this.#getNestedSplit();\n if (nestedSplit) {\n if (this.layout === `vertical` && nestedSplit.layout === `horizontal`) {\n cornerZone.style.cursor = `nwse-resize`;\n } else if (this.layout === `horizontal` && nestedSplit.layout === `vertical`) {\n cornerZone.style.cursor = `nesw-resize`;\n }\n }\n }\n\n getZone(): HTMLElement | undefined {\n if (!this.shadowRoot)\n return;\n const el = this.shadowRoot.querySelector(`#zone`);\n if (!el)\n return undefined;\n return el as HTMLElement;\n }\n\n #onResizeHandleDown = (event: PointerEvent) => {\n event.preventDefault();\n const zoneEl = this.getZone();\n if (zoneEl) {\n zoneEl.classList.add(`user-resizing`);\n }\n this.#elementBounds = this.getBoundingClientRect();\n this.#startSizeA = this.sizeA;\n this.#startSizeB = this.sizeB;\n window.addEventListener(`pointerup`, this.#onResizeHandleUp);\n window.addEventListener(`pointermove`, this.#onResizeHandleMove);\n };\n\n #onResizeHandleUp = (event: PointerEvent) => {\n event.preventDefault();\n const zoneEl = this.getZone();\n if (zoneEl) {\n zoneEl.classList.remove(`user-resizing`);\n }\n window.removeEventListener(`pointerup`, this.#onResizeHandleUp);\n window.removeEventListener(`pointermove`, this.#onResizeHandleMove);\n };\n\n #onResizeHandleMove = (event: PointerEvent) => {\n const bounds = this.#elementBounds;\n if (!bounds)\n return;\n\n const threshold = 5;\n\n if (this.layout === `horizontal`) {\n const y = event.y - bounds.y;\n const relativeY = clamp(y / bounds.height);\n\n if (this.collapsible && this.collapsedA) {\n if (relativeY > (this.#collapsedAPointerAtCollapse ?? 0.05) + this.#hysteresisThreshold) {\n this.collapsedA = false;\n this.#dispatchCollapsedEvent(`A`, false);\n this.#collapsedAPointerAtCollapse = undefined;\n const { sizeA, sizeB } = this.#applyConstraints(\n `${relativeY * 100}%`,\n `${(1 - relativeY) * 100}%`,\n bounds.height,\n );\n this.sizeA = sizeA;\n this.sizeB = sizeB;\n }\n } else if (this.collapsible && !this.collapsedA && relativeY < threshold / bounds.height) {\n this.collapsedA = true;\n this.#dispatchCollapsedEvent(`A`, true);\n this.sizeA = `0px`;\n this.sizeB = `100%`;\n this.#collapsedAPointerAtCollapse = relativeY;\n } else if (!this.collapsedA) {\n const { sizeA, sizeB } = this.#applyConstraints(\n `${relativeY * 100}%`,\n `${(1 - relativeY) * 100}%`,\n bounds.height,\n );\n this.sizeA = sizeA;\n this.sizeB = sizeB;\n }\n\n if (this.collapsible && this.collapsedB) {\n if (relativeY < (this.#collapsedBPointerAtCollapse ?? 0.95) - this.#hysteresisThreshold) {\n this.collapsedB = false;\n this.#dispatchCollapsedEvent(`B`, false);\n this.#collapsedBPointerAtCollapse = undefined;\n const { sizeA, sizeB } = this.#applyConstraints(\n `${relativeY * 100}%`,\n `${(1 - relativeY) * 100}%`,\n bounds.height,\n );\n this.sizeA = sizeA;\n this.sizeB = sizeB;\n }\n } else if (this.collapsible && !this.collapsedB && relativeY > (1 - threshold / bounds.height)) {\n this.collapsedB = true;\n this.#dispatchCollapsedEvent(`B`, true);\n this.sizeA = `100%`;\n this.sizeB = `0px`;\n this.#collapsedBPointerAtCollapse = relativeY;\n }\n } else {\n const x = event.x - bounds.x;\n const relativeX = clamp(x / bounds.width);\n\n if (this.collapsible && this.collapsedA) {\n if (relativeX > (this.#collapsedAPointerAtCollapse ?? 0.05) + this.#hysteresisThreshold) {\n this.collapsedA = false;\n this.#dispatchCollapsedEvent(`A`, false);\n this.#collapsedAPointerAtCollapse = undefined;\n const { sizeA, sizeB } = this.#applyConstraints(\n `${relativeX * 100}%`,\n `${(1 - relativeX) * 100}%`,\n bounds.width,\n );\n this.sizeA = sizeA;\n this.sizeB = sizeB;\n }\n } else if (this.collapsible && !this.collapsedA && relativeX < threshold / bounds.width) {\n this.collapsedA = true;\n this.#dispatchCollapsedEvent(`A`, true);\n this.sizeA = `0px`;\n this.sizeB = `100%`;\n this.#collapsedAPointerAtCollapse = relativeX;\n } else if (!this.collapsedA) {\n const { sizeA, sizeB } = this.#applyConstraints(\n `${relativeX * 100}%`,\n `${(1 - relativeX) * 100}%`,\n bounds.width,\n );\n this.sizeA = sizeA;\n this.sizeB = sizeB;\n }\n\n if (this.collapsible && this.collapsedB) {\n if (relativeX < (this.#collapsedBPointerAtCollapse ?? 0.95) - this.#hysteresisThreshold) {\n this.collapsedB = false;\n this.#dispatchCollapsedEvent(`B`, false);\n this.#collapsedBPointerAtCollapse = undefined;\n const { sizeA, sizeB } = this.#applyConstraints(\n `${relativeX * 100}%`,\n `${(1 - relativeX) * 100}%`,\n bounds.width,\n );\n this.sizeA = sizeA;\n this.sizeB = sizeB;\n }\n } else if (this.collapsible && !this.collapsedB && relativeX > (1 - threshold / bounds.width)) {\n this.collapsedB = true;\n this.#dispatchCollapsedEvent(`B`, true);\n this.sizeA = `100%`;\n this.sizeB = `0px`;\n this.#collapsedBPointerAtCollapse = relativeX;\n }\n }\n event.preventDefault();\n };\n\n #onCornerResizeDown = (event: PointerEvent) => {\n event.preventDefault();\n event.stopPropagation();\n\n const zoneEl = this.getZone();\n if (zoneEl) {\n zoneEl.classList.add(`user-resizing`);\n }\n\n this.#elementBounds = this.getBoundingClientRect();\n this.#cornerStartX = event.clientX;\n this.#cornerStartY = event.clientY;\n this.#startSizeA = this.sizeA;\n this.#startSizeB = this.sizeB;\n\n const nestedSplit = this.#getNestedSplit();\n if (nestedSplit) {\n this.#nestedSplitInitialSizeA = nestedSplit.sizeA;\n const nestedBounds = nestedSplit.getBoundingClientRect();\n const nestedHandle = nestedSplit.shadowRoot?.querySelector(`.split-bar`) as HTMLElement;\n if (nestedHandle) {\n this.#nestedSplitBounds = nestedBounds;\n this.#nestedHandleBounds = nestedHandle.getBoundingClientRect();\n }\n const nestedZoneEl = nestedSplit.getZone();\n if (nestedZoneEl) {\n nestedZoneEl.classList.add(`user-resizing`);\n }\n }\n\n window.addEventListener(`pointerup`, this.#onCornerResizeUp);\n window.addEventListener(`pointermove`, this.#onCornerResizeMove);\n };\n\n #onCornerResizeUp = (event: PointerEvent) => {\n event.preventDefault();\n const zoneEl = this.getZone();\n if (zoneEl) {\n zoneEl.classList.remove(`user-resizing`);\n }\n const nestedSplit = this.#getNestedSplit();\n if (nestedSplit) {\n const nestedZoneEl = nestedSplit.getZone();\n if (nestedZoneEl) {\n nestedZoneEl.classList.remove(`user-resizing`);\n }\n }\n window.removeEventListener(`pointerup`, this.#onCornerResizeUp);\n window.removeEventListener(`pointermove`, this.#onCornerResizeMove);\n };\n\n #applyPendingNestedUpdate() {\n if (!this.#pendingNestedUpdate)\n return;\n const { sizeA, sizeB } = this.#pendingNestedUpdate;\n const nested = this.#getNestedSplit();\n if (nested) {\n nested.sizeA = `${sizeA * 100}%`;\n nested.sizeB = `${sizeB * 100}%`;\n }\n this.#pendingNestedUpdate = null;\n }\n\n #onCornerResizeMove = (event: PointerEvent) => {\n const outerBounds = this.#elementBounds;\n const zoneEl = this.getZone();\n const nestedSplit = this.#getNestedSplit();\n if (!outerBounds || !zoneEl || !nestedSplit)\n return;\n\n const zoneBounds = zoneEl.getBoundingClientRect();\n const cursorZoneLocalX = event.clientX - zoneBounds.left;\n const cursorZoneLocalY = event.clientY - zoneBounds.top;\n\n if (this.layout === `vertical` && nestedSplit.layout === `horizontal`) {\n let newOuterFraction = cursorZoneLocalX / outerBounds.width;\n const newNestedFraction = cursorZoneLocalY / outerBounds.height;\n\n const { sizeA: constrainedA, sizeB: constrainedB } = this.#applyConstraints(\n `${newOuterFraction * 100}%`,\n `${(1 - newOuterFraction) * 100}%`,\n outerBounds.width,\n );\n newOuterFraction = this.#parseSizeAsFraction(constrainedA, outerBounds.width);\n\n this.sizeA = constrainedA;\n this.sizeB = constrainedB;\n\n this.#pendingNestedUpdate = {\n sizeA: newNestedFraction,\n sizeB: 1 - newNestedFraction,\n };\n requestAnimationFrame(() => this.#applyPendingNestedUpdate());\n\n const cornerZone = this.shadowRoot?.querySelector(`.corner-zone`) as HTMLElement | undefined;\n if (cornerZone) {\n cornerZone.style.left = `${cursorZoneLocalX - 6}px`;\n cornerZone.style.top = `${cursorZoneLocalY - 6}px`;\n }\n } else if (this.layout === `horizontal` && nestedSplit.layout === `vertical`) {\n const newNestedFraction = cursorZoneLocalX / outerBounds.width;\n let newOuterFraction = cursorZoneLocalY / outerBounds.height;\n\n const { sizeA: constrainedA, sizeB: constrainedB } = this.#applyConstraints(\n `${newOuterFraction * 100}%`,\n `${(1 - newOuterFraction) * 100}%`,\n outerBounds.height,\n );\n newOuterFraction = this.#parseSizeAsFraction(constrainedA, outerBounds.height);\n\n this.sizeA = constrainedA;\n this.sizeB = constrainedB;\n\n this.#pendingNestedUpdate = {\n sizeA: newNestedFraction,\n sizeB: 1 - newNestedFraction,\n };\n requestAnimationFrame(() => this.#applyPendingNestedUpdate());\n\n const cornerZone = this.shadowRoot?.querySelector(`.corner-zone`) as HTMLElement | undefined;\n if (cornerZone) {\n cornerZone.style.left = `${cursorZoneLocalX - 6}px`;\n cornerZone.style.top = `${cursorZoneLocalY - 6}px`;\n }\n }\n\n event.preventDefault();\n };\n\n render() {\n const sizePrefix = this.layout === `vertical` ? `width` : `height`;\n let sizeA = this.sizeA;\n let sizeB = this.sizeB;\n\n if (this.collapsedA) {\n sizeA = `0px`;\n } else if (sizeA.length === 0 && sizeB.length === 0) {\n sizeB = sizeA = `50%`;\n } else if (sizeA.length === 0) {\n sizeA = `auto`;\n } else if (sizeB.length === 0) {\n sizeB = `auto`;\n }\n\n if (this.collapsedB) {\n sizeB = `0px`;\n }\n\n sizeA = `${sizePrefix}:${sizeA}`;\n sizeB = `${sizePrefix}:${sizeB}`;\n\n return html`\n <div id=\"zone\">\n <slot style=${sizeA} name=\"a\"></slot>\n ${this._hasCorner ? html`<div class=\"corner-zone\" @pointerdown=${this.#onCornerResizeDown}></div>` : ``}\n <div @pointerdown=${this.#onResizeHandleDown} class=\"split-bar\">\n ${this.showGrabHandle\n ? html`<span\n class=\"ixfx-handle\"\n part=\"grip\"\n data-handle=\"dimpled\"\n data-shape=${this.layout === `horizontal` ? `horizontal` : `vertical`}\n ></span>`\n : ``}\n </div>\n <slot style=${sizeB} name=\"b\"></slot>\n </div>`;\n }\n\n static styles = [themeFallbacks, handleStyles, css`\n :host {\n --handle-size: 2px;\n --handle-colour: transparent;\n --handle-hover-colour: var(--surface-6);\n --handle-active-colour: var(--accent);\n /* Grip — shared handle primitive (docs/infra-handle.md). */\n --ixfx-handle-length: 16px;\n --ixfx-handle-thickness: 8px;\n\n display: block;\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n }\n * {\n box-sizing: border-box;\n }\n #zone {\n display: flex;\n height: 100%;\n position: relative;\n }\n slot {\n display: block;\n overflow: hidden;\n border: var(--border-subtle);\n border-radius: var(--radius-m);\n }\n :slotted(*) {\n width: 100%;\n height: 100%;\n }\n\n .split-bar {\n position: relative;\n background-color: var(--handle-colour);\n transition: background-color 0.3s ease 0s;\n width: var(--handle-size);\n height: 100%;\n cursor: ew-resize;\n flex-shrink: 0;\n border-radius: var(--radius-m);\n\n }\n\n @keyframes handle-hover {\n from { background-color: var(--handle-colour); }\n to { background-color: var(--handle-hover-colour); }\n }\n\n .split-bar .ixfx-handle {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n }\n\n #zone.user-resizing .ixfx-handle {\n display: none;\n }\n #zone.user-resizing {\n slot {\n opacity: 0.5;\n }\n .split-bar {\n background-color: var(--handle-active-colour);\n transition: none;\n animation: none !important;\n }\n }\n\n #zone:not(.user-resizing) .split-bar:hover {\n animation: handle-hover 0.001s ease-out 0.7s both;\n }\n\n .corner-zone {\n position: absolute;\n width: 12px;\n height: 12px;\n z-index: 10;\n border-radius: 50%;\n background: transparent;\n }\n .corner-zone:hover {\n background: transparent;\n }\n\n :host([layout='horizontal']) {\n #zone {\n flex-direction: column;\n }\n .split-bar {\n position: relative;\n background-color: var(--handle-colour);\n transition: background-color 0.3s ease 0s;\n height: var(--handle-size);\n width: 100%;\n cursor: ns-resize;\n }\n #zone.user-resizing .split-bar {\n background-color: var(--handle-active-colour);\n transition: none;\n animation: none !important;\n }\n }\n\n :host([data-collapsed-a]) slot[name=\"a\"],\n :host([data-collapsed-b]) slot[name=\"b\"] {\n display: none;\n }\n `];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ixfx-twosplit-layout\": TwoSplitLayoutElement;\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 './bottom-drawer/bottom-drawer.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 './data-table/data-table.js';\nexport * from './detail-list/detail-list.js';\nexport {\n getActiveDragPanelId,\n isDragging,\n pointerOverAnyHost,\n} from './dock/dock-drag.js';\nexport type { DockDropZone } from './dock/dock-drag.js';\nexport * from './dock/dock-host.js';\nexport * from './dock/dock-model.js';\nexport * from './dock/dock-panel.js';\nexport * from './dock/types.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 './grid-list/grid-list.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 './interaction/index.js';\nexport * from './labelled-radial-input/index.js';\nexport * from './labelled-range-input/index.js';\nexport * from './labelled-slider-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 './pan-text/index.js';\nexport * from './panel/panel-group.js';\nexport * from './panel/panel.js';\nexport * from './plots/colour-map.js';\nexport * from './plots/data.js';\nexport * from './plots/multi-axis.js';\nexport * from './plots/plot-histogram.js';\nexport * from './plots/single-axis.js';\nexport * from './plots/xy-axis.js';\nexport * from './polar-pad/polar-pad.js';\nexport * from './radial-input/radial-input.js';\nexport * from './radial-input/types.js';\nexport * from './range-input/index.js';\nexport * from './range/range-multi.js';\nexport * from './range/range.js';\nexport * from './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 './split-layout/split-model.js';\nexport * from './split-layout/split-panel.js';\nexport * from './split-layout/types.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 './titlebar/titlebar.js';\nexport * from './toolbar/toolbar-group.js';\nexport * from './toolbar/toolbar.js';\nexport * from './toolbar/types.js';\nexport * from './transitory-label/transitory-label.js';\nexport * from './tree/index.js';\nexport * from './twosplit-layout/split-layout.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}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["#collapsedDragging","#dragStartY","#dragStartHeight","#onTabPointerMove","#onTabPointerUp","#displayHeight","#onResizeMove","#onResizeEnd","#maxHeight","#setHeight","#syncCommands","#teardownCommands","#ownedRegistry","#commandTarget","#commandName","#commandIds","#morphProgress","#dragOpacity","#onDrawerKeyDown","#onResizeStart","#onResizeKeyDown","customElement","#updateComputedItems","#handleToggleChange","#handleRadioChange","customElement","#handleArrowDown","#handleArrowUp","#handleArrowRight","#handleArrowLeft","#handleEnter","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","#resizeObserver","#lastWidth","#updateStacked","#detailTimer","#handlePointerLeave","#handlePointerEnter","#select","customElement","customElement","DRAG_THRESHOLD_PX","customElement","DRAG_THRESHOLD_PX","customElement","customElement","#scaleTo100","#userMin","#userMax","#scaleFrom100","#userClamp","#updateScale","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","#elementBounds","#startSizeA","#startSizeB","#onResizeHandleUp","#onResizeHandleMove","#collapsedAPointerAtCollapse","#hysteresisThreshold","#dispatchCollapsedEvent","#applyConstraints","#collapsedBPointerAtCollapse","#cornerStartX","#cornerStartY","#getNestedSplit","#nestedSplitInitialSizeA","#nestedSplitBounds","#nestedHandleBounds","#onCornerResizeUp","#onCornerResizeMove","#parseSizeAsFraction","#pendingNestedUpdate","#applyPendingNestedUpdate","#observer","#setupNestedSplitObserver","#updateCornerPosition","#updateDataCollapsed","#checkForNestedSplit","#nestedSplit","#minSizeToFraction","#maxSizeToFraction","#parseSizeToPx","#getIntersectionPoint","#onCornerResizeDown","#onResizeHandleDown","customElement"],"sources":["../src/bottom-drawer/bottom-drawer.ts","../src/button/radio-group.ts","../src/interaction/tree-keyboard-controller.ts","../src/button/split-button.ts","../src/crumbs/crumb-path-controller.ts","../src/crumbs/crumb-path.ts","../src/data-table/data-table.ts","../src/dock/dock-drag.ts","../src/dock/dock-model.ts","../src/tabs/tab-list-item.ts","../src/dock/dock-panel.ts","../src/dock/dock-host.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/drag.ts","../src/util/near.ts","../src/range/range-multi.ts","../src/rating/rating.ts","../src/sliding-number/sliding-number.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/twosplit-layout/split-layout.ts","../src/util/checkbox.ts","../src/index.ts"],"sourcesContent":["/* eslint-disable ts/no-unsafe-declaration-merging */\n/**\n * `ixfx-bottom-drawer` — container whose `drawer` slot slides over the bottom\n * of its default-slot content. The drawer can be resized from its top edge.\n *\n * Slots\n * (default) – main content underneath the drawer\n * `drawer` – drawer body content\n * `toolbar` – header toolbar items, forwarded into the `ixfx-titlebar` toolbar\n *\n * Properties\n * `open` – whether the drawer is visible (default: false)\n * `height` – drawer height in px (default: 320)\n * `min-height` – minimum height before fade-out (default: 160)\n * `dismiss-threshold` – drag below this height closes the drawer (default: 96)\n * `max-height-ratio` – max height as a fraction of host height (default: 0.85)\n * `label` – header title and accessible label (default: `Drawer`)\n * `icon-name` – header icon (default: ``)\n * `closable` – show the header close button (default: true)\n * `collapsible` – show the expand/collapse caret that toggles `open` (default: true)\n * `maintain-handle` – keep a drag handle docked to the bottom when\n * collapsed so users can drag up to reopen. Dragging the drawer down\n * gradually morphs it into the handle (default: false)\n * `name` – command namespace. When set, `expand`/`collapse`/`toggle`\n * commands are registered as `<name>.expand` etc. (default: `` = no commands)\n * `registry` – `@clinth/ui-commands` registry carrying this drawer's\n * commands. Created automatically; assign a shared registry to trigger\n * named drawers globally (default: owned registry)\n *\n * The header is an `ixfx-titlebar`. Theme variables (e.g. `--surface-4`,\n * `--accent`) set on the drawer inherit into the header, and `toolbar`-slotted\n * content stays in the consumer's light DOM so it can be styled directly.\n *\n * Commands (require `name`; see {@link bottomDrawerCommandId})\n * `<name>.expand` – open the drawer (`show()`)\n * `<name>.collapse` – close the drawer (`close()`, fires `drawer-close`)\n * `<name>.toggle` – open if closed, close if open\n *\n * ```typescript\n * drawer.registry?.invoke('inspector.expand');\n * ```\n *\n * Events\n * `drawer-close` – CustomEvent<void>, bubbles + composed\n * `drawer-resize` – CustomEvent { detail: { height: number } }, bubbles + composed\n *\n * CSS variables\n * `--bottom-drawer-background` – drawer fill\n * `--bottom-drawer-border` – drawer border\n * `--bottom-drawer-radius` – top corner radius\n * `--bottom-drawer-blur` – backdrop blur amount\n * `--bottom-drawer-shadow` – drawer drop shadow\n * `--ixfx-handle-*` – resize-grip look (shared handle primitive; see\n * docs/infra-handle.md)\n * `--bottom-drawer-collapsed-width` – width of the floating pill shown\n * when collapsed with `maintain-handle` (default: 96px)\n * `--bottom-drawer-title-background` – header fill (default: transparent,\n * so the header shares the drawer's translucency)\n */\nimport type { CommandRegistry } from '@clinth/ui-commands';\nimport type { PropertyValues } from 'lit';\nimport type { TitlebarCloseEvent, TitlebarToggleEvent } from '../titlebar/titlebar.js';\nimport { createCommandRegistry } from '@clinth/ui-commands';\nimport { css, html, LitElement } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { handleStyles } from '../styles/handle.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport '../titlebar/titlebar.js';\n\nexport type BottomDrawerResizeDetail = {\n readonly height: number;\n};\n\nexport type BottomDrawerResizeEvent = CustomEvent<BottomDrawerResizeDetail>;\nexport type BottomDrawerCloseEvent = CustomEvent<void>;\n\nexport interface BottomDrawerElementEventMap {\n 'drawer-close': BottomDrawerCloseEvent;\n 'drawer-resize': BottomDrawerResizeEvent;\n}\n\n/** Commands a named drawer registers, namespaced as `<name>.<command>`. */\nexport type BottomDrawerCommand = `expand` | `collapse` | `toggle`;\n\n/** Builds the command id for a named drawer's command, e.g. `inspector.expand`. */\nexport function bottomDrawerCommandId(name: string, command: BottomDrawerCommand): string {\n return `${name.trim()}.${command}`;\n}\n\nfunction clampRange(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n\n@customElement(`ixfx-bottom-drawer`)\nexport class BottomDrawerElement extends LitElement {\n static override styles = [themeFallbacks, handleStyles, css`\n :host {\n --bottom-drawer-background: color-mix(in srgb, var(--surface-2) 84%, transparent);\n --bottom-drawer-border: 1px solid color-mix(in srgb, var(--surface-2-text) 14%, transparent);\n --bottom-drawer-radius: var(--radius-l);\n --bottom-drawer-blur: 18px;\n --bottom-drawer-shadow: var(--shadow-l);\n --bottom-drawer-collapsed-width: 96px;\n\n display: block;\n position: relative;\n height: 100%;\n min-width: 0;\n min-height: 0;\n overflow: hidden;\n }\n .content {\n position: absolute;\n inset: 0;\n min-width: 0;\n min-height: 0;\n }\n .content ::slotted(*) {\n width: 100%;\n height: 100%;\n }\n .drawer {\n --m: 0;\n position: absolute;\n z-index: 2;\n right: calc(var(--m) * (50% - var(--bottom-drawer-collapsed-width) / 2));\n bottom: 0;\n left: calc(var(--m) * (50% - var(--bottom-drawer-collapsed-width) / 2));\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n height: var(--bottom-drawer-height);\n max-height: 100%;\n min-height: 0;\n color: var(--surface-2-text);\n background: var(--bottom-drawer-background);\n border: var(--bottom-drawer-border);\n border-bottom: 0;\n border-radius: var(--bottom-drawer-radius) var(--bottom-drawer-radius) 0 0;\n box-shadow: var(--bottom-drawer-shadow);\n backdrop-filter: blur(var(--bottom-drawer-blur)) saturate(1.15);\n -webkit-backdrop-filter: blur(var(--bottom-drawer-blur)) saturate(1.15);\n opacity: 0;\n transform: translateY(100%);\n visibility: hidden;\n transition:\n transform var(--transition),\n opacity var(--transition),\n left var(--transition),\n right var(--transition),\n height var(--transition),\n visibility 0s linear 0.16s;\n will-change: transform, opacity;\n }\n :host([open]) .drawer {\n opacity: var(--bottom-drawer-opacity, 1);\n transform: translateY(0);\n visibility: visible;\n transition:\n transform var(--transition),\n opacity var(--transition),\n left var(--transition),\n right var(--transition),\n height var(--transition);\n }\n :host([resizing]) {\n cursor: ns-resize;\n user-select: none;\n }\n :host([resizing]) .drawer {\n transition: none;\n }\n .resize-edge {\n position: absolute;\n z-index: 1;\n top: -5px;\n right: 0;\n left: 0;\n height: 11px;\n cursor: ns-resize;\n touch-action: none;\n outline: none;\n }\n .resize-edge .ixfx-handle {\n position: absolute;\n top: 7px;\n left: 50%;\n transform: translateX(-50%);\n --ixfx-handle-length: 44px;\n --ixfx-handle-thickness: 3px;\n --ixfx-handle-radius: 999px;\n }\n /* Inner content fades as the drawer morphs into its collapsed tab. */\n ixfx-titlebar,\n .body {\n opacity: calc(1 - var(--m, 0));\n transition: opacity var(--transition);\n }\n :host([resizing]) ixfx-titlebar,\n :host([resizing]) .body {\n transition: none;\n }\n /* Collapsed tab: docked to the bottom edge, narrowed to handle width. */\n :host([maintain-handle]:not([open])) .drawer {\n --m: 1;\n height: 20px;\n opacity: 1;\n transform: translateY(0);\n visibility: visible;\n transition:\n transform var(--transition),\n opacity var(--transition),\n left var(--transition),\n right var(--transition),\n height var(--transition);\n }\n :host([maintain-handle]:not([open])) ixfx-titlebar,\n :host([maintain-handle]:not([open])) .body {\n display: none;\n }\n :host([maintain-handle]:not([open])) .resize-edge {\n top: 0;\n height: 100%;\n }\n :host([maintain-handle]:not([open])) .resize-edge .ixfx-handle {\n top: 50%;\n transform: translate(-50%, -50%);\n }\n ixfx-titlebar {\n flex: none;\n --titlebar-background: var(--bottom-drawer-title-background, transparent);\n border-bottom: 1px solid color-mix(in srgb, var(--surface-2-text) 10%, transparent);\n }\n .body {\n flex: 1;\n min-height: 0;\n overflow: auto;\n overscroll-behavior: contain;\n }\n .body ::slotted(*) {\n box-sizing: border-box;\n }\n @media (prefers-reduced-motion: reduce) {\n .drawer,\n ixfx-titlebar,\n .body {\n transition-duration: 0s;\n }\n }\n `];\n\n @property({ type: Boolean, reflect: true })\n open = false;\n\n @property({ type: Number })\n height = 320;\n\n @property({ type: Number, attribute: `min-height` })\n minHeight = 160;\n\n @property({ type: Number, attribute: `dismiss-threshold` })\n dismissThreshold = 96;\n\n @property({ type: Number, attribute: `max-height-ratio` })\n maxHeightRatio = 0.85;\n\n @property({ type: String })\n label = `Drawer`;\n\n @property({ type: String, attribute: `icon-name` })\n iconName = ``;\n\n @property({ type: Boolean })\n closable = true;\n\n @property({ type: Boolean })\n collapsible = true;\n\n @property({ type: Boolean, attribute: `maintain-handle`, reflect: true })\n maintainHandle = false;\n\n @property({ type: String })\n name = ``;\n\n @property({ attribute: false })\n registry: CommandRegistry<unknown> | undefined;\n\n @state() private _dragHeight: number | undefined;\n\n #dragStartY = 0;\n #dragStartHeight = 0;\n #collapsedDragging = false;\n #ownedRegistry: CommandRegistry<unknown> | undefined;\n #commandTarget: CommandRegistry<unknown> | undefined;\n #commandName = ``;\n #commandIds: string[] = [];\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.#syncCommands();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.#teardownCommands();\n if (this.#ownedRegistry !== undefined) {\n if (this.registry === this.#ownedRegistry)\n this.registry = undefined;\n this.#ownedRegistry = undefined;\n }\n }\n\n protected override updated(changed: PropertyValues): void {\n super.updated(changed);\n if (changed.has(`name`) || changed.has(`registry`))\n this.#syncCommands();\n }\n\n show(): void {\n this.open = true;\n }\n\n close(): void {\n if (!this.open)\n return;\n this.open = false;\n this.dispatchEvent(new CustomEvent<void>(`drawer-close`, { bubbles: true, composed: true }));\n }\n\n toggle(): void {\n if (this.open)\n this.close();\n else\n this.show();\n }\n\n #syncCommands(): void {\n const name = this.name.trim();\n const target = this.registry ?? this.#ownedRegistry;\n if (name !== `` && this.isConnected && target !== undefined\n && this.#commandTarget === target && this.#commandName === name) {\n return;\n }\n this.#teardownCommands();\n if (name === `` || !this.isConnected)\n return;\n const resolved = this.registry ?? (this.#ownedRegistry ??= createCommandRegistry());\n if (this.#ownedRegistry !== undefined && resolved !== this.#ownedRegistry)\n this.#ownedRegistry = undefined;\n if (this.registry === undefined)\n this.registry = resolved;\n const registered: string[] = [];\n const commands: Array<{ command: BottomDrawerCommand; label: string; description: string; execute: () => void }> = [\n { command: `expand`, label: `Expand ${this.label}`, description: `Open the ${this.label} drawer`, execute: () => this.show() },\n { command: `collapse`, label: `Collapse ${this.label}`, description: `Close the ${this.label} drawer`, execute: () => this.close() },\n { command: `toggle`, label: `Toggle ${this.label}`, description: `Open the ${this.label} drawer if closed, close it if open`, execute: () => this.toggle() },\n ];\n for (const { command, label, description, execute } of commands) {\n const id = bottomDrawerCommandId(name, command);\n if (resolved.has(id))\n continue;\n resolved.register({ id, label, description, execute });\n registered.push(id);\n }\n this.#commandTarget = resolved;\n this.#commandName = name;\n this.#commandIds = registered;\n }\n\n #teardownCommands(): void {\n if (this.#commandTarget !== undefined) {\n for (const id of this.#commandIds)\n this.#commandTarget.unregister(id);\n this.#commandTarget = undefined;\n this.#commandName = ``;\n this.#commandIds = [];\n }\n }\n\n private _onTitlebarToggle(event: TitlebarToggleEvent): void {\n event.stopPropagation();\n if (event.detail.collapsed)\n this.close();\n else\n this.open = true;\n }\n\n private _onTitlebarClose(event: TitlebarCloseEvent): void {\n event.stopPropagation();\n this.close();\n }\n\n protected override render(): ReturnType<typeof html> {\n const raw = this.#displayHeight();\n const max = this.#maxHeight();\n const morph = this.#morphProgress(raw);\n const height = this.open ? raw * (1 - morph) + 20 * morph : 20;\n const opacity = this.maintainHandle && this.open ? 1 : this.#dragOpacity(raw);\n return html`\n <div class=\"content\"><slot></slot></div>\n <section\n class=\"drawer\"\n style=${`--bottom-drawer-height: ${height}px; --bottom-drawer-opacity: ${opacity}; --m: ${morph}`}\n role=\"region\"\n aria-label=${this.label}\n @keydown=${this.#onDrawerKeyDown}\n >\n <div\n class=\"resize-edge\"\n role=\"separator\"\n tabindex=\"0\"\n aria-label=${`${this.open ? `Resize` : `Expand`} ${this.label}`}\n aria-orientation=\"horizontal\"\n aria-valuemin=${this.minHeight}\n aria-valuemax=${max}\n aria-valuenow=${Math.round(raw)}\n @pointerdown=${this.#onResizeStart}\n @keydown=${this.#onResizeKeyDown}\n ><span class=\"ixfx-handle\" data-handle=\"dimpled\" data-shape=\"horizontal\" part=\"handle\"></span></div>\n <ixfx-titlebar\n .title=${this.label}\n .iconName=${this.iconName}\n .closable=${this.closable}\n .collapsible=${this.collapsible}\n .collapsed=${!this.open}\n ?inert=${!this.open}\n @toggle=${this._onTitlebarToggle}\n @close=${this._onTitlebarClose}\n >\n <slot name=\"toolbar\" slot=\"toolbar\"></slot>\n </ixfx-titlebar>\n <div class=\"body\" ?inert=${!this.open}><slot name=\"drawer\"></slot></div>\n </section>\n `;\n }\n\n #maxHeight(): number {\n const availableHeight = this.clientHeight || this.height;\n return Math.max(this.minHeight, availableHeight * clampRange(this.maxHeightRatio, 0, 1));\n }\n\n #displayHeight(): number {\n return clampRange(this._dragHeight ?? this.height, 0, this.#maxHeight());\n }\n\n #dragOpacity(height: number): number {\n if (this._dragHeight === undefined || height >= this.minHeight)\n return 1;\n const fadeRange = this.minHeight - this.dismissThreshold;\n if (fadeRange <= 0)\n return height >= this.dismissThreshold ? 1 : 0;\n return clampRange((height - this.dismissThreshold) / fadeRange, 0, 1);\n }\n\n #morphProgress(raw: number): number {\n if (!this.open)\n return this.maintainHandle ? 1 : 0;\n if (this._dragHeight === undefined || !this.maintainHandle)\n return 0;\n const range = this.minHeight - this.dismissThreshold;\n if (range <= 0)\n return raw < this.dismissThreshold ? 1 : 0;\n return clampRange((this.minHeight - raw) / range, 0, 1);\n }\n\n #setHeight(height: number): void {\n this.height = clampRange(height, this.minHeight, this.#maxHeight());\n this.dispatchEvent(new CustomEvent<BottomDrawerResizeDetail>(`drawer-resize`, {\n detail: { height: this.height },\n bubbles: true,\n composed: true,\n }));\n }\n\n #onResizeStart = (event: PointerEvent): void => {\n if (event.button !== 0)\n return;\n event.preventDefault();\n const edge = event.currentTarget as HTMLElement;\n edge.setPointerCapture(event.pointerId);\n if (!this.open) {\n this.#collapsedDragging = false;\n this.#dragStartY = event.clientY;\n this.#dragStartHeight = this.dismissThreshold;\n edge.addEventListener(`pointermove`, this.#onTabPointerMove);\n edge.addEventListener(`pointerup`, this.#onTabPointerUp, { once: true });\n edge.addEventListener(`pointercancel`, this.#onTabPointerUp, { once: true });\n return;\n }\n this.#dragStartY = event.clientY;\n this.#dragStartHeight = this.#displayHeight();\n this._dragHeight = this.#dragStartHeight;\n this.toggleAttribute(`resizing`, true);\n edge.addEventListener(`pointermove`, this.#onResizeMove);\n edge.addEventListener(`pointerup`, this.#onResizeEnd, { once: true });\n edge.addEventListener(`pointercancel`, this.#onResizeEnd, { once: true });\n };\n\n #onResizeMove = (event: PointerEvent): void => {\n this._dragHeight = clampRange(this.#dragStartHeight + this.#dragStartY - event.clientY, 0, this.#maxHeight());\n };\n\n #onResizeEnd = (event: PointerEvent): void => {\n const edge = event.currentTarget as HTMLElement;\n edge.removeEventListener(`pointermove`, this.#onResizeMove);\n edge.removeEventListener(`pointerup`, this.#onResizeEnd);\n edge.removeEventListener(`pointercancel`, this.#onResizeEnd);\n if (edge.hasPointerCapture(event.pointerId))\n edge.releasePointerCapture(event.pointerId);\n this.toggleAttribute(`resizing`, false);\n const height = this._dragHeight ?? this.height;\n this._dragHeight = undefined;\n if (height < this.dismissThreshold) {\n this.close();\n return;\n }\n this.#setHeight(height);\n };\n\n #onResizeKeyDown = (event: KeyboardEvent): void => {\n if (!this.open) {\n if (event.key === `ArrowUp` || event.key === `Enter` || event.key === ` ` || event.key === `Home` || event.key === `End`) {\n event.preventDefault();\n this.show();\n }\n return;\n }\n const delta = event.shiftKey ? 64 : 16;\n if (event.key === `ArrowUp`) {\n event.preventDefault();\n this.#setHeight(this.height + delta);\n } else if (event.key === `ArrowDown`) {\n event.preventDefault();\n if (this.height - delta < this.dismissThreshold)\n this.close();\n else\n this.#setHeight(this.height - delta);\n } else if (event.key === `Home`) {\n event.preventDefault();\n this.#setHeight(this.minHeight);\n } else if (event.key === `End`) {\n event.preventDefault();\n this.#setHeight(this.#maxHeight());\n }\n };\n\n #onTabPointerMove = (event: PointerEvent): void => {\n const delta = this.#dragStartY - event.clientY;\n if (!this.#collapsedDragging) {\n if (delta < 4)\n return;\n this.#collapsedDragging = true;\n this.show();\n this.toggleAttribute(`resizing`, true);\n }\n this._dragHeight = clampRange(this.#dragStartHeight + this.#dragStartY - event.clientY, 0, this.#maxHeight());\n };\n\n #onTabPointerUp = (event: PointerEvent): void => {\n const target = event.currentTarget as HTMLElement;\n target.removeEventListener(`pointermove`, this.#onTabPointerMove);\n target.removeEventListener(`pointerup`, this.#onTabPointerUp);\n target.removeEventListener(`pointercancel`, this.#onTabPointerUp);\n if (target.hasPointerCapture(event.pointerId))\n target.releasePointerCapture(event.pointerId);\n if (!this.#collapsedDragging) {\n this.show();\n return;\n }\n this.#collapsedDragging = false;\n this.toggleAttribute(`resizing`, false);\n const height = this._dragHeight ?? this.height;\n this._dragHeight = undefined;\n if (height < this.dismissThreshold) {\n this.close();\n return;\n }\n this.#setHeight(height);\n };\n\n #onDrawerKeyDown = (event: KeyboardEvent): void => {\n if (event.key !== `Escape`)\n return;\n event.preventDefault();\n event.stopPropagation();\n this.close();\n };\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-bottom-drawer': BottomDrawerElement;\n }\n}\n\nexport interface BottomDrawerElement {\n addEventListener: (<K extends keyof BottomDrawerElementEventMap>(\n type: K,\n listener: (this: BottomDrawerElement, event: BottomDrawerElementEventMap[K]) => void,\n options?: boolean | AddEventListenerOptions,\n ) => void) & ((\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ) => void);\n}\n","import type { PropertyValues } from 'lit';\nimport { css, html, LitElement } from 'lit';\nimport { property, query, state } from 'lit/decorators.js';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { prominenceStyles } from '../styles/prominence.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport '../icons/icon.js';\n\nexport type RadioGroupMode = `compact` | `max`;\n\nexport type RadioItem = Readonly<{\n value: string;\n label: string;\n disabled?: boolean;\n iconName?: string;\n iconNameOff?: string;\n}>;\n\n@customElement(`ixfx-radio-group`)\nexport class RadioGroup extends LitElement {\n @property({ type: String }) value = ``;\n @property({ type: String }) orientation: `horizontal` | `vertical` = `horizontal`;\n @property({ type: Array }) items: RadioItem[] = [];\n @property({ type: String }) name = ``;\n @property({ type: String }) mode: RadioGroupMode = `compact`;\n @property({ type: Boolean }) checked = false;\n @property({ type: String, attribute: `value-off` }) valueOff = ``;\n @property({ type: String, attribute: `icon-name` }) iconName = ``;\n @property({ type: String, attribute: `icon-name-off` }) iconNameOff = ``;\n @property({ type: Boolean, attribute: `hide-labels` }) hideLabels = false;\n\n @state() private _computedItems: RadioItem[] = [];\n @state() private _icons: Map<string, string> = new Map();\n @query(`slot`) private _slot?: HTMLSlotElement;\n\n private get _isSingleToggle(): boolean {\n return this._computedItems.length === 0 && Boolean(this.textContent?.trim());\n }\n\n private get _singleToggleIconName(): string | null {\n if (!this.iconName && !this.iconNameOff)\n return null;\n return this.checked ? this.iconName : (this.iconNameOff || this.iconName);\n }\n\n protected override firstUpdated(): void {\n this.#updateComputedItems();\n }\n\n protected override updated(changedProperties: PropertyValues): void {\n if (changedProperties.has(`checked`)) {\n const input = this.shadowRoot?.querySelector(`.radio-toggle-input`) as HTMLInputElement | undefined;\n if (input && input.checked !== this.checked) {\n input.checked = this.checked;\n const newValue = this.checked\n ? (this.value || `on`)\n : (this.valueOff || undefined);\n\n this.dispatchEvent(new CustomEvent<RadioGroupChangeDetail>(`change`, {\n detail: { checked: this.checked, value: newValue },\n bubbles: true,\n composed: true,\n }));\n }\n }\n\n if (changedProperties.has(`value`) && !this._isSingleToggle) {\n const inputs = this.shadowRoot?.querySelectorAll(`.radio-input`) as NodeListOf<HTMLInputElement>;\n if (inputs) {\n for (const input of inputs) {\n if (input.checked !== (input.value === this.value)) {\n input.checked = input.value === this.value;\n }\n }\n }\n }\n }\n\n #updateComputedItems(): void {\n const options = this.querySelectorAll(`option`);\n const icons = new Map<string, string>();\n\n if (options.length > 0) {\n this._computedItems = Array.from(options, (el) => {\n const tempDiv = document.createElement(`div`);\n tempDiv.innerHTML = el.innerHTML;\n const iconEl = tempDiv.querySelector(`svg`);\n if (iconEl) {\n icons.set(el.getAttribute(`value`) || ``, iconEl.outerHTML);\n }\n return {\n value: el.getAttribute(`value`) || ``,\n label: el.textContent?.trim() || ``,\n disabled: el.hasAttribute(`disabled`),\n iconName: el.getAttribute(`icon-name`) || undefined,\n iconNameOff: el.getAttribute(`icon-name-off`) || undefined,\n };\n });\n this._icons = icons;\n } else {\n this._computedItems = [...this.items];\n }\n }\n\n // #handleItemClick(item: RadioItem): void {\n // if (item.disabled || item.value === this.value)\n // return;\n\n // this.value = item.value;\n // this.dispatchEvent(new CustomEvent<RadioGroupChangeDetail>(`change`, {\n // detail: { checked: true, value: item.value },\n // bubbles: true,\n // composed: true,\n // }));\n // }\n\n #handleRadioChange(e: Event): void {\n e.stopImmediatePropagation();\n const input = e.target as HTMLInputElement;\n this.value = input.value;\n this.dispatchEvent(new CustomEvent<RadioGroupChangeDetail>(`change`, {\n detail: { checked: true, value: input.value },\n bubbles: true,\n composed: true,\n }));\n }\n\n #handleToggleChange(e: Event): void {\n e.stopImmediatePropagation();\n const input = e.target as HTMLInputElement;\n this.checked = input.checked;\n const newValue = this.checked\n ? (this.value || `on`)\n : (this.valueOff || undefined);\n\n this.dispatchEvent(new CustomEvent<RadioGroupChangeDetail>(`change`, {\n detail: { checked: this.checked, value: newValue },\n bubbles: true,\n composed: true,\n }));\n }\n\n #renderIcon(item: RadioItem): ReturnType<typeof html> | null {\n const isSelected = item.value === this.value;\n const iconName = isSelected ? (item.iconName || null) : (item.iconNameOff || item.iconName || null);\n if (iconName) {\n return html`<ixfx-icon class=\"radio-icon\" name=\"${iconName}\"></ixfx-icon>`;\n }\n const iconHtml = this._icons.get(item.value);\n if (!iconHtml)\n return null;\n return html`<span class=\"radio-icon\">${unsafeHTML(iconHtml)}</span>`;\n }\n\n protected override render(): unknown {\n if (this._isSingleToggle) {\n const iconName = this._singleToggleIconName;\n const showIcon = iconName || this.hideLabels;\n const iconPart = showIcon\n ? html`<ixfx-icon class=\"radio-icon\" name=\"${iconName || `check`}\"></ixfx-icon>`\n : null;\n const labelPart = !this.hideLabels\n ? html`<span class=\"radio-label\" data-text=\"${this.textContent?.trim()}\">${this.textContent?.trim()}</span>`\n : null;\n return html`\n <label class=\"radio-item ${this.checked ? `selected` : ``}\">\n <input\n type=\"checkbox\"\n class=\"radio-toggle-input\"\n ?checked=${this.checked}\n @change=${this.#handleToggleChange}\n />\n ${iconPart}\n ${labelPart}\n </label>\n `;\n }\n\n return html`\n <slot @slotchange=${this.#updateComputedItems} style=\"display: none;\"></slot>\n <div class=\"radio-group ${this.orientation} ${this.mode}\" role=\"radiogroup\" aria-label=${this.name}>\n ${this._computedItems.map((item) => {\n const isSelected = item.value === this.value;\n const iconName = isSelected\n ? (item.iconName || null)\n : (item.iconNameOff || item.iconName || null);\n const showIcon = iconName || this.hideLabels;\n const iconPart = showIcon\n ? html`<ixfx-icon class=\"radio-icon\" name=\"${iconName || `check`}\"></ixfx-icon>`\n : null;\n const labelPart = !this.hideLabels\n ? html`<span class=\"radio-label\" data-text=\"${item.label}\">${item.label}</span>`\n : null;\n return html`\n <label class=\"radio-item ${item.value === this.value ? `selected` : ``}\" ?disabled=${item.disabled}>\n <input\n type=\"radio\"\n class=\"radio-input\"\n name=${this.name}\n value=${item.value}\n ?disabled=${item.disabled}\n ?checked=${item.value === this.value}\n @change=${this.#handleRadioChange}\n />\n ${iconPart}\n ${labelPart}\n </label>\n `;\n })}\n </div>\n `;\n }\n\n static override styles = [themeFallbacks, prominenceStyles, css`\n :host {\n display: inline-flex;\n min-width: min-content;\n box-sizing: border-box;\n /* Default to looking like a cohesive control group */\n background: var(--surface-4, transparent);\n background: oklch(from var(--surface-4) l calc(c*0.2) h / 0.4);\n\n border: var(--border, none);\n border-radius: var(--radius-xl, 8px);\n }\n\n * {\n box-sizing: border-box;\n }\n\n .radio-toggle-input {\n position: absolute;\n opacity: 0;\n width: 0;\n height: 0;\n pointer-events: none;\n }\n\n .radio-input {\n position: absolute;\n opacity: 0;\n width: 0;\n height: 0;\n pointer-events: none;\n }\n\n .radio-group {\n display: flex;\n width: 100%;\n height: 100%;\n gap: var(--item-spacing, 0);\n overflow: hidden;\n border-radius: inherit;\n justify-content: center;\n }\n\n .radio-group.horizontal {\n flex-direction: row;\n }\n\n .radio-group.vertical {\n flex-direction: column;\n }\n\n .radio-group.max.horizontal .radio-item {\n flex: 1;\n justify-content: center;\n }\n\n .radio-group.max.vertical .radio-item {\n flex: 1;\n justify-content: flex-start;\n }\n\n .radio-item {\n display: inline-flex;\n align-items: center;\n justify-content: flex-start;\n gap: var(--icon-label-spacing, 0.5rem);\n padding: var(--space-m, 0.5rem) var(--space-l, 1rem);\n border: none;\n background: transparent;\n color: var(--color-fg-fade, var(--surface-muted-text));\n font-family: inherit;\n font-size: var(--text-m, inherit);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n cursor: pointer;\n transition: all var(--transition, 0.1s) ease;\n user-select: none;\n white-space: nowrap;\n }\n\n .radio-item:hover:not([disabled]) {\n opacity: 0.9;\n background: color-mix(in oklch, var(--surface-4) 80%, transparent);\n 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 { ReactiveController, ReactiveControllerHost } from 'lit';\nimport type { TickledController, TickledItem } from './tickled-controller.js';\n\nexport type TreeKeyboardNavItemId = string;\n\nexport type TreeKeyboardNavCallbacks = {\n getItems: () => ReadonlyArray<TickledItem<TreeKeyboardNavItemId>>;\n onExpand: (id: TreeKeyboardNavItemId) => void;\n onCollapse: (id: TreeKeyboardNavItemId) => void;\n onActivate: (id: TreeKeyboardNavItemId) => void;\n onSelect?: (id: TreeKeyboardNavItemId) => void;\n onEscape?: () => void;\n isLeaf: (id: TreeKeyboardNavItemId) => boolean;\n isExpanded: (id: TreeKeyboardNavItemId) => boolean;\n getParentId?: (id: TreeKeyboardNavItemId) => TreeKeyboardNavItemId | undefined;\n};\n\nexport type TreeKeyboardNavControllerConfig = {\n callbacks: TreeKeyboardNavCallbacks;\n disableKeyboardNavigation?: () => boolean;\n};\n\nexport class TreeKeyboardNavController implements ReactiveController {\n private host: ReactiveControllerHost;\n private tickled: TickledController<TreeKeyboardNavItemId>;\n private callbacks: TreeKeyboardNavCallbacks;\n private disableKeyboardNavigation: () => boolean;\n\n constructor(host: ReactiveControllerHost, tickled: TickledController<TreeKeyboardNavItemId>, config: TreeKeyboardNavControllerConfig) {\n this.host = host;\n this.tickled = tickled;\n this.callbacks = config.callbacks;\n this.disableKeyboardNavigation = config.disableKeyboardNavigation ?? (() => false);\n host.addController(this);\n }\n\n hostConnected(): void {}\n\n hostDisconnected(): void {}\n\n handleKeyDown = (event: KeyboardEvent): void => {\n if (this.disableKeyboardNavigation()) {\n return;\n }\n\n const { key } = event;\n\n if ([`ArrowDown`, `ArrowUp`, `ArrowLeft`, `ArrowRight`, `Enter`, `Escape`].includes(key)) {\n this.tickled.setInputMode(`keyboard`);\n }\n\n switch (key) {\n case `ArrowDown`:\n event.preventDefault();\n this.#handleArrowDown();\n break;\n case `ArrowUp`:\n event.preventDefault();\n this.#handleArrowUp();\n break;\n case `ArrowRight`:\n event.preventDefault();\n this.#handleArrowRight();\n break;\n case `ArrowLeft`:\n event.preventDefault();\n this.#handleArrowLeft();\n break;\n case `Enter`:\n event.preventDefault();\n this.#handleEnter();\n break;\n case `Escape`:\n event.preventDefault();\n this.callbacks.onEscape?.();\n break;\n }\n };\n\n #handleArrowDown(): void {\n this.tickled.handleKeyboardNavigation(`next`);\n }\n\n #handleArrowUp(): void {\n this.tickled.handleKeyboardNavigation(`previous`);\n }\n\n #handleArrowRight(): void {\n const currentId = this.tickled.tickledId;\n if (!currentId)\n return;\n\n if (this.callbacks.isLeaf(currentId)) {\n return;\n }\n\n if (!this.callbacks.isExpanded(currentId)) {\n this.callbacks.onExpand(currentId);\n this.tickled.setTickled(currentId);\n } else {\n const items = this.callbacks.getItems();\n const currentIdx = items.findIndex(item => item.id === currentId);\n if (currentIdx !== -1 && currentIdx + 1 < items.length) {\n const nextItem = items[currentIdx + 1];\n if (nextItem.enabled !== false) {\n this.tickled.setTickled(nextItem.id);\n }\n }\n }\n }\n\n #handleArrowLeft(): void {\n const currentId = this.tickled.tickledId;\n if (!currentId)\n return;\n\n if (this.callbacks.isLeaf(currentId)) {\n const parentId = this.callbacks.getParentId?.(currentId);\n if (parentId) {\n this.tickled.setTickled(parentId);\n if (this.callbacks.isExpanded(parentId)) {\n this.callbacks.onCollapse(parentId);\n }\n }\n } else if (this.callbacks.isExpanded(currentId)) {\n this.callbacks.onCollapse(currentId);\n } else {\n const parentId = this.callbacks.getParentId?.(currentId);\n if (parentId) {\n this.tickled.setTickled(parentId);\n }\n }\n }\n\n #handleEnter(): void {\n const currentId = this.tickled.tickledId;\n if (!currentId)\n return;\n\n this.callbacks.onActivate(currentId);\n this.callbacks.onSelect?.(currentId);\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","/* eslint-disable ts/no-unsafe-declaration-merging */\nimport type { PropertyValues, TemplateResult } from 'lit';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { TickledController, tickledItemStyles, tickledStyles } from '../interaction/index.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\n\nexport type DataTableRow = {\n label: string;\n value: string | number | boolean | Node | TemplateResult;\n fullWidth?: boolean;\n detail?: string | TemplateResult;\n id?: string;\n};\n\nexport type DataTableRowClickDetail = {\n readonly row: DataTableRow;\n readonly index: number;\n readonly selected: boolean;\n};\n\nexport type DataTableRowClickEvent = CustomEvent<DataTableRowClickDetail>;\n\nexport interface DataTableElementEventMap {\n 'data-table-row-click': DataTableRowClickEvent;\n}\n\n@customElement(`ixfx-data-table`)\nexport class DataTableElement extends LitElement {\n static override styles = [\n tickledStyles,\n tickledItemStyles,\n css`\n :host {\n display: block;\n container-type: inline-size;\n }\n\n .properties {\n display: grid;\n grid-template-columns: var(--data-table-name-width, max-content)\n var(--data-table-value-width, minmax(0, 1fr));\n /* No column gap: the tickled highlight reads as one solid block.\n Separation comes from cell padding, which the highlight covers. */\n gap: 2px 0;\n }\n\n /* Widening: 2 then 3 property-pairs per row on roomy containers.\n Suppressed when stacked, or when locked to 'columns'. */\n @container (min-width: 650px) {\n :host(:not([layout='columns'])) .properties:not(.stacked) {\n grid-template-columns:\n var(--data-table-name-width, max-content) var(--data-table-value-width, minmax(0, 1fr))\n var(--data-table-name-width, max-content) var(--data-table-value-width, minmax(0, 1fr));\n }\n }\n\n @container (min-width: 1000px) {\n :host(:not([layout='columns'])) .properties:not(.stacked) {\n grid-template-columns:\n var(--data-table-name-width, max-content) var(--data-table-value-width, minmax(0, 1fr))\n var(--data-table-name-width, max-content) var(--data-table-value-width, minmax(0, 1fr))\n var(--data-table-name-width, max-content) var(--data-table-value-width, minmax(0, 1fr));\n }\n }\n\n /* Stacked (key above value). Threshold is JS-driven via 'narrowBreakpoint'.\n minmax(0, 1fr) — not 1fr — so a long value's min-content size can't\n blow the column out past the container; the value then ellipsises. */\n .properties.stacked {\n grid-template-columns: minmax(0, 1fr);\n }\n\n /* A pair is its own subgrid so the whole row is one element:\n the tickled highlight can't split, and key/value share a baseline. */\n .pair {\n display: grid;\n grid-column: span 2;\n grid-template-columns: subgrid;\n align-items: var(--data-table-cell-align, baseline);\n cursor: pointer;\n }\n\n .pair[data-full] {\n grid-column: 1 / -1;\n }\n\n .pair[data-full] > .value {\n grid-column: 2 / -1;\n }\n\n .properties.stacked .pair {\n display: block;\n grid-column: 1 / -1;\n /* Let the block shrink below its content so .value-text can clip. */\n min-width: 0;\n }\n\n .properties.stacked .pair:not(:last-child) {\n margin-bottom: var(--space-s);\n }\n\n /* Stacked keys get their own line, so a long label must wrap rather than\n run off the edge (nowrap is only wanted for the max-content column). */\n .properties.stacked .key {\n white-space: normal;\n overflow-wrap: break-word;\n }\n\n .key,\n .value {\n min-width: 0;\n /* Row rhythm comes from this padding (tunable), not line-height. */\n padding: var(--data-table-row-padding, 0.35em) 0;\n }\n\n .key {\n padding-right: var(--space-m);\n opacity: 0.6;\n white-space: nowrap;\n text-align: var(--data-table-name-align, left);\n font-size: 10px;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n /* Uppercase keys have no descenders, so both edges can be trimmed to\n the glyphs for tight baseline / centre alignment. */\n text-box: trim-both cap alphabetic;\n }\n\n .value {\n position: relative;\n padding-right: var(--space-l);\n font: 12px ui-monospace, SFMono-Regular, Menlo, monospace;\n }\n\n /* The value text is clipped here — never on .value itself — so a long\n value stays within its cell even while tickled, and the detail\n popover (a child of .value) can still escape the cell. */\n .value-text {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n /* No text-box trim here: the natural line box gives descenders the room\n overflow:hidden would otherwise clip. Baseline alignment of key and\n value comes from align-items on .pair, which needs no trimming. */\n }\n\n .pair.tickled {\n background: var(--item-bg-tickled, color-mix(in oklch, var(--surface-2), var(--accent) 10%));\n }\n\n /* Lift the row whose detail is open above the rows it slides over. */\n .pair.show-detail {\n position: relative;\n z-index: 1;\n }\n\n .detail {\n position: absolute;\n z-index: 2;\n /* Flush with the bottom of the value (no gap) so the pointer can travel\n from value to panel without crossing a dead zone that would dismiss it.\n Left-aligned with the value; only as wide as its content, capped at\n the table width. */\n top: 100%;\n left: 0;\n right: auto;\n width: max-content;\n max-width: 100cqi;\n padding: var(--space-xs);\n background: var(--surface-2);\n visibility: hidden;\n transform: translateY(-4px);\n pointer-events: none;\n transition: transform var(--transition);\n }\n\n .pair.show-detail .detail {\n visibility: visible;\n transform: translateY(0);\n pointer-events: auto;\n }\n `,\n ];\n\n @property({ type: Array, attribute: false })\n rows: readonly DataTableRow[] = [];\n\n @property({ type: Number, attribute: false })\n selectedIndex: number | undefined;\n\n /**\n * How long (ms) the pointer must rest on a hovered row before its detail\n * panel is revealed. The tickled highlight itself appears immediately on\n * hover; only the detail panel is debounced. Clicking a row reveals its\n * detail straight away, ignoring this delay.\n */\n @property({ type: Number, attribute: `tickle-delay` })\n tickleDelay = 400;\n\n /**\n * Table layout.\n * - `auto` (default): responsive — widens to multiple pair-columns on wide\n * containers, and stacks key above value once narrower than\n * {@link narrowBreakpoint}.\n * - `rows`: always stacked (key above value), regardless of width.\n * - `columns`: always a two-column key/value grid, regardless of width.\n */\n @property({ type: String, reflect: true })\n layout: `auto` | `rows` | `columns` = `auto`;\n\n /**\n * Inline width (px) at or below which the `auto` layout switches to its\n * stacked, key-above-value form. Ignored when {@link layout} is locked.\n */\n @property({ type: Number, attribute: `narrow-breakpoint` })\n narrowBreakpoint = 420;\n\n @state()\n private _tickled = new TickledController<number>(this, {\n getItems: () => this.rows.map((_, i) => ({ id: i, enabled: true })),\n });\n\n /** Index of the row whose detail panel is currently revealed, if any. */\n @state()\n private _detailIndex: number | undefined;\n\n /** Whether the table is currently rendering in its stacked form. */\n @state()\n private _stacked = false;\n\n #detailTimer: ReturnType<typeof setTimeout> | undefined;\n #resizeObserver: ResizeObserver | undefined;\n #lastWidth = 0;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.#resizeObserver = new ResizeObserver((entries) => {\n const entry = entries[0];\n if (!entry)\n return;\n this.#lastWidth = entry.borderBoxSize?.[0]?.inlineSize ?? entry.contentRect.width;\n this.#updateStacked();\n });\n this.#resizeObserver.observe(this);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n clearTimeout(this.#detailTimer);\n this.#resizeObserver?.disconnect();\n this.#resizeObserver = undefined;\n }\n\n override willUpdate(changed: PropertyValues<this>): void {\n if (changed.has(`layout`) || changed.has(`narrowBreakpoint`)) {\n this.#updateStacked();\n }\n }\n\n #updateStacked(): void {\n const stacked = this.layout === `rows`\n ? true\n : this.layout === `columns`\n ? false\n : this.#lastWidth > 0 && this.#lastWidth <= this.narrowBreakpoint;\n if (stacked !== this._stacked)\n this._stacked = stacked;\n }\n\n #handlePointerEnter(i: number): void {\n // Tickle straight away, exactly as a click would.\n this._tickled.handlePointerEnter(i);\n // But hold the detail panel back until the pointer has rested a while.\n clearTimeout(this.#detailTimer);\n if (this._detailIndex !== undefined)\n this._detailIndex = undefined;\n this.#detailTimer = setTimeout(() => {\n if (this._tickled.isTickled(i))\n this._detailIndex = i;\n }, this.tickleDelay);\n }\n\n #handlePointerLeave(e: PointerEvent): void {\n clearTimeout(this.#detailTimer);\n this._detailIndex = undefined;\n this._tickled.handlePointerLeave(e);\n }\n\n #select(i: number): void {\n clearTimeout(this.#detailTimer);\n this.selectedIndex = this.selectedIndex === i ? undefined : i;\n this._tickled.setTickled(i);\n // A click reveals the detail immediately, no debounce.\n this._detailIndex = i;\n this.dispatchEvent(\n new CustomEvent<DataTableRowClickDetail>(`data-table-row-click`, {\n bubbles: true,\n composed: true,\n detail: {\n row: this.rows[i]!,\n index: i,\n selected: this.selectedIndex === i,\n },\n }),\n );\n }\n\n override render(): ReturnType<typeof html> {\n return html`<div\n class=\"properties ${this._stacked ? `stacked` : ``}\"\n @pointerleave=${(e: PointerEvent) => this.#handlePointerLeave(e)}\n >\n ${this.rows.map(\n (r, i) => html`<div\n class=\"pair ${this._tickled.isTickled(i) ? `tickled` : ``} ${\n this._detailIndex === i ? `show-detail` : ``\n }\"\n ?data-full=${r.fullWidth}\n @pointerenter=${() => this.#handlePointerEnter(i)}\n @click=${() => this.#select(i)}\n ><div class=\"key\">${r.label}</div><div class=\"value\"><span class=\"value-text\">${\n typeof r.value === `boolean`\n ? r.value\n ? `Yes`\n : `No`\n : r.value\n }</span>${r.detail === undefined ? nothing : html`<div class=\"detail\" part=\"detail\">${r.detail}</div>`}</div></div>`,\n )}</div>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-data-table': DataTableElement;\n }\n}\n\nexport interface DataTableElement {\n addEventListener<K extends keyof DataTableElementEventMap>(\n type: K,\n listener: (\n this: DataTableElement,\n event: DataTableElementEventMap[K],\n ) => void,\n options?: boolean | AddEventListenerOptions\n ): void;\n addEventListener(\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions\n ): void;\n}\n","import type { DragGhost } from '../util/drag-ghost.js';\nimport type { DockHostElement } from './dock-host.js';\nimport type { DockDragBoundaryDetail, DockOperation, DockPanelTearOutDetail } from './types.js';\nimport { createDragGhost } from '../util/drag-ghost.js';\n\nexport interface Rect {\n readonly x: number;\n readonly y: number;\n readonly w: number;\n readonly h: number;\n}\n\nexport interface DockDropZone {\n /** Host whose model would receive the drop. */\n readonly host: DockHostElement;\n readonly operation: DockOperation;\n /** Path of the target stack (`[]` = the host root). */\n readonly targetPath: number[];\n readonly side: `before` | `after`;\n /** Insert position for `tabs` drops (panel index in the target stack). */\n readonly gapIndex?: number;\n /** Highlight rect, relative to the host. */\n readonly rect: Rect;\n /** Optional insertion caret for strip gaps, relative to the host. */\n readonly caretRect?: Rect;\n}\n\ninterface DragState {\n panelId: string;\n /** Content kind at drag start — target hosts vet leaf rules without element access. */\n kind?: string;\n sourceHost: DockHostElement;\n pointerId: number;\n ghost: DragGhost | null;\n /** True while the pointer is outside every registered host (tear-out zone). */\n outside: boolean;\n}\n\nlet activeDrag: DragState | null = null;\nconst dragHosts: Set<DockHostElement> = new Set();\n\nexport function registerDockHost(host: DockHostElement): void {\n dragHosts.add(host);\n}\n\nexport function unregisterDockHost(host: DockHostElement): void {\n dragHosts.delete(host);\n if (activeDrag !== null && activeDrag.sourceHost === host) {\n abortDrag();\n }\n}\n\n/**\n * Begin a dock-panel drag. Called by hosts in response to their own\n * `dock-panel-drag-start` events (titlebar or tab-item handles).\n */\nexport function startDrag(\n panelId: string,\n sourceHost: DockHostElement,\n pointerId: number,\n clientX: number,\n clientY: number,\n kind?: string,\n): void {\n if (activeDrag !== null) {\n abortDrag();\n }\n\n const ghost = createGhostForPanel(sourceHost, panelId);\n activeDrag = { panelId, kind, sourceHost, pointerId, ghost, outside: false };\n\n for (const host of dragHosts) {\n host.setDragActive(true);\n }\n\n activeDrag.ghost?.move(clientX, clientY);\n\n window.addEventListener(`pointermove`, onPointerMove);\n window.addEventListener(`pointerup`, onPointerUp);\n window.addEventListener(`pointercancel`, onPointerCancel);\n window.addEventListener(`keydown`, onKeyDown);\n}\n\nfunction createGhostForPanel(host: DockHostElement, panelId: string): DragGhost | null {\n const panel = Array.from(host.children).find(\n (el): el is HTMLElement & { panelId: string; title: string; iconName: string } =>\n el instanceof HTMLElement && (el as { panelId?: string }).panelId === panelId,\n );\n if (!panel)\n return null;\n\n const content = document.createElement(`span`);\n content.style.display = `inline-flex`;\n content.style.alignItems = `center`;\n content.style.gap = `var(--space-xs, 4px)`;\n content.style.minWidth = `0`;\n\n if (panel.iconName) {\n const icon = document.createElement(`ixfx-icon`) as HTMLElement & { name: string };\n icon.name = panel.iconName;\n content.appendChild(icon);\n }\n\n const label = document.createElement(`span`);\n label.textContent = panel.title || panelId;\n label.style.overflow = `hidden`;\n label.style.textOverflow = `ellipsis`;\n label.style.whiteSpace = `nowrap`;\n content.appendChild(label);\n\n try {\n return createDragGhost({ anchor: panel, content });\n } catch {\n return null;\n }\n}\n\nfunction onPointerMove(event: PointerEvent): void {\n const drag = activeDrag;\n if (drag === null || event.pointerId !== drag.pointerId)\n return;\n\n drag.ghost?.move(event.clientX, event.clientY);\n\n const zone = findDropZone(drag, event.clientX, event.clientY);\n for (const host of dragHosts) {\n host.setDropZone(zone !== null && zone.host === host ? zone : null);\n }\n\n // Boundary crossings — the app uses these to start / stop a native window\n // drag when a panel is pulled out past every host.\n const outside = !pointerOverAnyHost(event.clientX, event.clientY);\n if (outside !== drag.outside) {\n drag.outside = outside;\n dispatchBoundary(drag, outside ? `dock-panel-drag-out` : `dock-panel-drag-in`, event);\n }\n}\n\nfunction onPointerUp(event: PointerEvent): void {\n const drag = activeDrag;\n if (drag === null || event.pointerId !== drag.pointerId)\n return;\n\n const zone = findDropZone(drag, event.clientX, event.clientY);\n if (zone !== null) {\n zone.host.handleDrop(drag.panelId, zone, drag.sourceHost);\n } else {\n // Released with no valid zone. If the pointer is outside every host this\n // is a tear-out request: hand the app a snapshot + screen coordinates so\n // it can open a new window and recreate the panel there. The panel is\n // left untouched in the source host — the app calls `detachPanel()` (or\n // `removePanel()`) once it has taken ownership.\n if (!pointerOverAnyHost(event.clientX, event.clientY)) {\n dispatchTearOut(drag, event);\n }\n }\n endDrag();\n}\n\nfunction onPointerCancel(event: PointerEvent): void {\n const drag = activeDrag;\n if (drag === null || event.pointerId !== drag.pointerId)\n return;\n abortDrag();\n endDrag();\n}\n\nfunction onKeyDown(event: KeyboardEvent): void {\n if (activeDrag === null)\n return;\n if (event.key !== `Escape`)\n return;\n abortDrag();\n endDrag();\n}\n\nfunction findDropZone(drag: DragState, clientX: number, clientY: number): DockDropZone | null {\n const sourceIsolated = drag.sourceHost.isolated;\n\n for (const host of dragHosts) {\n if (sourceIsolated && host !== drag.sourceHost)\n continue;\n\n const zone = host.computeDropZone(clientX, clientY, drag.panelId, drag.kind);\n if (zone !== null)\n return zone;\n }\n return null;\n}\n\n/** True when the point lies within the bounding box of any registered host. */\nexport function pointerOverAnyHost(clientX: number, clientY: number): boolean {\n for (const host of dragHosts) {\n const r = host.getBoundingClientRect();\n if (clientX >= r.left && clientX <= r.right && clientY >= r.top && clientY <= r.bottom)\n return true;\n }\n return false;\n}\n\nfunction dispatchBoundary(drag: DragState, type: string, event: PointerEvent): void {\n drag.sourceHost.dispatchEvent(new CustomEvent<DockDragBoundaryDetail>(type, {\n detail: {\n panelId: drag.panelId,\n clientX: event.clientX,\n clientY: event.clientY,\n screenX: event.screenX,\n screenY: event.screenY,\n },\n bubbles: true,\n composed: true,\n }));\n}\n\nfunction dispatchTearOut(drag: DragState, event: PointerEvent): void {\n const snapshot = drag.sourceHost.getPanelSnapshot(drag.panelId);\n if (snapshot === null)\n return;\n drag.sourceHost.dispatchEvent(new CustomEvent<DockPanelTearOutDetail>(`dock-panel-tear-out`, {\n detail: {\n panelId: drag.panelId,\n snapshot,\n clientX: event.clientX,\n clientY: event.clientY,\n screenX: event.screenX,\n screenY: event.screenY,\n },\n bubbles: true,\n composed: true,\n }));\n}\n\n/** Drop cancelled — no model mutation. */\nfunction abortDrag(): void {\n // Zone clearing happens in endDrag; nothing else to undo.\n}\n\nfunction endDrag(): void {\n const drag = activeDrag;\n if (drag === null)\n return;\n\n for (const host of dragHosts) {\n host.setDropZone(null);\n host.setDragActive(false);\n }\n\n drag.ghost?.destroy();\n activeDrag = null;\n\n window.removeEventListener(`pointermove`, onPointerMove);\n window.removeEventListener(`pointerup`, onPointerUp);\n window.removeEventListener(`pointercancel`, onPointerCancel);\n window.removeEventListener(`keydown`, onKeyDown);\n}\n\nexport function isDragging(): boolean {\n return activeDrag !== null;\n}\n\nexport function getActiveDragPanelId(): string | null {\n return activeDrag?.panelId ?? null;\n}\n","import type {\n DockAxis,\n DockDirection,\n DockEdge,\n DockLayout,\n DockLeafInfo,\n DockLeafRef,\n DockNeighbours,\n DockNode,\n DockSplitNode,\n DockStackNode,\n} from './types.js';\n\nexport type {\n DockAxis,\n DockDirection,\n DockEdge,\n DockLayout,\n DockLeafInfo,\n DockLeafRef,\n DockNeighbours,\n DockNode,\n DockSplitNode,\n DockStackNode,\n};\n\n/**\n * The dock model is a plain mutable tree owned exclusively by the host\n * element. Mutators below change the tree in place; the host calls\n * `normalize(root)` then `requestUpdate()` after batching mutations.\n */\nexport function isSplit(node: DockNode): node is DockSplitNode {\n return node.kind === `split`;\n}\n\nexport function isStack(node: DockNode): node is DockStackNode {\n return node.kind === `stack`;\n}\n\nexport function createEmptyStack(): DockStackNode {\n return { kind: `stack`, panels: [], active: `` };\n}\n\nexport function createEmptyLayout(): DockLayout {\n return { version: 1, root: createEmptyStack() };\n}\n\nexport function createStack(panels: string[], active?: string, name?: string): DockStackNode {\n const stack: DockStackNode = {\n kind: `stack`,\n panels: [...panels],\n active: active ?? panels[0] ?? ``,\n };\n const trimmed = name?.trim();\n if (trimmed) {\n stack.name = trimmed;\n }\n return stack;\n}\n\nexport function createSplit(direction: DockAxis, children: DockNode[], sizes?: number[]): DockSplitNode {\n const mean = children.length > 0 ? 1 / children.length : 1;\n return {\n kind: `split`,\n direction,\n children: [...children],\n sizes: sizes ? [...sizes] : children.map(() => mean),\n };\n}\n\n// ── Normalize ────────────────────────────────────────────────────────────────\n\n/**\n * Runs after every mutation:\n * - stack `active` fixed to a member of `panels` (or `''` when empty)\n * - empty *unnamed* stacks removed from their parent split (and their\n * `sizes` entry); named empty stacks are kept so the name stays addressable\n * - splits with ≤1 child replaced by that child (spliced into the parent)\n * - a child split whose direction equals its parent's is flattened into it,\n * spreading its sizes across the slot it vacated\n * - `sizes` kept parallel to `children` (padded with the mean weight)\n * - an empty root collapses to a single empty stack\n */\nexport function normalize(root: DockNode): DockNode {\n if (isStack(root)) {\n sanitizeStackName(root);\n if (!root.panels.includes(root.active)) {\n root.active = root.panels[0] ?? ``;\n }\n return root;\n }\n\n // Depth-first: normalize children, then flatten/carry-up at this level.\n for (let i = root.children.length - 1; i >= 0; i--) {\n normalize(root.children[i]);\n\n const child = root.children[i];\n\n // Drop empty stacks, unless named (names stay addressable)\n if (isStack(child) && child.panels.length === 0 && !child.name) {\n root.children.splice(i, 1);\n root.sizes.splice(i, 1);\n continue;\n }\n\n // Carry single-child splits up\n if (isSplit(child) && child.children.length === 1) {\n root.children.splice(i, 1, child.children[0]);\n root.sizes.splice(i, 1, child.sizes[0] ?? root.sizes[i] ?? 1);\n }\n }\n\n // Flatten same-direction child splits into this one\n for (let i = root.children.length - 1; i >= 0; i--) {\n const child = root.children[i];\n if (isSplit(child) && child.direction === root.direction) {\n root.children.splice(i, 1, ...child.children);\n root.sizes.splice(i, 1, ...child.sizes);\n }\n }\n\n // A split with ≤1 child dissolves\n if (root.children.length === 0) {\n return replaceNodeContents(root, createEmptyStack());\n }\n if (root.children.length === 1) {\n return root.children[0];\n }\n\n // Keep sizes parallel to children\n while (root.sizes.length < root.children.length) {\n root.sizes.push(1 / root.children.length);\n }\n if (root.sizes.length > root.children.length) {\n root.sizes.length = root.children.length;\n }\n\n return root;\n}\n\n/**\n * Turn `target` (a stack or split node object) into the shape of `source`'s\n * kind, used when the root itself must dissolve. Mutates `target` in place so\n * the host's root reference stays valid.\n */\nfunction replaceNodeContents(target: DockNode, source: DockNode): DockNode {\n if (isStack(source)) {\n target.kind = `stack`;\n const t = target as DockStackNode;\n t.panels = source.panels;\n t.active = source.active;\n if (source.name !== undefined) {\n t.name = source.name;\n } else {\n delete t.name;\n }\n if (source.hideLabels !== undefined) {\n t.hideLabels = source.hideLabels;\n } else {\n delete t.hideLabels;\n }\n delete t.collapsed;\n delete t.preCollapseSize;\n if (source.collapsed !== undefined)\n t.collapsed = source.collapsed;\n if (source.preCollapseSize !== undefined)\n t.preCollapseSize = source.preCollapseSize;\n } else {\n target.kind = `split`;\n const t = target as DockSplitNode;\n t.direction = source.direction;\n t.children = source.children;\n t.sizes = source.sizes;\n // Drop stale stack-only fields when morphing stack → split\n const stale = t as unknown as Record<string, unknown>;\n delete stale.panels;\n delete stale.active;\n delete stale.name;\n delete stale.collapsed;\n delete stale.preCollapseSize;\n }\n return target;\n}\n\n/** Trim `name`; drop it when empty / non-string so lookups stay predictable. */\nfunction sanitizeStackName(stack: DockStackNode): void {\n if (stack.name === undefined)\n return;\n const trimmed = typeof stack.name === `string` ? stack.name.trim() : ``;\n if (trimmed) {\n stack.name = trimmed;\n } else {\n delete stack.name;\n }\n}\n\n// ── Lookup ───────────────────────────────────────────────────────────────────\n\nexport function findNode(root: DockNode, path: number[]): DockNode | null {\n let current: DockNode = root;\n for (const index of path) {\n if (!isSplit(current))\n return null;\n const next = current.children[index];\n if (!next)\n return null;\n current = next;\n }\n return current;\n}\n\n/** Parent split of the node at `path`; null when path is empty or malformed. */\nexport function findParentOf(root: DockNode, path: number[]): DockSplitNode | null {\n if (path.length === 0)\n return null;\n const parent = findNode(root, path.slice(0, -1));\n return parent !== null && isSplit(parent) ? parent : null;\n}\n\n/** Path of the stack containing `panelId`, or null. */\nexport function findStackOf(root: DockNode, panelId: string): number[] | null {\n return findStackOfInner(root, panelId, []);\n}\n\nfunction findStackOfInner(node: DockNode, panelId: string, path: number[]): number[] | null {\n if (isStack(node)) {\n return node.panels.includes(panelId) ? path : null;\n }\n for (let i = 0; i < node.children.length; i++) {\n const found = findStackOfInner(node.children[i], panelId, [...path, i]);\n if (found !== null)\n return found;\n }\n return null;\n}\n\nexport function collectPanelIds(root: DockNode): string[] {\n if (isStack(root)) {\n return [...root.panels];\n }\n return root.children.flatMap(collectPanelIds);\n}\n\n/**\n * Path of the first stack (tree order) whose `name` matches, or null.\n * Names are expected to be unique per layout; duplicates resolve first-wins.\n */\nexport function findStackPathByName(root: DockNode, name: string): number[] | null {\n const wanted = name.trim();\n if (!wanted)\n return null;\n return findStackPathByNameInner(root, wanted, []);\n}\n\nfunction findStackPathByNameInner(node: DockNode, name: string, path: number[]): number[] | null {\n if (isStack(node)) {\n return node.name === name ? path : null;\n }\n for (let i = 0; i < node.children.length; i++) {\n const found = findStackPathByNameInner(node.children[i], name, [...path, i]);\n if (found !== null)\n return found;\n }\n return null;\n}\n\n/** Names of every named stack leaf, in tree order. */\nexport function collectContainerNames(root: DockNode): string[] {\n const out: string[] = [];\n const visit = (node: DockNode): void => {\n if (isStack(node)) {\n if (node.name)\n out.push(node.name);\n return;\n }\n node.children.forEach(visit);\n };\n visit(root);\n return out;\n}\n\n/**\n * Paths of every stack leaf, in tree order. `[]` is the root itself when it\n * is a stack.\n */\nexport function collectStackPaths(root: DockNode): number[][] {\n const result: number[][] = [];\n collectStackPathsInner(root, [], result);\n return result;\n}\n\nfunction collectStackPathsInner(node: DockNode, path: number[], out: number[][]): void {\n if (isStack(node)) {\n out.push(path);\n return;\n }\n node.children.forEach((child, i) => collectStackPathsInner(child, [...path, i], out));\n}\n\n// ── Mutations (in place; run `normalize` afterwards) ─────────────────────────\n\nexport function addPanelToStack(stack: DockStackNode, panelId: string, index?: number): void {\n const at = index === undefined ? stack.panels.length : Math.max(0, Math.min(index, stack.panels.length));\n stack.panels.splice(at, 0, panelId);\n stack.active = panelId;\n}\n\nexport function removePanelFromStack(stack: DockStackNode, panelId: string): void {\n const index = stack.panels.indexOf(panelId);\n if (index < 0)\n return;\n stack.panels.splice(index, 1);\n if (stack.active === panelId) {\n stack.active = stack.panels[Math.min(index, stack.panels.length - 1)] ?? ``;\n }\n}\n\nexport function setActive(stack: DockStackNode, panelId: string): boolean {\n if (!stack.panels.includes(panelId) || stack.active === panelId)\n return false;\n stack.active = panelId;\n return true;\n}\n\n/**\n * Insert `node` beside the child at `targetPath`, into the parent split when\n * its direction matches `direction`, otherwise wrap the target in a new split.\n * `side` selects before/after; the neighbour's weight is split 50/50.\n * Returns the path of the inserted node, or null.\n */\nexport function insertBeside(\n root: DockNode,\n targetPath: number[],\n direction: DockAxis,\n newNode: DockNode,\n side: `before` | `after`,\n): number[] | null {\n const target = findNode(root, targetPath);\n if (target === null)\n return null;\n\n // Root-level: insert at the edge if the root already matches, else wrap\n if (targetPath.length === 0) {\n if (isSplit(root) && root.direction === direction) {\n const edgeIndex = side === `before` ? 0 : root.children.length;\n const neighbourIndex = side === `before` ? 0 : root.children.length - 1;\n const neighbour = root.sizes[neighbourIndex];\n root.children.splice(edgeIndex, 0, newNode);\n root.sizes.splice(edgeIndex, 0, neighbour !== undefined ? neighbour / 2 : 1);\n if (neighbour !== undefined) {\n root.sizes[side === `before` ? neighbourIndex + 1 : neighbourIndex] = neighbour / 2;\n }\n return [edgeIndex];\n }\n wrapRoot(root, direction, newNode, side);\n return [side === `before` ? 0 : 1];\n }\n\n const parent = findParentOf(root, targetPath);\n if (parent === null)\n return null;\n\n const index = targetPath[targetPath.length - 1];\n\n if (parent.direction === direction) {\n const insertAt = side === `before` ? index : index + 1;\n const w = parent.sizes[index] !== undefined ? parent.sizes[index] / 2 : 1;\n parent.sizes[index] = w;\n parent.children.splice(insertAt, 0, newNode);\n parent.sizes.splice(insertAt, 0, w);\n const childPath = [...targetPath.slice(0, -1), insertAt];\n normalize(root);\n return childPath;\n }\n\n const wrapper = createSplit(direction, side === `before` ? [newNode, target] : [target, newNode]);\n parent.children[index] = wrapper;\n normalize(root);\n const childIndex = side === `before` ? 0 : 1;\n return [...targetPath.slice(0, -1), index, childIndex];\n}\n\n/**\n * Wrap the whole root in a new split of `direction`, replacing it in place so\n * the caller's reference stays valid. Returns true on success.\n */\nexport function wrapRoot(root: DockNode, direction: DockAxis, newNode: DockNode, side: `before` | `after`): boolean {\n // The wrapper's inner child must be a *copy* of the root's current contents,\n // not `root` itself: `replaceNodeContents` morphs `root` in place, so passing\n // the live reference would leave `root.children` holding `root` — a cycle that\n // makes `normalize` recurse until the stack overflows.\n const inner = cloneNodeShallow(root);\n const wrapper = createSplit(direction, side === `before` ? [newNode, inner] : [inner, newNode]);\n replaceNodeContents(root, wrapper);\n normalize(root);\n return true;\n}\n\n/**\n * Detached copy of `node` (own arrays copied) so it can become a child of a\n * wrapper that then replaces `node` in place.\n */\nfunction cloneNodeShallow(node: DockNode): DockNode {\n if (isStack(node)) {\n return { ...node, panels: [...node.panels] };\n }\n return { ...node, children: [...node.children], sizes: [...node.sizes] };\n}\n\n/**\n * Remove the stack at `stackPath` from the tree. Its panels are moved into\n * `fallbackStack` (if given and still attached) so they are not silently\n * lost; otherwise they are dropped from the model (elements return to the\n * pool). Returns the removed stack.\n */\nexport function extractStack(root: DockNode, stackPath: number[], fallbackStack?: DockStackNode): DockStackNode | null {\n const stack = findNode(root, stackPath);\n if (stack === null || !isStack(stack))\n return null;\n\n const isRoot = stackPath.length === 0;\n\n if (fallbackStack && fallbackStack !== stack) {\n for (const id of stack.panels) {\n addPanelToStack(fallbackStack, id);\n }\n // Only keep the panels in one place\n if (!isRoot) {\n stack.panels = [];\n stack.active = ``;\n }\n }\n\n if (isRoot) {\n replaceNodeContents(root, createEmptyStack());\n return stack;\n }\n\n const parent = findParentOf(root, stackPath);\n if (parent === null)\n return null;\n\n const index = stackPath[stackPath.length - 1];\n parent.children.splice(index, 1);\n parent.sizes.splice(index, 1);\n normalize(root);\n return stack;\n}\n\n// ── Spatial (geometry + leaf moves) ──────────────────────────────────────────\n//\n// Leaves are positioned by subdividing a unit square along each split\n// (child share = `sizes[i] / sum(sizes)`). Neighbour queries and moves below\n// are derived from that geometry, so they reflect what the user sees rather\n// than raw tree adjacency.\n\n/** Tolerance for edge-touch comparisons in unit-square geometry. */\nconst GEOM_EPS = 1e-9;\n\nexport interface DockRect {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nexport interface LeafGeom {\n path: number[];\n name: string | null;\n rect: DockRect;\n}\n\nfunction pathsEqual(a: readonly number[], b: readonly number[]): boolean {\n return a.length === b.length && a.every((v, i) => v === b[i]);\n}\n\n/**\n * Resolve a {@link DockLeafRef} to a stack path. Strings match container\n * `name` first-wins; arrays must index an existing stack leaf. Returns null\n * when unresolvable.\n */\nexport function resolveLeafPath(root: DockNode, ref: DockLeafRef): number[] | null {\n if (typeof ref === `string`) {\n return findStackPathByName(root, ref);\n }\n if (!Array.isArray(ref)) {\n return null;\n }\n let current: DockNode = root;\n for (const index of ref) {\n if (!Number.isInteger(index) || (index as number) < 0) {\n return null;\n }\n if (!isSplit(current)) {\n return null;\n }\n const next = current.children[index as number];\n if (!next) {\n return null;\n }\n current = next;\n }\n return isStack(current) ? [...ref] : null;\n}\n\n/** Absolute (unit-square) rect of every stack leaf, in tree order. */\nexport function computeLeafGeoms(root: DockNode): LeafGeom[] {\n const out: LeafGeom[] = [];\n const visit = (node: DockNode, path: number[], rect: DockRect): void => {\n if (isStack(node)) {\n out.push({ path, name: node.name ?? null, rect });\n return;\n }\n const total = node.sizes.reduce((sum, w) => sum + w, 0);\n const safe = total > 0 ? total : node.children.length || 1;\n let offset = 0;\n node.children.forEach((child, i) => {\n const frac = (node.sizes[i] ?? safe / node.children.length) / safe;\n if (node.direction === `row`) {\n const w = rect.w * frac;\n visit(child, [...path, i], { x: rect.x + offset, y: rect.y, w, h: rect.h });\n offset += w;\n } else {\n const h = rect.h * frac;\n visit(child, [...path, i], { x: rect.x, y: rect.y + offset, w: rect.w, h });\n offset += h;\n }\n });\n };\n visit(root, [], { x: 0, y: 0, w: 1, h: 1 });\n return out;\n}\n\nfunction intervalOverlap(a0: number, a1: number, b0: number, b1: number): number {\n return Math.min(a1, b1) - Math.max(a0, b0);\n}\n\n/**\n * Geometric neighbours of a leaf — what the user sees above / below / left /\n * right of it. Each list holds `{ name, path }` (name is null for unnamed\n * leaves), ordered most-overlapping first. Returns null when `ref` is\n * unresolvable.\n */\nexport function getLeafNeighbours(root: DockNode, ref: DockLeafRef): DockNeighbours | null {\n const path = resolveLeafPath(root, ref);\n if (path === null) {\n return null;\n }\n const geoms = computeLeafGeoms(root);\n const self = geoms.find(g => pathsEqual(g.path, path));\n if (!self) {\n return null;\n }\n const s = self.rect;\n type Hit = { info: DockLeafInfo; overlap: number; order: number };\n const above: Hit[] = [];\n const below: Hit[] = [];\n const left: Hit[] = [];\n const right: Hit[] = [];\n geoms.forEach((g, order) => {\n if (g === self) {\n return;\n }\n const r = g.rect;\n const info: DockLeafInfo = { name: g.name, path: [...g.path] };\n if (Math.abs(r.y + r.h - s.y) < GEOM_EPS) {\n const o = intervalOverlap(r.x, r.x + r.w, s.x, s.x + s.w);\n if (o > GEOM_EPS)\n above.push({ info, overlap: o, order });\n }\n if (Math.abs(s.y + s.h - r.y) < GEOM_EPS) {\n const o = intervalOverlap(r.x, r.x + r.w, s.x, s.x + s.w);\n if (o > GEOM_EPS)\n below.push({ info, overlap: o, order });\n }\n if (Math.abs(r.x + r.w - s.x) < GEOM_EPS) {\n const o = intervalOverlap(r.y, r.y + r.h, s.y, s.y + s.h);\n if (o > GEOM_EPS)\n left.push({ info, overlap: o, order });\n }\n if (Math.abs(s.x + s.w - r.x) < GEOM_EPS) {\n const o = intervalOverlap(r.y, r.y + r.h, s.y, s.y + s.h);\n if (o > GEOM_EPS)\n right.push({ info, overlap: o, order });\n }\n });\n const rank = (hits: Hit[]): DockLeafInfo[] =>\n hits.sort((a, b) => b.overlap - a.overlap || a.order - b.order).map(h => h.info);\n return { above: rank(above), below: rank(below), left: rank(left), right: rank(right) };\n}\n\n/**\n * Exchange two leaves' positions in the tree, each carrying its size slot so\n * the remaining structure and proportions are untouched. Returns false when\n * either path is not a stack leaf.\n */\nexport function swapLeaves(root: DockNode, pathA: number[], pathB: number[]): boolean {\n if (pathsEqual(pathA, pathB)) {\n return false;\n }\n const nodeA = findNode(root, pathA);\n const nodeB = findNode(root, pathB);\n if (nodeA === null || nodeB === null || !isStack(nodeA) || !isStack(nodeB)) {\n return false;\n }\n const parentA = findParentOf(root, pathA);\n const parentB = findParentOf(root, pathB);\n if (parentA === null || parentB === null) {\n return false;\n }\n const indexA = pathA[pathA.length - 1];\n const indexB = pathB[pathB.length - 1];\n if (parentA === parentB) {\n const p = parentA;\n [p.children[indexA], p.children[indexB]] = [p.children[indexB], p.children[indexA]];\n [p.sizes[indexA], p.sizes[indexB]] = [p.sizes[indexB] ?? 1, p.sizes[indexA] ?? 1];\n return true;\n }\n const carriedNode = parentA.children[indexA];\n const carriedSize = parentA.sizes[indexA] ?? 1;\n parentA.children[indexA] = parentB.children[indexB];\n parentA.sizes[indexA] = parentB.sizes[indexB] ?? 1;\n parentB.children[indexB] = carriedNode;\n parentB.sizes[indexB] = carriedSize;\n return true;\n}\n\n/**\n * Move a leaf one position in `direction`, swapping with the neighbour it\n * shares the longest edge with. Returns false when `ref` is unresolvable or\n * nothing adjoins in that direction. Run `normalize()` afterwards.\n */\nexport function moveLeafStep(root: DockNode, ref: DockLeafRef, direction: DockDirection): boolean {\n const path = resolveLeafPath(root, ref);\n if (path === null) {\n return false;\n }\n const neighbours = getLeafNeighbours(root, ref);\n if (neighbours === null) {\n return false;\n }\n const list = direction === `up`\n ? neighbours.above\n : direction === `down`\n ? neighbours.below\n : direction === `left`\n ? neighbours.left\n : neighbours.right;\n if (list.length === 0) {\n return false;\n }\n return swapLeaves(root, path, list[0].path);\n}\n\n/**\n * Move a leaf to an edge of the overall layout, keeping the rest of the\n * tree intact as a single subtree and preserving the leaf's absolute size\n * along the target axis. Returns false when `ref` is unresolvable or the\n * layout holds a single leaf. Run `normalize()` afterwards (also safe to\n * call it twice — the host's commit does).\n */\nexport function moveLeafNodeToEdge(root: DockNode, ref: DockLeafRef, edge: DockEdge): boolean {\n const path = resolveLeafPath(root, ref);\n if (path === null || path.length === 0) {\n return false;\n }\n const geoms = computeLeafGeoms(root);\n const self = geoms.find(g => pathsEqual(g.path, path));\n if (!self) {\n return false;\n }\n const horizontal = edge === `left` || edge === `right`;\n const frac = Math.min(Math.max(horizontal ? self.rect.w : self.rect.h, 0.05), 0.95);\n if (!(frac > 0) || frac >= 1) {\n return false;\n }\n\n const parent = findParentOf(root, path);\n if (parent === null) {\n return false;\n }\n const [node] = parent.children.splice(path[path.length - 1], 1);\n parent.sizes.splice(path[path.length - 1], 1);\n if (!node) {\n return false;\n }\n normalize(root);\n\n const atStart = edge === `left` || edge === `top`;\n const direction: DockAxis = horizontal ? `row` : `column`;\n\n if (isStack(root)) {\n // One leaf remains: wrap it so the moved leaf keeps its absolute share.\n const rest = root;\n const remaining: DockStackNode = { kind: `stack`, panels: [...rest.panels], active: rest.active };\n if (rest.name !== undefined)\n remaining.name = rest.name;\n if (rest.collapsed !== undefined)\n remaining.collapsed = rest.collapsed;\n if (rest.preCollapseSize !== undefined)\n remaining.preCollapseSize = rest.preCollapseSize;\n const wrapper: DockSplitNode = {\n kind: `split`,\n direction,\n children: atStart ? [node, remaining] : [remaining, node],\n sizes: atStart ? [frac, 1 - frac] : [1 - frac, frac],\n };\n replaceNodeContents(root, wrapper);\n return true;\n }\n\n if (isSplit(root) && root.direction === direction) {\n const sum = root.sizes.reduce((total, w) => total + w, 0) || root.children.length || 1;\n const size = frac * sum / (1 - frac);\n const at = atStart ? 0 : root.children.length;\n root.children.splice(at, 0, node);\n root.sizes.splice(at, 0, size);\n return true;\n }\n\n if (isSplit(root)) {\n // Other axis: nest the whole layout so its structure is untouched.\n const inner: DockSplitNode = { kind: `split`, direction: root.direction, children: root.children, sizes: root.sizes };\n const wrapper: DockSplitNode = {\n kind: `split`,\n direction,\n children: atStart ? [node, inner] : [inner, node],\n sizes: atStart ? [frac, 1 - frac] : [1 - frac, frac],\n };\n replaceNodeContents(root, wrapper);\n return true;\n }\n\n return false;\n}\n\n// ── Serialization ────────────────────────────────────────────────────────────\n\nexport function serializeLayout(root: DockNode): DockLayout {\n return {\n version: 1,\n root: serializeNode(root),\n };\n}\n\nfunction serializeNode(node: DockNode): DockNode {\n if (isStack(node)) {\n const out: DockStackNode = {\n kind: `stack`,\n panels: [...node.panels],\n active: node.active,\n };\n if (node.name !== undefined)\n out.name = node.name;\n if (node.hideLabels !== undefined)\n out.hideLabels = node.hideLabels;\n if (node.collapsed !== undefined)\n out.collapsed = node.collapsed;\n if (node.preCollapseSize !== undefined)\n out.preCollapseSize = node.preCollapseSize;\n return out;\n }\n return {\n kind: `split`,\n direction: node.direction,\n sizes: [...node.sizes],\n children: node.children.map(serializeNode),\n };\n}\n\n/**\n * Parse layout JSON, validate loosely, and normalize. Returns null when the\n * JSON is malformed or the root is missing/invalid.\n */\nexport function parseLayout(json: string): DockLayout | null {\n try {\n const parsed = JSON.parse(json) as DockLayout | null;\n if (parsed === null || typeof parsed !== `object`)\n return null;\n const root = (parsed as DockLayout).root;\n if (root === null || typeof root !== `object` || !(`kind` in root))\n return null;\n return { version: 1, root: normalize(root) };\n } catch {\n return null;\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 private _labelObserver: MutationObserver | null = null;\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 const labelSlot = this.shadowRoot?.querySelector(`slot:not([name])`);\n labelSlot?.addEventListener(`slotchange`, this._onLabelSlotChange);\n // In-place text edits (e.g. Lit re-rendering a title) don't fire\n // slotchange, so watch the light DOM too.\n this._labelObserver = new MutationObserver(() => this._syncLabelSizer());\n this._labelObserver.observe(this, { childList: true, characterData: true, subtree: true });\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 this._labelObserver?.disconnect();\n this._labelObserver = null;\n const toolbarSlot = this.shadowRoot?.querySelector(`slot[name=\"toolbar\"]`);\n toolbarSlot?.removeEventListener(`slotchange`, this._onToolbarSlotChange);\n const labelSlot = this.shadowRoot?.querySelector(`slot:not([name])`);\n labelSlot?.removeEventListener(`slotchange`, this._onLabelSlotChange);\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 _onLabelSlotChange = () => {\n this._syncLabelSizer();\n };\n\n /**\n * Mirror the default-slot text into `.label[data-label]` for the `::after`\n * width sizer. Slotted toolbar content is excluded.\n */\n private _syncLabelSizer(): void {\n const slot = this.shadowRoot?.querySelector(`slot:not([name])`) as HTMLSlotElement | null;\n const label = this.shadowRoot?.querySelector(`.label`);\n if (slot === null || slot === undefined || label === null || label === undefined) {\n return;\n }\n const text = slot.assignedNodes()\n .filter(node => !(node instanceof HTMLElement && node.hasAttribute(`slot`)))\n .map(node => node.textContent ?? ``)\n .join(``);\n if (text) {\n label.setAttribute(`data-label`, text);\n } else {\n label.removeAttribute(`data-label`);\n }\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 this._syncLabelSizer();\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-icon-color: var(--ixfx-selected-tab-icon-color, var(--accent));\n --selected-tab-border-width: var(--ixfx-selected-tab-border-width, 1px);\n --selected-tab-weight: var(--ixfx-selected-tab-weight, bold);\n --selected-tab-text-decoration: var(--ixfx-selected-tab-text-decoration, none);\n --selected-tab-text-decoration-color: var(--ixfx-selected-tab-text-decoration-color, var(--accent));\n --selected-tab-text-decoration-thickness: var(--ixfx-selected-tab-text-decoration-thickness, 0px);\n --selected-tab-text-decoration-offset: var(--ixfx-selected-tab-text-decoration-offset, 2px);\n --selected-background: var(--ixfx-tab-selected-background, var(--surface-5));\n --tab-padding: var(--ixfx-tab-padding, var(--space-s));\n display: inline-flex;\n min-width: 0;\n user-select: none;\n box-sizing: border-box;\n font-size: var(--text-m);\n color: inherit;\n /* No explicit height: items stretch (align-self: stretch via the\n list's flex container) so every tab in a strip shares one height\n even when toolbars give some items taller 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 transition: background var(--transition, 0.15s);\n }\n\n /* Hover (\"tickle\") background. When --ixfx-tab-hover-background is\n unset each state keeps its resting background, so existing\n consumers see no change. */\n :host(:hover:not([selected])) > div {\n background: var(--ixfx-tab-hover-background, transparent);\n }\n\n :host([selected]:hover) > div {\n background: var(--ixfx-tab-hover-background, var(--selected-background));\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 :host([selected]) .label {\n text-decoration: var(--selected-tab-text-decoration);\n text-decoration-color: var(--selected-tab-text-decoration-color);\n text-decoration-thickness: var(--selected-tab-text-decoration-thickness);\n text-decoration-offset: var(--selected-tab-text-decoration-offset);\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 /* Width sizer: an invisible copy of the label, always set at the\n selected weight, so activating a tab (bold) never shifts the strip.\n Text is mirrored from the default slot via the data-label attribute\n (see _syncLabelSizer). */\n .label::after {\n content: attr(data-label);\n display: block;\n height: 0;\n overflow: hidden;\n visibility: hidden;\n font-weight: var(--selected-tab-weight);\n }\n\n ixfx-icon {\n flex-shrink: 0;\n }\n\n /* Leading icon (direct child — not close/toolbar icons) picks up the\n accent when selected, so icon-only tabs read as active. */\n :host([selected]) > div > ixfx-icon {\n color: var(--selected-tab-icon-color);\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 /* Slotted buttons inherit these through the shadow boundary; keeps a\n toolbar button from inflating the strip height. */\n .toolbar ::slotted(ixfx-button) {\n --ixfx-button-padding-block: var(--space-xs);\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","/* eslint-disable ts/no-unsafe-declaration-merging */\nimport type { TitlebarCloseEvent, TitlebarToggleDetail, TitlebarToggleEvent } from '../titlebar/titlebar.js';\nimport type { DockPanelDragStartDetail, DockPanelDragStartEvent } from './types.js';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport '../titlebar/titlebar.js';\n\n/** Pointer movement threshold before a titlebar press becomes a dock drag. */\nconst DRAG_THRESHOLD_PX = 5;\n\nexport type { DockPanelDragStartEvent };\n\nexport interface DockPanelElementEventMap {\n 'dock-panel-drag-start': DockPanelDragStartEvent;\n 'toggle': TitlebarToggleEvent;\n 'close': TitlebarCloseEvent;\n}\n\n/**\n * Leaf content + metadata + drag handle. Renders `ixfx-titlebar` chrome when\n * standalone (`presentation=\"solo\"`) and content only when docked\n * (`presentation=\"tabbed\"` — the host's tab strip carries the title chrome).\n * Adds `panel-id` and the titlebar drag handle. Works standalone outside a\n * host (the drag-start event has no listener and is inert).\n */\n@customElement(`ixfx-dock-panel`)\nexport class DockPanelElement extends LitElement {\n /** Stable identity: model key, slot name suffix, serialization id. */\n @property({ type: String, attribute: `panel-id`, reflect: true })\n panelId = ``;\n\n /**\n * Display text (tab label, titlebar). Stored in the `label` attribute —\n * deliberately not `title`, so browsers never tooltip it.\n */\n @property({ type: String, attribute: `label` })\n title = ``;\n\n @property({ type: String, attribute: `icon-name` })\n iconName = ``;\n\n @property({ type: Boolean })\n closable = false;\n\n @property({ type: Boolean })\n collapsible = false;\n\n /**\n * Content kind for the host's leaf placement rules\n * (`setLeafExclusiveContents` / `setLeafDenyContents`). Matched literally;\n * defaults to `'any'`.\n */\n @property({ type: String, reflect: true })\n kind = `any`;\n\n /**\n * Per-panel restriction when this panel is itself a drop target (solo\n * leaf). Space-separated `tabs` / `horizontal` / `vertical` / `all`;\n * `none` rejects everything; default is unrestricted.\n */\n @property({ type: String, attribute: `accepts` })\n accepts = ``;\n\n /**\n * Host-controlled. Docked panels are always `tabbed` (content only — the\n * leaf's tab strip carries the title chrome). `solo` (full titlebar chrome)\n * applies to panels outside a host or not currently docked.\n */\n @property({ type: String, reflect: true })\n presentation: `solo` | `tabbed` = `solo`;\n\n /** Solo-mode collapse state, mirrored from the titlebar. */\n @state()\n private _collapsed = false;\n\n private _dragPointerId: number | null = null;\n private _dragStartX = 0;\n private _dragStartY = 0;\n private _dragStarted = false;\n\n override connectedCallback(): void {\n super.connectedCallback();\n // Legacy alias: adopt a `title` attribute into the property, then drop\n // it — a lingering native `title` attribute would tooltip on hover.\n // (`title` is unobserved, so removal has no side effects.)\n if (this.hasAttribute(`title`)) {\n if (!this.hasAttribute(`label`)) {\n this.title = this.getAttribute(`title`) ?? ``;\n }\n this.removeAttribute(`title`);\n }\n this.addEventListener(`pointerdown`, this._onPointerDown as EventListener);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this._teardownDragListeners();\n this.removeEventListener(`pointerdown`, this._onPointerDown as EventListener);\n }\n\n // ── Titlebar drag handle ─────────────────────────────────────────────────\n\n private _onPointerDown = (event: PointerEvent): void => {\n if (event.button !== 0)\n return;\n if (this.presentation === `tabbed`)\n return; // tab items are the drag handle in tabbed mode (host-driven)\n if (!this._isDragHandle(event))\n return;\n\n this._dragPointerId = event.pointerId;\n this._dragStartX = event.clientX;\n this._dragStartY = event.clientY;\n this._dragStarted = false;\n\n window.addEventListener(`pointermove`, this._onPointerMove);\n window.addEventListener(`pointerup`, this._onPointerUp);\n window.addEventListener(`pointercancel`, this._onPointerUp);\n };\n\n private _onPointerMove = (event: PointerEvent): void => {\n if (this._dragPointerId === null || event.pointerId !== this._dragPointerId)\n return;\n\n if (!this._dragStarted) {\n const distance = Math.hypot(event.clientX - this._dragStartX, event.clientY - this._dragStartY);\n if (distance < DRAG_THRESHOLD_PX)\n return;\n this._dragStarted = true;\n const pointerId = this._dragPointerId;\n this._teardownDragListeners();\n this._dispatchDragStart(pointerId, event.clientX, event.clientY);\n }\n };\n\n private _onPointerUp = (event: PointerEvent): void => {\n if (this._dragPointerId === null || event.pointerId !== this._dragPointerId)\n return;\n this._teardownDragListeners();\n };\n\n private _teardownDragListeners(): void {\n this._dragPointerId = null;\n this._dragStarted = false;\n window.removeEventListener(`pointermove`, this._onPointerMove);\n window.removeEventListener(`pointerup`, this._onPointerUp);\n window.removeEventListener(`pointercancel`, this._onPointerUp);\n }\n\n /** Clicks that begin on the close / caret buttons or the toolbar are not drags. */\n private _isDragHandle(event: PointerEvent): boolean {\n for (const node of event.composedPath()) {\n if (!(node instanceof HTMLElement))\n continue;\n if (node.classList.contains(`close-btn`) || node.classList.contains(`caret-btn`) || node.classList.contains(`toolbar`)) {\n return false;\n }\n }\n return true;\n }\n\n private _dispatchDragStart(pointerId: number, clientX: number, clientY: number): void {\n if (!this.panelId)\n return;\n this.dispatchEvent(new CustomEvent<DockPanelDragStartDetail>(`dock-panel-drag-start`, {\n detail: {\n panelId: this.panelId,\n pointerId,\n clientX,\n clientY,\n },\n bubbles: true,\n composed: true,\n }));\n }\n\n // ── Chrome event forwarding ──────────────────────────────────────────────\n\n private _onTitlebarToggle = (event: TitlebarToggleEvent): void => {\n event.stopPropagation();\n this._collapsed = event.detail.collapsed;\n this.dispatchEvent(new CustomEvent<TitlebarToggleDetail>(`toggle`, {\n detail: event.detail,\n bubbles: true,\n composed: true,\n }));\n };\n\n private _onTitlebarClose = (event: Event): void => {\n event.stopPropagation();\n this.dispatchEvent(new CustomEvent<void>(`close`, {\n bubbles: true,\n composed: true,\n }));\n // Mirror ixfx-panel's contract: a close removes the element. When docked,\n // the host's slotchange handler routes this through removePanel().\n this.remove();\n };\n\n protected override render() {\n const tabbed = this.presentation === `tabbed`;\n // Collapsed state only applies to solo chrome; docked leaves collapse at\n // the split-layout level, so ignore it there.\n const collapsed = !tabbed && this._collapsed;\n return html`\n ${tabbed\n ? nothing\n : html`\n <ixfx-titlebar\n .title=${this.title}\n .iconName=${this.iconName}\n .closable=${this.closable}\n .collapsible=${this.collapsible}\n .collapsed=${collapsed}\n .toggleInteraction=${this.collapsible ? `implicit` : `disabled`}\n @toggle=${this._onTitlebarToggle}\n @close=${this._onTitlebarClose}\n >\n <slot name=\"toolbar\" slot=\"toolbar\"></slot>\n </ixfx-titlebar>\n `}\n <div class=\"content\" ?collapsed=${collapsed}>\n <slot></slot>\n </div>\n `;\n }\n\n static override styles = [\n themeFallbacks,\n css`\n :host {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n min-width: 0;\n min-height: 0;\n }\n\n ixfx-titlebar {\n flex-shrink: 0;\n }\n\n .content {\n flex: 1;\n min-height: 0;\n min-width: 0;\n overflow: hidden;\n }\n\n .content[collapsed] {\n display: none;\n }\n `,\n ];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-dock-panel': DockPanelElement;\n }\n}\n\nexport interface DockPanelElement {\n addEventListener: (<K extends keyof DockPanelElementEventMap>(\n type: K,\n listener: (this: DockPanelElement, event: DockPanelElementEventMap[K]) => void,\n options?: boolean | AddEventListenerOptions,\n ) => void) & ((\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ) => void);\n}\n","/* eslint-disable ts/no-unsafe-declaration-merging */\nimport type { SplitLayoutElement } from '../split-layout/split-layout.js';\nimport type { TabListChangeEvent } from '../tabs/tab-list.js';\nimport type { DockDropZone, Rect } from './dock-drag.js';\nimport type { DockPanelElement } from './dock-panel.js';\nimport type {\n DockAddPanelTarget,\n DockChangeEvent,\n DockDirection,\n DockDragBoundaryEvent,\n DockDropTarget,\n DockEdge,\n DockLayout,\n DockLeafContentRules,\n DockLeafPlacementPolicy,\n DockLeafPlacementPolicyResolved,\n DockLeafRef,\n DockNeighbours,\n DockNode,\n DockOperation,\n DockPanelActivatedEvent,\n DockPanelAddedEvent,\n DockPanelDragStartEvent,\n DockPanelInit,\n DockPanelRemovedEvent,\n DockPanelSnapshot,\n DockPanelTearOutEvent,\n DockStackNode,\n} from './types.js';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { repeat } from 'lit/directives/repeat.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { handleStyles } from '../styles/handle.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport { registerDockHost, startDrag, unregisterDockHost } from './dock-drag.js';\nimport {\n addPanelToStack,\n collectContainerNames,\n collectPanelIds,\n collectStackPaths,\n createStack,\n extractStack,\n findNode,\n findStackOf,\n findStackPathByName,\n getLeafNeighbours,\n insertBeside,\n isSplit,\n isStack,\n moveLeafNodeToEdge,\n moveLeafStep,\n normalize,\n parseLayout,\n removePanelFromStack,\n serializeLayout,\n setActive,\n wrapRoot,\n} from './dock-model.js';\nimport '../split-layout/split-layout.js';\nimport '../tabs/tab-list.js';\nimport '../tabs/tab-list-item.js';\nimport './dock-panel.js';\n\nexport type {\n DockAddPanelTarget,\n DockChangeEvent,\n DockDirection,\n DockDragBoundaryEvent,\n DockEdge,\n DockLeafContentRules,\n DockLeafPlacementPolicy,\n DockLeafPlacementPolicyResolved,\n DockLeafRef,\n DockNeighbours,\n DockPanelActivatedEvent,\n DockPanelAddedEvent,\n DockPanelDragStartEvent,\n DockPanelRemovedEvent,\n DockPanelTearOutEvent,\n};\n\nexport interface DockHostElementEventMap {\n 'dock-change': DockChangeEvent;\n 'dock-panel-added': DockPanelAddedEvent;\n 'dock-panel-removed': DockPanelRemovedEvent;\n 'dock-panel-activated': DockPanelActivatedEvent;\n 'dock-panel-drag-start': DockPanelDragStartEvent;\n /** Panel released outside every host — request to move it to a new window. */\n 'dock-panel-tear-out': DockPanelTearOutEvent;\n /** Drag pointer left every host's bounds during a drag. */\n 'dock-panel-drag-out': DockDragBoundaryEvent;\n /** Drag pointer re-entered a host's bounds after being outside. */\n 'dock-panel-drag-in': DockDragBoundaryEvent;\n}\n\n/** Fraction of the leaf rect (from each edge) that forms the split bands. */\nconst BAND = 0.25;\n\n/** Pointer movement threshold before a press becomes a dock drag (matches tab-list). */\nconst DRAG_THRESHOLD_PX = 5;\n\n/** Tolerance (px) when matching a child gutter endpoint to a parent gutter line. */\nconst JUNCTION_TOL_PX = 6;\n\n/** Junction points closer than this merge into one handle (a 4-way cross yields one per side). */\nconst JUNCTION_MERGE_PX = 8;\n\ninterface DockJunctionTarget {\n split: SplitLayoutElement;\n gutterIndex: number;\n}\n\n/** A point where a parent split's gutter line crosses a nested split's gutter. */\ninterface DockJunction {\n /** Host-relative coordinates. */\n x: number;\n y: number;\n targets: DockJunctionTarget[];\n}\n\n@customElement(`ixfx-dock-host`)\nexport class DockHostElement extends LitElement {\n /** Initial layout as `DockLayout` JSON. Absent ⇒ all pooled panels go into one root stack. */\n @property({ type: String, attribute: `layout` })\n layout: string | null = null;\n\n /**\n * Space-separated drop operations this host allows: `tabs`, `horizontal`,\n * `vertical`, and convenience `all`. `\"\"` / `none` ⇒ nothing may be dropped.\n */\n @property({ type: String, attribute: `accepts` })\n accepts = `tabs horizontal vertical`;\n\n /**\n * When true, panels can be freely reorganised within this host, but\n * cannot be dragged out to another host.\n */\n @property({ type: Boolean, attribute: `isolated` })\n isolated = false;\n\n /** Finest-grained veto, consulted per candidate zone. */\n @property({ attribute: false })\n canAccept: ((panelId: string, op: DockOperation) => boolean) | undefined;\n\n @state()\n private _model: DockNode = createStack([]);\n\n @state()\n private _pool: DockPanelElement[] = [];\n\n @state()\n private _dropZone: DockDropZone | null = null;\n\n @state()\n private _dragActive = false;\n\n @state()\n private _junctions: DockJunction[] = [];\n\n /** panelId → toolbar nodes currently moved out into a tab item. */\n private _toolbarsOut: Map<string, HTMLElement[]> = new Map();\n\n /**\n * Placement policy per named leaf: `{ allow, deny }` kind sets plus an\n * `allowEdgeSplit` gate (default `true`). Host-level only — never serialized\n * into the layout, but kept across `loadLayout()` calls. Existing panels are\n * grandfathered; rules govern future placements (drags, `addPanel`,\n * re-homing). See {@link setLeafPlacementPolicy}.\n */\n private _leafContentRules: Map<string, { allow: Set<string> | null; deny: Set<string>; allowEdgeSplit: boolean }> = new Map();\n\n private _tabDragPending: { panelId: string; pointerId: number; startX: number; startY: number } | null = null;\n\n private _junctionsKey = ``;\n private _junctionsRaf: number | null = null;\n private _hostResizeObserver: ResizeObserver | null = null;\n\n /** `toolbar-<name>` slot names currently provided as light-DOM children. */\n private _toolbarSlots: Set<string> = new Set();\n private _toolbarObserver: MutationObserver | null = null;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this._buildInitialModel();\n registerDockHost(this);\n this.addEventListener(`dock-panel-drag-start`, this._onDragStart as EventListener);\n this._hostResizeObserver = new ResizeObserver(() => this._scheduleJunctions());\n this._hostResizeObserver.observe(this);\n this._scanToolbarSlots();\n this._toolbarObserver = new MutationObserver(() => this._scanToolbarSlots());\n this._toolbarObserver.observe(this, { childList: true, subtree: true, attributes: true, attributeFilter: [`slot`] });\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n unregisterDockHost(this);\n this.removeEventListener(`dock-panel-drag-start`, this._onDragStart as EventListener);\n this._toolbarObserver?.disconnect();\n this._toolbarObserver = null;\n this._hostResizeObserver?.disconnect();\n this._hostResizeObserver = null;\n if (this._junctionsRaf !== null) {\n cancelAnimationFrame(this._junctionsRaf);\n this._junctionsRaf = null;\n }\n this._junctions = [];\n this._junctionsKey = ``;\n this._returnAllToolbars();\n }\n\n private _onDragStart = (event: DockPanelDragStartEvent): void => {\n const { panelId, pointerId, clientX, clientY } = event.detail;\n startDrag(panelId, this, pointerId, clientX, clientY, this._findPanelEl(panelId)?.kind);\n };\n\n override willUpdate(changed: Map<string, unknown>): void {\n super.willUpdate(changed);\n if (changed.has(`layout`) && this.layout !== null) {\n const parsed = parseLayout(this.layout);\n if (parsed) {\n this._model = parsed.root;\n this._mergePoolIntoModel();\n }\n }\n }\n\n override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n this._syncSlots();\n this._syncToolbars();\n this._scheduleJunctions();\n }\n\n // ── Model setup ──────────────────────────────────────────────────────────\n\n private _buildInitialModel(): void {\n if (this.layout !== null) {\n const parsed = parseLayout(this.layout);\n if (parsed) {\n this._model = parsed.root;\n this._mergePoolIntoModel();\n return;\n }\n }\n this._model = createStack([]);\n this._mergePoolIntoModel();\n }\n\n /** Ensure every pooled panel element appears in the model (appended to the first stack). */\n private _mergePoolIntoModel(): void {\n const known = new Set(collectPanelIds(this._model));\n let changed = false;\n for (const el of this._scanPanels()) {\n if (!known.has(el.panelId)) {\n this._appendPanelToFirstStack(el.panelId);\n known.add(el.panelId);\n changed = true;\n }\n }\n if (changed) {\n normalize(this._model);\n }\n }\n\n private _scanPanels(): DockPanelElement[] {\n return Array.from(this.children).filter((el): el is DockPanelElement =>\n el instanceof HTMLElement && el.tagName === `IXFX-DOCK-PANEL` && Boolean((el as DockPanelElement).panelId),\n );\n }\n\n /** Refresh the set of provided `toolbar-<name>` slots; re-render on change. */\n private _scanToolbarSlots(): void {\n const found = new Set<string>();\n for (const child of this.children) {\n if (!(child instanceof HTMLElement))\n continue;\n const slot = child.getAttribute(`slot`) ?? ``;\n if (slot.startsWith(`toolbar-`) && slot.length > `toolbar-`.length) {\n found.add(slot);\n }\n }\n if (found.size !== this._toolbarSlots.size || [...found].some(s => !this._toolbarSlots.has(s))) {\n this._toolbarSlots = found;\n this.requestUpdate();\n }\n }\n\n private _findPanelEl(panelId: string): DockPanelElement | undefined {\n return this._pool.find(p => p.panelId === panelId)\n ?? this._scanPanels().find(p => p.panelId === panelId);\n }\n\n private _firstStack(): DockStackNode {\n const paths = collectStackPaths(this._model);\n const node = paths.length > 0 ? findNode(this._model, paths[0]) : null;\n if (node !== null && isStack(node))\n return node;\n const fresh = createStack([]);\n wrapRoot(this._model, `row`, fresh, `after`);\n normalize(this._model);\n return fresh;\n }\n\n private _appendPanelToFirstStack(panelId: string): void {\n const kind = this._panelKind(panelId);\n if (this._model.kind === `stack` && this._stackAllowsKind(this._model, kind)) {\n addPanelToStack(this._model, panelId);\n return;\n }\n addPanelToStack(this._firstStackAllowing(kind), panelId);\n }\n\n /** Normalized content kind of a panel (`'any'` when unknown/unset). */\n private _panelKind(panelId: string): string {\n return normalizeKind(this._findPanelEl(panelId)?.kind);\n }\n\n /** Whether `kind` may live in `stack` under the current leaf rules. */\n private _stackAllowsKind(stack: DockStackNode, kind: string): boolean {\n if (stack.name === undefined) {\n return true;\n }\n const rules = this._leafContentRules.get(stack.name);\n if (rules === undefined) {\n return true;\n }\n if (rules.deny.has(kind)) {\n return false;\n }\n return rules.allow === null || rules.allow.has(kind);\n }\n\n /**\n * Whether an edge drop may split a new sibling leaf beside `stack`. Unnamed\n * leaves and leaves with no policy always allow it; a named leaf whose\n * policy sets `allowEdgeSplit: false` does not (strict named-area\n * containment).\n */\n private _leafAllowsEdgeSplit(stack: DockStackNode): boolean {\n if (stack.name === undefined) {\n return true;\n }\n return this._leafContentRules.get(stack.name)?.allowEdgeSplit ?? true;\n }\n\n /** First stack (tree order) whose rules admit `kind`, else the first stack. */\n private _firstStackAllowing(kind: string): DockStackNode {\n for (const path of collectStackPaths(this._model)) {\n const node = findNode(this._model, path);\n if (node !== null && isStack(node) && this._stackAllowsKind(node, kind)) {\n return node;\n }\n }\n console.warn(`[ixfx-dock-host] no leaf admits kind \"${kind}\", using first stack`);\n return this._firstStack();\n }\n\n private _onPoolSlotChange = (): void => {\n this._syncPool();\n };\n\n private _syncPool(): void {\n // Scan the light DOM for all panel elements — panels placed in the model\n // carry named slots and are therefore NOT assigned to the pool slot.\n const current = this._scanPanels();\n const currentIds = new Set(current.map(p => p.panelId));\n let structuralChange = false;\n\n // Removed from DOM → drop from model\n for (const el of [...this._pool]) {\n if (!currentIds.has(el.panelId)) {\n this._toolbarsOut.delete(el.panelId);\n this._removeFromModel(el.panelId);\n this.dispatchEvent(new CustomEvent<{ panelId: string }>(`dock-panel-removed`, {\n detail: { panelId: el.panelId },\n bubbles: true,\n composed: true,\n }));\n structuralChange = true;\n }\n }\n\n // New in DOM → add to model\n for (const el of current) {\n if (!collectPanelIds(this._model).includes(el.panelId)) {\n this._appendPanelToFirstStack(el.panelId);\n normalize(this._model);\n this.dispatchEvent(new CustomEvent<{ panelId: string }>(`dock-panel-added`, {\n detail: { panelId: el.panelId },\n bubbles: true,\n composed: true,\n }));\n structuralChange = true;\n }\n }\n\n this._pool = current;\n this.requestUpdate();\n if (structuralChange) {\n this._emitChange();\n }\n }\n\n // ── Public API ───────────────────────────────────────────────────────────\n\n /** Serialize the current layout, folding live split weights from the DOM. */\n saveLayout(): DockLayout {\n this._foldLiveWeights();\n return serializeLayout(this._model);\n }\n\n loadLayout(layout: DockLayout): void {\n this._returnAllToolbars();\n this._model = normalize(cloneNode(layout.root));\n this._mergePoolIntoModel();\n this.requestUpdate();\n this._emitChange();\n }\n\n /**\n * Dock a panel. Returns false (without touching the DOM) when the\n * explicitly targeted container denies the panel's `kind`.\n */\n addPanel(panel: DockPanelElement | DockPanelInit, target?: DockAddPanelTarget): boolean {\n const kind = panel instanceof HTMLElement ? normalizeKind(panel.kind) : normalizeKind(panel.kind);\n const op = target?.op ?? `tabs`;\n\n // Resolve an explicit target first so kind denials can refuse cleanly.\n let stackPath: number[] | null = null;\n let splitTarget: number[] | null = null;\n if (target?.container !== undefined) {\n const namedPath = findStackPathByName(this._model, target.container);\n if (namedPath === null) {\n console.warn(`[ixfx-dock-host] addPanel: unknown container \"${target.container}\", appending to first admitting stack`);\n } else if (op === `tabs` && !this._stackAllowsKindAt(namedPath, kind)) {\n console.warn(`[ixfx-dock-host] addPanel: container \"${target.container}\" does not admit kind \"${kind}\"`);\n return false;\n } else if (op !== `tabs` && !this._stackAllowsEdgeSplitAt(namedPath)) {\n console.warn(`[ixfx-dock-host] addPanel: container \"${target.container}\" forbids edge splits (allowEdgeSplit: false)`);\n return false;\n } else {\n stackPath = namedPath;\n }\n } else if (target?.stack) {\n const found = findStackOf(this._model, target.stack);\n if (found === null) {\n console.warn(`[ixfx-dock-host] addPanel: unknown stack panel \"${target.stack}\", appending to first admitting stack`);\n } else if (op === `tabs` && !this._stackAllowsKindAt(found, kind)) {\n console.warn(`[ixfx-dock-host] addPanel: target stack does not admit kind \"${kind}\"`);\n return false;\n } else if (op !== `tabs` && !this._stackAllowsEdgeSplitAt(found)) {\n console.warn(`[ixfx-dock-host] addPanel: target stack forbids edge splits (allowEdgeSplit: false)`);\n return false;\n } else {\n stackPath = found;\n }\n }\n if (stackPath !== null && op !== `tabs`) {\n splitTarget = stackPath;\n stackPath = null;\n }\n\n let el: DockPanelElement;\n if (panel instanceof HTMLElement) {\n el = panel as DockPanelElement;\n } else {\n el = document.createElement(`ixfx-dock-panel`) as DockPanelElement;\n el.panelId = panel.panelId;\n if (panel.title !== undefined)\n el.title = panel.title;\n if (panel.iconName !== undefined)\n el.iconName = panel.iconName;\n if (panel.closable !== undefined)\n el.closable = panel.closable;\n if (panel.collapsible !== undefined)\n el.collapsible = panel.collapsible;\n if (panel.kind !== undefined)\n el.kind = panel.kind;\n }\n\n if (el.parentElement !== this) {\n this.appendChild(el);\n }\n if (!this._pool.some(p => p.panelId === el.panelId)) {\n this._pool = [...this._pool, el];\n }\n\n this._returnAllToolbars();\n\n // Moves are idempotent: drop an existing entry before re-inserting.\n if (collectPanelIds(this._model).includes(el.panelId)) {\n this._removeFromModel(el.panelId);\n }\n\n if (splitTarget !== null) {\n insertBeside(this._model, splitTarget, opToDirection(op), createStack([el.panelId]), `after`);\n } else if (stackPath !== null) {\n const stack = findNode(this._model, stackPath);\n if (stack !== null && isStack(stack)) {\n addPanelToStack(stack, el.panelId, target?.index);\n }\n } else {\n this._appendPanelToFirstStack(el.panelId);\n }\n\n normalize(this._model);\n this.requestUpdate();\n\n this.dispatchEvent(new CustomEvent<{ panelId: string }>(`dock-panel-added`, {\n detail: { panelId: el.panelId },\n bubbles: true,\n composed: true,\n }));\n this._emitChange();\n return true;\n }\n\n /** Whether the stack at `stackPath` admits `kind` under the leaf rules. */\n private _stackAllowsKindAt(stackPath: number[], kind: string): boolean {\n const stack = findNode(this._model, stackPath);\n return stack !== null && isStack(stack) && this._stackAllowsKind(stack, kind);\n }\n\n /** Whether the stack at `stackPath` permits an edge split beside it. */\n private _stackAllowsEdgeSplitAt(stackPath: number[]): boolean {\n const stack = findNode(this._model, stackPath);\n return stack === null || !isStack(stack) || this._leafAllowsEdgeSplit(stack);\n }\n\n removePanel(panelId: string): boolean {\n if (!collectPanelIds(this._model).includes(panelId))\n return false;\n\n this._returnAllToolbars();\n this._removeFromModel(panelId);\n this._pool = this._pool.filter(p => p.panelId !== panelId);\n this._toolbarsOut.delete(panelId);\n\n const el = this._scanPanels().find(p => p.panelId === panelId);\n el?.remove();\n\n normalize(this._model);\n this.requestUpdate();\n\n this.dispatchEvent(new CustomEvent<{ panelId: string }>(`dock-panel-removed`, {\n detail: { panelId },\n bubbles: true,\n composed: true,\n }));\n this._emitChange();\n return true;\n }\n\n activatePanel(panelId: string): boolean {\n const stackPath = findStackOf(this._model, panelId);\n if (stackPath === null)\n return false;\n const stack = findNode(this._model, stackPath);\n if (stack === null || !isStack(stack))\n return false;\n if (!setActive(stack, panelId))\n return false;\n\n this.requestUpdate();\n this.dispatchEvent(new CustomEvent<{ panelId: string }>(`dock-panel-activated`, {\n detail: { panelId },\n bubbles: true,\n composed: true,\n }));\n return true;\n }\n\n getPanelIds(): string[] {\n return collectPanelIds(this._model);\n }\n\n /** Names of every named stack leaf, in tree order. */\n getContainerNames(): string[] {\n return collectContainerNames(this._model);\n }\n\n /**\n * Snapshot of a named container (`{ name, panels, active }`), or null when\n * no stack carries that name. First match wins when duplicated.\n */\n getContainer(name: string): { name: string; panels: string[]; active: string } | null {\n const path = findStackPathByName(this._model, name);\n if (path === null)\n return null;\n const node = findNode(this._model, path);\n if (node === null || !isStack(node) || node.name === undefined)\n return null;\n return { name: node.name, panels: [...node.panels], active: node.active };\n }\n\n /** Panel-ids in a named container, in tab order (`[]` when unknown/empty). */\n getContainerPanels(name: string): string[] {\n return this.getContainer(name)?.panels ?? [];\n }\n\n /** Panel elements in a named container, in tab order — for iterating children. */\n getContainerElements(name: string): DockPanelElement[] {\n return this.getContainerPanels(name)\n .map(id => this._findPanelEl(id))\n .filter((el): el is DockPanelElement => el !== undefined);\n }\n\n // ── Leaf placement policy (kind rules + edge-split gate) ─────────────────\n\n private _defaultLeafRule(): { allow: Set<string> | null; deny: Set<string>; allowEdgeSplit: boolean } {\n return { allow: null, deny: new Set<string>(), allowEdgeSplit: true };\n }\n\n /** A rule entry that constrains nothing — safe to drop from the map. */\n private _isEmptyLeafRule(entry: { allow: Set<string> | null; deny: Set<string>; allowEdgeSplit: boolean }): boolean {\n return entry.allow === null && entry.deny.size === 0 && entry.allowEdgeSplit;\n }\n\n private _warnUnknownContainer(method: string, key: string): void {\n if (findStackPathByName(this._model, key) === null) {\n console.warn(`[ixfx-dock-host] ${method}: no container named \"${key}\" yet; rule stored`);\n }\n }\n\n /**\n * Restrict a named container to only the given panel kinds — e.g.\n * `setLeafExclusiveContents('editor', ['document'])`. `tabs` drops,\n * `addPanel`, and re-homing into the leaf then refuse other kinds. Whether\n * edge splits beside the leaf are offered is governed separately by\n * {@link setLeafPlacementPolicy}'s `allowEdgeSplit` (default `true`).\n * Pass `[]` to seal the leaf (nothing admitted). Warns when no stack\n * currently carries `name`, but the rule is still stored and applies once\n * one appears. Rules are host policy: kept across `loadLayout()`, never\n * serialized.\n */\n setLeafExclusiveContents(name: string, kinds: readonly string[]): void {\n const key = name.trim();\n if (!key) {\n console.warn(`[ixfx-dock-host] setLeafExclusiveContents: empty container name`);\n return;\n }\n const entry = this._leafContentRules.get(key) ?? this._defaultLeafRule();\n entry.allow = new Set(kinds.map(k => k.trim()).filter(k => k.length > 0));\n this._leafContentRules.set(key, entry);\n this._warnUnknownContainer(`setLeafExclusiveContents`, key);\n }\n\n /**\n * Forbid the given panel kinds in a named container — e.g.\n * `setLeafDenyContents('footer', ['files', 'document'])`. Everything else\n * stays admitted. Pass `[]` to lift the denial. See\n * {@link setLeafExclusiveContents} for scope/ordering notes.\n */\n setLeafDenyContents(name: string, kinds: readonly string[]): void {\n const key = name.trim();\n if (!key) {\n console.warn(`[ixfx-dock-host] setLeafDenyContents: empty container name`);\n return;\n }\n const entry = this._leafContentRules.get(key) ?? this._defaultLeafRule();\n entry.deny = new Set(kinds.map(k => k.trim()).filter(k => k.length > 0));\n if (this._isEmptyLeafRule(entry)) {\n this._leafContentRules.delete(key);\n } else {\n this._leafContentRules.set(key, entry);\n }\n this._warnUnknownContainer(`setLeafDenyContents`, key);\n }\n\n /**\n * Set (merge) the full placement policy for a named leaf: kind allow/deny\n * lists plus the `allowEdgeSplit` gate. Omitted fields are left unchanged\n * — pass `clearLeafPlacementPolicy(name)` to reset. `allowKinds` /\n * `denyKinds` are equivalent to {@link setLeafExclusiveContents} /\n * {@link setLeafDenyContents} and share the same storage.\n *\n * `allowEdgeSplit: false` enforces strict named-area containment: the edge\n * drop zones beside the leaf go inert for every placement route (pointer\n * preview and drop, `queryDropTarget` / `previewExternalDrop`,\n * `addPanel` with a split `op`), so a panel cannot escape the area by\n * splitting next to it. A permitted split still creates an *unnamed,\n * unconstrained* leaf — the policy is not propagated to it.\n *\n * Warns when no stack currently carries `name`; the policy is stored and\n * applies once one appears. Host policy: kept across `loadLayout()`, never\n * serialized.\n */\n setLeafPlacementPolicy(name: string, policy: DockLeafPlacementPolicy): void {\n const key = name.trim();\n if (!key) {\n console.warn(`[ixfx-dock-host] setLeafPlacementPolicy: empty container name`);\n return;\n }\n const entry = this._leafContentRules.get(key) ?? this._defaultLeafRule();\n if (policy.allowKinds !== undefined) {\n entry.allow = new Set(policy.allowKinds.map(k => k.trim()).filter(k => k.length > 0));\n }\n if (policy.denyKinds !== undefined) {\n entry.deny = new Set(policy.denyKinds.map(k => k.trim()).filter(k => k.length > 0));\n }\n if (policy.allowEdgeSplit !== undefined) {\n entry.allowEdgeSplit = policy.allowEdgeSplit;\n }\n if (this._isEmptyLeafRule(entry)) {\n this._leafContentRules.delete(key);\n } else {\n this._leafContentRules.set(key, entry);\n }\n this._warnUnknownContainer(`setLeafPlacementPolicy`, key);\n }\n\n /** Remove every content rule and reset the edge-split gate for a named container. */\n clearLeafContentRestrictions(name: string): void {\n this._leafContentRules.delete(name.trim());\n }\n\n /** Alias of {@link clearLeafContentRestrictions} — clears kind rules and the edge-split gate. */\n clearLeafPlacementPolicy(name: string): void {\n this._leafContentRules.delete(name.trim());\n }\n\n /** Copy of a container's kind rules, or null when unrestricted. */\n getLeafContentRestrictions(name: string): DockLeafContentRules | null {\n const rules = this._leafContentRules.get(name.trim());\n if (rules === undefined) {\n return null;\n }\n return { allow: rules.allow === null ? null : [...rules.allow], deny: [...rules.deny] };\n }\n\n /** Resolved placement policy for a container, or null when it has none. */\n getLeafPlacementPolicy(name: string): DockLeafPlacementPolicyResolved | null {\n const rules = this._leafContentRules.get(name.trim());\n if (rules === undefined) {\n return null;\n }\n return {\n allowKinds: rules.allow === null ? null : [...rules.allow],\n denyKinds: [...rules.deny],\n allowEdgeSplit: rules.allowEdgeSplit,\n };\n }\n\n // ── Spatial (leaf geometry + moves) ──────────────────────────────────────\n\n /**\n * Geometric neighbours of a leaf (`name` or numeric `path`) — what sits\n * above / below / left / right of it on screen. Each entry is\n * `{ name, path }` (`name` is null for unnamed leaves), ordered\n * most-overlapping first. Returns null when the leaf is unknown.\n */\n getNeighbours(leaf: DockLeafRef): DockNeighbours | null {\n return getLeafNeighbours(this._model, leaf);\n }\n\n /**\n * Move a leaf one position in `direction`, swapping with the neighbour it\n * shares the longest edge with (both keep the remaining structure intact).\n * Returns false when the leaf is unknown or nothing adjoins that way.\n */\n moveLeaf(leaf: DockLeafRef, direction: DockDirection): boolean {\n if (!moveLeafStep(this._model, leaf, direction)) {\n return false;\n }\n this._commit();\n return true;\n }\n\n /**\n * Move a leaf to an edge of the overall layout (e.g. toggle a sidebar from\n * `left` to `right`). The rest of the layout stays intact as a single\n * subtree and the leaf keeps its absolute size along the target axis.\n * Returns false when the leaf is unknown or the layout holds one leaf.\n */\n moveLeafToEdge(leaf: DockLeafRef, edge: DockEdge): boolean {\n if (!moveLeafNodeToEdge(this._model, leaf, edge)) {\n return false;\n }\n this._commit();\n return true;\n }\n\n // ── Cross-window (tear-out / tear-in) ───────────────────────────────────\n //\n // The shared drag coordinator is per-document, so it never spans separate\n // windows / `BrowserWindow`s / `WebContentsView`s. These methods give an\n // outer coordinator (e.g. an Electron main process talking over IPC) the\n // hooks to move a panel between windows: capture a serializable snapshot on\n // one side, hit-test and recreate it on the other. See the README.\n\n /**\n * Capture a structured-clone-safe {@link DockPanelSnapshot} of a panel\n * (identity, chrome attributes, and a best-effort `innerHTML`). Returns\n * null when no such panel element is known to this host.\n */\n getPanelSnapshot(panelId: string): DockPanelSnapshot | null {\n const el = this._findPanelEl(panelId);\n if (el === undefined)\n return null;\n return {\n panelId: el.panelId,\n title: el.title,\n iconName: el.iconName,\n closable: el.closable,\n collapsible: el.collapsible,\n kind: normalizeKind(el.kind),\n accepts: el.accepts,\n contentHTML: el.innerHTML,\n };\n }\n\n /**\n * {@link getPanelSnapshot} + {@link removePanel} in one step: take the\n * snapshot, then drop the panel (and its element) from this host. Call this\n * from a `dock-panel-tear-out` handler once the receiving window has\n * recreated the panel.\n */\n detachPanel(panelId: string): DockPanelSnapshot | null {\n const snapshot = this.getPanelSnapshot(panelId);\n if (snapshot === null)\n return null;\n this.removePanel(panelId);\n return snapshot;\n }\n\n /**\n * Hit-test viewport coordinates against this host and return a plain,\n * serializable {@link DockDropTarget} (no element references) — or null when\n * the point is outside the host or the resulting zone is disallowed by\n * `accepts` / `canAccept`. Pure query: no model mutation, no overlay.\n *\n * `panelId` is passed to `canAccept`; use any stable id for an external\n * panel (defaults to `\"__external__\"`). `kind` covers leaf content rules\n * for panels unknown to this host (defaults to `'any'`).\n */\n queryDropTarget(clientX: number, clientY: number, panelId = `__external__`, kind?: string): DockDropTarget | null {\n const zone = this.computeDropZone(clientX, clientY, panelId, kind);\n return zone === null ? null : zoneToTarget(zone);\n }\n\n /**\n * Like {@link queryDropTarget}, but also shows the drop overlay so an\n * external (cross-window) drag gets the same visual feedback as an in-page\n * one. Call on every pointer update from the outer coordinator, then\n * {@link endExternalDrop} when the drag leaves or ends.\n */\n previewExternalDrop(clientX: number, clientY: number, panelId = `__external__`, kind?: string): DockDropTarget | null {\n this.setDragActive(true);\n const zone = this.computeDropZone(clientX, clientY, panelId, kind);\n this.setDropZone(zone);\n return zone === null ? null : zoneToTarget(zone);\n }\n\n /** Clear any overlay left by {@link previewExternalDrop}. */\n endExternalDrop(): void {\n this.setDropZone(null);\n this.setDragActive(false);\n }\n\n /**\n * Recreate a panel from a {@link DockPanelSnapshot} (or a bare\n * {@link DockPanelInit}) and dock it. With `at` viewport coordinates the\n * panel lands where a drop there would put it (respecting `accepts` /\n * `canAccept` and leaf content rules); without them, or when the point\n * misses the host, it goes into the first stack admitting its kind.\n * Returns the created element, or null when a panel\n * with that id is already docked here.\n */\n acceptExternalPanel(\n snapshot: DockPanelSnapshot | DockPanelInit,\n at?: { clientX: number; clientY: number },\n ): DockPanelElement | null {\n if (collectPanelIds(this._model).includes(snapshot.panelId))\n return null;\n\n const el = document.createElement(`ixfx-dock-panel`) as DockPanelElement;\n el.panelId = snapshot.panelId;\n if (snapshot.title !== undefined)\n el.title = snapshot.title;\n if (snapshot.iconName !== undefined)\n el.iconName = snapshot.iconName;\n if (snapshot.closable !== undefined)\n el.closable = snapshot.closable;\n if (snapshot.collapsible !== undefined)\n el.collapsible = snapshot.collapsible;\n if (`kind` in snapshot && snapshot.kind !== undefined)\n el.kind = snapshot.kind;\n if (`accepts` in snapshot && snapshot.accepts)\n el.setAttribute(`accepts`, snapshot.accepts);\n if (`contentHTML` in snapshot && snapshot.contentHTML)\n el.innerHTML = snapshot.contentHTML;\n\n this._returnAllToolbars();\n this.appendChild(el);\n this._pool = [...this._pool, el];\n this._appendPanelToFirstStack(el.panelId);\n normalize(this._model);\n\n this.endExternalDrop();\n const zone = at ? this.computeDropZone(at.clientX, at.clientY, el.panelId) : null;\n if (zone !== null) {\n this._applyZone(el.panelId, zone);\n }\n\n normalize(this._model);\n this.requestUpdate();\n this.dispatchEvent(new CustomEvent<{ panelId: string }>(`dock-panel-added`, {\n detail: { panelId: el.panelId },\n bubbles: true,\n composed: true,\n }));\n this._emitChange();\n return el;\n }\n\n // ── Drop targeting (called by the drag coordinator) ──────────────────────\n\n /**\n * Hit-test a pointer position against this host's leaves and edges. Returns\n * a zone with rects relative to the host, or null when the pointer is\n * outside the host or the candidate zone is disallowed.\n */\n computeDropZone(clientX: number, clientY: number, panelId: string, kind?: string): DockDropZone | null {\n const hostRect = this.getBoundingClientRect();\n if (clientX < hostRect.left || clientX > hostRect.right\n || clientY < hostRect.top || clientY > hostRect.bottom) {\n return null;\n }\n // Explicit kind wins (cross-host / external drags); otherwise read the\n // panel element, defaulting to `'any'` for unknown panels.\n const resolvedKind = kind?.trim() ? kind.trim() : this._panelKind(panelId);\n const rel = (r: DOMRect): Rect => ({\n x: r.left - hostRect.left,\n y: r.top - hostRect.top,\n w: r.width,\n h: r.height,\n });\n\n // Leaf under the pointer?\n for (const path of collectStackPaths(this._model)) {\n const leaf = this.shadowRoot?.querySelector(`[data-dock-path=\"${path.join(`-`)}\"]`) as HTMLElement | null;\n if (!leaf)\n continue;\n const leafRect = leaf.getBoundingClientRect();\n if (clientX < leafRect.left || clientX > leafRect.right\n || clientY < leafRect.top || clientY > leafRect.bottom) {\n continue;\n }\n\n const stack = findNode(this._model, path);\n if (stack === null || !isStack(stack))\n continue;\n\n // Tab strip has priority over the leaf body\n const strip = leaf.querySelector(`ixfx-tab-list`);\n if (strip !== null) {\n const stripRect = strip.getBoundingClientRect();\n if (clientX >= stripRect.left && clientX <= stripRect.right\n && clientY >= stripRect.top && clientY <= stripRect.bottom) {\n const gapIndex = computeStripGapIndex(strip, clientX, clientY);\n const zone: DockDropZone = {\n host: this,\n operation: `tabs`,\n targetPath: path,\n side: `after`,\n gapIndex,\n rect: rel(leafRect),\n caretRect: this._stripCaretRect(strip, gapIndex, hostRect),\n };\n return this._zoneAllowed(panelId, zone, resolvedKind) ? zone : null;\n }\n }\n\n const relX = (clientX - leafRect.left) / Math.max(leafRect.width, 1);\n const relY = (clientY - leafRect.top) / Math.max(leafRect.height, 1);\n\n if (relX >= BAND && relX <= 1 - BAND && relY >= BAND && relY <= 1 - BAND) {\n const zone: DockDropZone = {\n host: this,\n operation: `tabs`,\n targetPath: path,\n side: `after`,\n gapIndex: stack.panels.length,\n rect: rel(leafRect),\n };\n return this._zoneAllowed(panelId, zone, resolvedKind) ? zone : null;\n }\n\n const r: Rect = rel(leafRect);\n let operation: DockOperation;\n let side: `before` | `after`;\n let zoneRect: Rect;\n if (relX < BAND) {\n operation = `split-vertical`;\n side = `before`;\n zoneRect = { ...r, w: r.w / 2 };\n } else if (relX > 1 - BAND) {\n operation = `split-vertical`;\n side = `after`;\n zoneRect = { x: r.x + r.w / 2, y: r.y, w: r.w / 2, h: r.h };\n } else if (relY < BAND) {\n operation = `split-horizontal`;\n side = `before`;\n zoneRect = { ...r, h: r.h / 2 };\n } else {\n operation = `split-horizontal`;\n side = `after`;\n zoneRect = { x: r.x, y: r.y + r.h / 2, w: r.w, h: r.h / 2 };\n }\n const zone: DockDropZone = { host: this, operation, targetPath: path, side, rect: zoneRect };\n return this._zoneAllowed(panelId, zone, resolvedKind) ? zone : null;\n }\n\n // Outside every leaf: split the root against the nearest host edge\n const fromLeft = clientX - hostRect.left;\n const fromRight = hostRect.right - clientX;\n const fromTop = clientY - hostRect.top;\n const fromBottom = hostRect.bottom - clientY;\n const min = Math.min(fromLeft, fromRight, fromTop, fromBottom);\n const full: Rect = { x: 0, y: 0, w: hostRect.width, h: hostRect.height };\n\n let operation: DockOperation;\n let side: `before` | `after`;\n let zoneRect: Rect;\n if (min === fromLeft) {\n operation = `split-vertical`;\n side = `before`;\n zoneRect = { ...full, w: full.w / 2 };\n } else if (min === fromRight) {\n operation = `split-vertical`;\n side = `after`;\n zoneRect = { x: full.x + full.w / 2, y: full.y, w: full.w / 2, h: full.h };\n } else if (min === fromTop) {\n operation = `split-horizontal`;\n side = `before`;\n zoneRect = { ...full, h: full.h / 2 };\n } else {\n operation = `split-horizontal`;\n side = `after`;\n zoneRect = { x: full.x, y: full.y + full.h / 2, w: full.w, h: full.h / 2 };\n }\n const zone: DockDropZone = { host: this, operation, targetPath: [], side, rect: zoneRect };\n return this._zoneAllowed(panelId, zone, resolvedKind) ? zone : null;\n }\n\n private _zoneAllowed(panelId: string, zone: DockDropZone, kind?: string): boolean {\n if (!tokenAllows(this.accepts, operationToToken(zone.operation)))\n return false;\n\n // Per-panel restriction applies only when the drop target is a solo leaf\n const stack = findNode(this._model, zone.targetPath);\n if (stack !== null && isStack(stack) && stack.panels.length === 1) {\n const target = this._findPanelEl(stack.panels[0]);\n if (target && !panelAllows(target.accepts, operationToToken(zone.operation))) {\n return false;\n }\n }\n\n // Leaf content rules govern tabbing *into* a leaf.\n if (zone.operation === `tabs` && stack !== null && isStack(stack)) {\n if (!this._stackAllowsKind(stack, kind?.trim() ? kind.trim() : this._panelKind(panelId))) {\n return false;\n }\n }\n\n // Named-area containment: an edge split creates a new sibling leaf, so it\n // stays allowed *unless* the named leaf's policy sets `allowEdgeSplit:\n // false` — then the edge zones beside it go inert.\n if (zone.operation !== `tabs` && stack !== null && isStack(stack) && !this._leafAllowsEdgeSplit(stack)) {\n return false;\n }\n\n if (this.canAccept && !this.canAccept(panelId, zone.operation)) {\n return false;\n }\n return true;\n }\n\n /**\n * Apply a drop. `sourceHost` differs from `this` when the drag crossed\n * hosts; the panel element is adopted into this host first.\n */\n handleDrop(panelId: string, zone: DockDropZone, sourceHost?: DockHostElement): void {\n if (sourceHost !== undefined && sourceHost !== this) {\n sourceHost.releasePanel(panelId, this);\n }\n\n if (!collectPanelIds(this._model).includes(panelId)) {\n const el = this._findPanelEl(panelId);\n if (!el)\n return;\n this._appendPanelToFirstStack(panelId);\n normalize(this._model);\n }\n\n // In-page moves may carry a vacated leaf's name to the merge target (so\n // merging tabs back together doesn't strand an empty named placeholder).\n // Cross-host drops skip this: their source here is just the temporary\n // adoption stack, not the leaf the panel came from.\n this._applyZone(panelId, zone, sourceHost === undefined || sourceHost === this);\n this._commit();\n }\n\n /**\n * Move `panelId` (already present somewhere in the model) to the position\n * described by `zone`. Shared by in-page drops and external panel adoption.\n */\n private _applyZone(panelId: string, zone: DockDropZone, transferName = false): void {\n const sourcePath = findStackOf(this._model, panelId);\n let vacated: DockStackNode | null = null;\n if (sourcePath !== null) {\n const source = findNode(this._model, sourcePath);\n if (source !== null && isStack(source)) {\n removePanelFromStack(source, panelId);\n if (source.panels.length === 0) {\n vacated = source;\n }\n }\n }\n\n if (zone.operation === `tabs`) {\n const target = findNode(this._model, zone.targetPath);\n if (target !== null && isStack(target)) {\n addPanelToStack(target, panelId, zone.gapIndex);\n // A tabs drop that empties a named stack into an unnamed one hands\n // the name over, so the merged leaf keeps the container identity\n // (and its content rules) instead of leaving a placeholder behind.\n if (transferName && vacated !== null && vacated !== target\n && vacated.name !== undefined && target.name === undefined) {\n target.name = vacated.name;\n delete vacated.name;\n }\n }\n } else {\n insertBeside(this._model, zone.targetPath, opToDirection(zone.operation), createStack([panelId]), zone.side);\n }\n }\n\n /**\n * Move a panel element out of this host into `target`, dropping it from\n * this host's model. Used for cross-host drags.\n */\n releasePanel(panelId: string, target: DockHostElement): void {\n this._returnAllToolbars();\n const el = this._pool.find(p => p.panelId === panelId);\n const stackPath = findStackOf(this._model, panelId);\n if (stackPath !== null) {\n const stack = findNode(this._model, stackPath);\n if (stack !== null && isStack(stack)) {\n removePanelFromStack(stack, panelId);\n }\n }\n normalize(this._model);\n this._pool = this._pool.filter(p => p !== el);\n if (el !== undefined) {\n target.adoptPanelElement(el);\n }\n this.requestUpdate();\n }\n\n /** Adopt a panel element from another host (the one sanctioned reparent). */\n adoptPanelElement(el: DockPanelElement): void {\n this.appendChild(el);\n if (!this._pool.some(p => p.panelId === el.panelId)) {\n this._pool = [...this._pool, el];\n }\n this._appendPanelToFirstStack(el.panelId);\n normalize(this._model);\n this.dispatchEvent(new CustomEvent<{ panelId: string }>(`dock-panel-added`, {\n detail: { panelId: el.panelId },\n bubbles: true,\n composed: true,\n }));\n }\n\n // ── Drag overlay (driven by the coordinator) ─────────────────────────────\n\n setDragActive(active: boolean): void {\n if (this._dragActive !== active) {\n this._dragActive = active;\n this.requestUpdate();\n }\n }\n\n setDropZone(zone: DockDropZone | null): void {\n if (this._dropZone !== zone) {\n this._dropZone = zone;\n this.requestUpdate();\n }\n }\n\n // ── Junction resize handles ──────────────────────────────────────────────\n\n private _scheduleJunctions(): void {\n if (this._junctionsRaf !== null)\n return;\n this._junctionsRaf = requestAnimationFrame(() => {\n this._junctionsRaf = null;\n this._computeJunctions();\n });\n }\n\n /**\n * Find points where a parent split's gutter line meets a nested split's\n * gutter (T and + crossings). Each junction handle starts both gutter drags\n * at once, like a corner resize in VS Code.\n */\n private _computeJunctions(): void {\n const shadow = this.shadowRoot;\n if (shadow === null)\n return;\n const hostRect = this.getBoundingClientRect();\n const found: DockJunction[] = [];\n\n for (const child of shadow.querySelectorAll<SplitLayoutElement>(`ixfx-split-layout`)) {\n // Nested splits are light children of their parent split\n const parent = child.parentElement?.closest<SplitLayoutElement>(`ixfx-split-layout`) ?? null;\n if (parent === null)\n continue;\n if (typeof child.getGutterRects !== `function` || typeof parent.getGutterRects !== `function`)\n continue;\n const childRect = child.getBoundingClientRect();\n\n for (const [pi, pg] of parent.getGutterRects().entries()) {\n for (const [ci, cg] of child.getGutterRects().entries()) {\n const pgVertical = pg.width <= pg.height;\n const cgVertical = cg.width <= cg.height;\n if (pgVertical === cgVertical)\n continue;\n let x: number;\n let y: number;\n if (pgVertical) {\n // Vertical parent line × horizontal child line: they meet where\n // the child's gutter endpoint abuts the parent's gutter.\n x = pg.left + pg.width / 2;\n y = cg.top + cg.height / 2;\n if (Math.abs(x - childRect.left) > JUNCTION_TOL_PX && Math.abs(x - childRect.right) > JUNCTION_TOL_PX)\n continue;\n if (y < pg.top || y > pg.bottom)\n continue;\n } else {\n y = pg.top + pg.height / 2;\n x = cg.left + cg.width / 2;\n if (Math.abs(y - childRect.top) > JUNCTION_TOL_PX && Math.abs(y - childRect.bottom) > JUNCTION_TOL_PX)\n continue;\n if (x < pg.left || x > pg.right)\n continue;\n }\n found.push({\n x: x - hostRect.left,\n y: y - hostRect.top,\n targets: [\n { split: parent, gutterIndex: pi },\n { split: child, gutterIndex: ci },\n ],\n });\n }\n }\n }\n\n // Merge coincident points so a 4-way cross is a single handle\n const merged: DockJunction[] = [];\n for (const j of found) {\n const near = merged.find(m => Math.abs(m.x - j.x) <= JUNCTION_MERGE_PX && Math.abs(m.y - j.y) <= JUNCTION_MERGE_PX);\n if (near === undefined) {\n merged.push(j);\n continue;\n }\n for (const t of j.targets) {\n if (!near.targets.some(o => o.split === t.split && o.gutterIndex === t.gutterIndex))\n near.targets.push(t);\n }\n }\n\n const key = merged\n .map(j => `${Math.round(j.x)},${Math.round(j.y)}:${j.targets.map(t => `${t.split.getAttribute(`data-dock-path`) ?? ``}#${t.gutterIndex}`).join(`|`)}`)\n .join(`;`);\n if (key === this._junctionsKey)\n return;\n this._junctionsKey = key;\n this._junctions = merged;\n }\n\n private _onJunctionPointerDown = (event: PointerEvent, junction: DockJunction): void => {\n if (event.button !== 0)\n return;\n event.preventDefault();\n event.stopPropagation();\n\n let started = false;\n for (const target of junction.targets) {\n if (!target.split.isConnected)\n continue;\n if (target.split.beginGutterDrag(target.gutterIndex, event.pointerId, event.clientX, event.clientY))\n started = true;\n }\n if (!started)\n return;\n\n // Swallow the trailing click so it cannot focus/select anything beneath.\n this._suppressNextClick();\n\n // Keep the handle following the intersection while both drags run.\n const follow = (): void => this._scheduleJunctions();\n const stop = (): void => {\n window.removeEventListener(`pointermove`, follow);\n window.removeEventListener(`pointerup`, stop);\n window.removeEventListener(`pointercancel`, stop);\n };\n window.addEventListener(`pointermove`, follow);\n window.addEventListener(`pointerup`, stop);\n window.addEventListener(`pointercancel`, stop);\n };\n\n // ── Split-element event consumption ──────────────────────────────────────\n\n /** Fold live weights from each rendered `ixfx-split-layout` into the model. */\n private _foldLiveWeights(): void {\n const splits = this.shadowRoot?.querySelectorAll<SplitLayoutElement>(`ixfx-split-layout[data-dock-path]`);\n if (splits === undefined)\n return;\n for (const el of splits) {\n const pathStr = el.getAttribute(`data-dock-path`);\n if (pathStr === null)\n continue;\n const node = findNode(this._model, parsePath(pathStr));\n if (node === null || !isSplit(node))\n continue;\n const live = Object.values(el.getSizes());\n if (live.length === node.children.length && !weightsEqual(live, node.sizes)) {\n node.sizes = live;\n }\n }\n }\n\n private _onSplitWeightsChanged = (): void => {\n // Live gutter weights; fold silently (no re-render, so drags aren't fought).\n this._foldLiveWeights();\n this._scheduleJunctions();\n };\n\n private _onSplitCollapsed = (event: Event, collapsed: boolean): void => {\n const detail = (event as CustomEvent<{ id?: string }>).detail;\n if (!detail?.id)\n return;\n const pathStr = this.shadowRoot?.getElementById(detail.id)?.getAttribute(`data-dock-path`);\n if (pathStr === null || pathStr === undefined)\n return;\n const node = findNode(this._model, parsePath(pathStr));\n if (node === null || !isStack(node))\n return;\n // Model mirrors the element; no re-render needed (attrs already match).\n if (collapsed) {\n node.collapsed = true;\n } else {\n delete node.collapsed;\n }\n };\n\n private _onSplitClose = (event: Event): void => {\n // Route leaf closes through the model so panel elements survive: each\n // panel re-homes into the first other stack admitting its kind (or the\n // pool when none does).\n event.preventDefault();\n const detail = (event as CustomEvent<{ id?: string }>).detail;\n if (!detail?.id)\n return;\n const pathStr = this.shadowRoot?.getElementById(detail.id)?.getAttribute(`data-dock-path`);\n if (pathStr === null || pathStr === undefined)\n return;\n const path = parsePath(pathStr);\n const closing = findNode(this._model, path);\n if (closing === null || !isStack(closing))\n return;\n const moving = [...closing.panels];\n this._returnAllToolbars();\n extractStack(this._model, path);\n for (const panelId of moving) {\n addPanelToStack(this._firstStackAllowing(this._panelKind(panelId)), panelId);\n }\n this._commit();\n };\n\n // ── Tab-strip events ─────────────────────────────────────────────────────\n\n private _onTabChange = (event: Event, path: number[]): void => {\n const panelId = (event as TabListChangeEvent).detail.selected;\n const stack = findNode(this._model, path);\n if (stack === null || !isStack(stack))\n return;\n if (!setActive(stack, panelId))\n return;\n this.requestUpdate();\n this.dispatchEvent(new CustomEvent<{ panelId: string }>(`dock-panel-activated`, {\n detail: { panelId },\n bubbles: true,\n composed: true,\n }));\n };\n\n private _onStripPointerDown = (event: PointerEvent): void => {\n if (event.button !== 0)\n return;\n\n // Presses that begin on strip chrome (toolbar buttons, close buttons) are\n // not drag handles.\n const path = event.composedPath();\n for (const node of path) {\n if (!(node instanceof HTMLElement))\n continue;\n if (node.classList.contains(`list-toolbar`) || node.classList.contains(`close-btn`)) {\n return;\n }\n }\n\n const item = path.find((node): node is HTMLElement =>\n node instanceof HTMLElement && node.tagName === `IXFX-TAB-LIST-ITEM`) ?? null;\n if (item === null || !item.id)\n return;\n\n this._tabDragPending = {\n panelId: item.id,\n pointerId: event.pointerId,\n startX: event.clientX,\n startY: event.clientY,\n };\n\n window.addEventListener(`pointermove`, this._onTabDragMove);\n window.addEventListener(`pointerup`, this._onTabDragUp);\n window.addEventListener(`pointercancel`, this._onTabDragUp);\n };\n\n private _onTabDragMove = (event: PointerEvent): void => {\n const pending = this._tabDragPending;\n if (pending === null || event.pointerId !== pending.pointerId)\n return;\n\n const distance = Math.hypot(event.clientX - pending.startX, event.clientY - pending.startY);\n if (distance < DRAG_THRESHOLD_PX)\n return;\n\n this._tabDragPending = null;\n this._teardownTabDragListeners();\n this._suppressNextClick();\n\n this.dispatchEvent(new CustomEvent<{ panelId: string; pointerId: number; clientX: number; clientY: number }>(`dock-panel-drag-start`, {\n detail: {\n panelId: pending.panelId,\n pointerId: pending.pointerId,\n clientX: event.clientX,\n clientY: event.clientY,\n },\n bubbles: true,\n composed: true,\n }));\n };\n\n private _onTabDragUp = (event: PointerEvent): void => {\n if (this._tabDragPending === null || event.pointerId !== this._tabDragPending.pointerId)\n return;\n this._tabDragPending = null;\n this._teardownTabDragListeners();\n };\n\n private _teardownTabDragListeners(): void {\n window.removeEventListener(`pointermove`, this._onTabDragMove);\n window.removeEventListener(`pointerup`, this._onTabDragUp);\n window.removeEventListener(`pointercancel`, this._onTabDragUp);\n }\n\n /** After a dock drag from a tab/titlebar, swallow the trailing click so it cannot re-select or toggle. */\n private _suppressNextClick(): void {\n const swallow = (e: MouseEvent): void => {\n e.preventDefault();\n e.stopPropagation();\n window.removeEventListener(`click`, swallow, true);\n };\n window.addEventListener(`click`, swallow, true);\n }\n\n // ── Internal plumbing ────────────────────────────────────────────────────\n\n private _removeFromModel(panelId: string): void {\n const stackPath = findStackOf(this._model, panelId);\n if (stackPath === null)\n return;\n const stack = findNode(this._model, stackPath);\n if (stack !== null && isStack(stack)) {\n removePanelFromStack(stack, panelId);\n }\n normalize(this._model);\n }\n\n /** Normalize, re-render, and announce the structural change. */\n private _commit(): void {\n normalize(this._model);\n this.requestUpdate();\n this._emitChange();\n }\n\n private _syncSlots(): void {\n const inModel = new Set<string>();\n const visit = (node: DockNode): void => {\n if (isStack(node)) {\n for (const id of node.panels) {\n inModel.add(id);\n const el = this._findPanelEl(id);\n if (el === undefined)\n continue;\n el.setAttribute(`slot`, `dock-panel-${id}`);\n // Docked panels always render content-only; the leaf strip carries\n // the title chrome for every stack, single-panel or not.\n el.presentation = `tabbed`;\n }\n } else {\n node.children.forEach(visit);\n }\n };\n visit(this._model);\n\n for (const el of this._pool) {\n if (!inModel.has(el.panelId)) {\n el.setAttribute(`slot`, ``);\n el.presentation = `solo`;\n }\n }\n }\n\n /**\n * Per-panel toolbar routing: docked panels render content-only, so the\n * active panel's toolbar nodes live in its generated tab item (shown\n * right-aligned while active). Node moves preserve element state. Panels\n * outside the model keep their toolbar in their own (solo) chrome.\n */\n private _syncToolbars(): void {\n const wanted = new Map<string, HTMLElement[]>();\n const visit = (node: DockNode): void => {\n if (isStack(node)) {\n if (node.panels.length > 0 && node.active) {\n const el = this._findPanelEl(node.active);\n if (el !== undefined) {\n wanted.set(node.active, toolbarNodesOf(el));\n }\n }\n } else {\n node.children.forEach(visit);\n }\n };\n visit(this._model);\n\n for (const [panelId, nodes] of this._toolbarsOut) {\n if (!wanted.has(panelId)) {\n this._returnToolbar(panelId, nodes);\n }\n }\n\n for (const [panelId, nodes] of wanted) {\n if (this._toolbarsOut.has(panelId) || nodes.length === 0)\n continue;\n const item = this.shadowRoot?.getElementById(panelId);\n if (item === null || item === undefined)\n continue;\n for (const node of nodes) {\n item.appendChild(node);\n }\n this._toolbarsOut.set(panelId, nodes);\n }\n }\n\n private _returnToolbar(panelId: string, nodes: HTMLElement[]): void {\n const el = this._findPanelEl(panelId);\n if (el !== undefined) {\n for (const node of nodes) {\n if (node.isConnected) {\n el.appendChild(node);\n }\n }\n }\n this._toolbarsOut.delete(panelId);\n }\n\n private _returnAllToolbars(): void {\n for (const [panelId, nodes] of [...this._toolbarsOut]) {\n this._returnToolbar(panelId, nodes);\n }\n }\n\n private _emitChange(): void {\n this.dispatchEvent(new CustomEvent<{ layout: DockLayout }>(`dock-change`, {\n detail: { layout: this.saveLayout() },\n bubbles: true,\n composed: true,\n }));\n }\n\n // ── Render ───────────────────────────────────────────────────────────────\n\n protected override render() {\n return html`\n <div class=\"root\">\n ${this._renderNode(this._model, [])}\n </div>\n <div class=\"overlay\" ?hidden=${!this._dragActive}>\n ${this._dropZone === null\n ? nothing\n : html`\n <div class=\"zone-rect\" style=${rectStyle(this._dropZone.rect)}></div>\n ${this._dropZone.caretRect === undefined\n ? nothing\n : html`<div class=\"zone-caret\" style=${rectStyle(this._dropZone.caretRect)}></div>`}\n `}\n </div>\n <div class=\"junctions\" ?hidden=${this._dragActive}>\n ${this._junctions.map(junction => html`\n <div\n class=\"junction-handle\"\n style=${`left:${junction.x}px; top:${junction.y}px;`}\n role=\"separator\"\n aria-label=\"Resize adjacent panels\"\n @pointerdown=${(e: PointerEvent) => this._onJunctionPointerDown(e, junction)}\n ><span class=\"ixfx-handle\" data-handle=\"dotted\" data-shape=\"spot\" part=\"junction-handle\"></span></div>\n `)}\n </div>\n <slot @slotchange=${this._onPoolSlotChange}></slot>\n `;\n }\n\n private _renderNode(node: DockNode, path: number[], size?: number): unknown {\n if (isStack(node)) {\n return this._renderLeaf(node, path, size);\n }\n return this._renderSplit(node, path, size);\n }\n\n private _renderSplit(node: DockNode & { kind: `split` }, path: number[], size?: number): unknown {\n const pathStr = path.join(`-`);\n return html`\n <ixfx-split-layout\n class=\"split\"\n direction=${node.direction}\n size=${size === undefined ? nothing : String(size)}\n style=${`--split-gutter-size: var(--dock-split-bar-size, 2px)`}\n data-dock-path=${pathStr}\n @ixfx-split-resize=${this._onSplitWeightsChanged}\n @ixfx-split-change=${this._onSplitWeightsChanged}\n @ixfx-split-collapse=${(e: Event) => this._onSplitCollapsed(e, true)}\n @ixfx-split-expand=${(e: Event) => this._onSplitCollapsed(e, false)}\n @ixfx-split-close=${this._onSplitClose}\n >\n ${node.children.map((child, i) => this._renderNode(child, [...path, i], node.sizes[i]))}\n </ixfx-split-layout>\n `;\n }\n\n private _renderLeaf(stack: DockStackNode, path: number[], size?: number): unknown {\n const pathStr = path.join(`-`);\n const collapsible = stack.panels.length === 1\n ? (this._findPanelEl(stack.panels[0])?.collapsible ?? false)\n : false;\n\n const leafAttrs = (content: unknown): unknown => html`\n <div\n id=${`dock-leaf-${pathStr}`}\n class=\"leaf\"\n data-dock-path=${pathStr}\n data-dock-name=${stack.name ?? nothing}\n size=${size === undefined ? nothing : String(size)}\n min=${collapsible ? `1px` : nothing}\n when-small=${collapsible ? `collapse` : nothing}\n ?collapsed=${stack.collapsed === true}\n >${content}</div>\n `;\n\n if (stack.panels.length === 0) {\n return leafAttrs(html`\n <div class=\"empty\" part=\"empty\">\n <slot name=\"empty\"><span>Drop panels here</span></slot>\n </div>\n `);\n }\n\n // Every leaf renders the same strip + body chrome, so titlebars are\n // consistent whether a stack holds one panel or many. Named leaves\n // forward light-DOM `toolbar-<name>` content into the strip's toolbar.\n const toolbarSlot = stack.name !== undefined && this._toolbarSlots.has(`toolbar-${stack.name}`)\n ? html`<slot name=\"toolbar-${stack.name}\" slot=\"toolbar\"></slot>`\n : nothing;\n return leafAttrs(html`\n <ixfx-tab-list\n class=\"strip\"\n orientation=\"horizontal\"\n scrollable\n shrink\n ?hide-labels=${stack.hideLabels === true}\n @change=${(e: Event) => this._onTabChange(e, path)}\n @pointerdown=${this._onStripPointerDown}\n >\n ${repeat(stack.panels, id => id, id => this._renderTabItem(stack, id))}\n ${toolbarSlot}\n </ixfx-tab-list>\n <div class=\"leaf-body\">\n <slot name=\"dock-panel-${stack.active}\"></slot>\n </div>\n `);\n }\n\n private _renderTabItem(stack: DockStackNode, panelId: string): unknown {\n const el = this._findPanelEl(panelId);\n return html`\n <ixfx-tab-list-item\n id=${panelId}\n ?selected=${panelId === stack.active}\n .iconName=${el?.iconName ?? ``}\n .closeable=${el?.closable ?? false}\n @close=${() => this.removePanel(panelId)}\n >${el?.title ?? panelId}</ixfx-tab-list-item>\n `;\n }\n\n private _stripCaretRect(strip: Element, gapIndex: number | undefined, hostRect: DOMRect): Rect | undefined {\n const items = Array.from(strip.querySelectorAll(`ixfx-tab-list-item`)) as HTMLElement[];\n if (items.length === 0)\n return undefined;\n const index = Math.max(0, Math.min(gapIndex ?? items.length, items.length));\n const edge = index < items.length\n ? items[index].getBoundingClientRect().left\n : items[items.length - 1].getBoundingClientRect().right;\n const stripRect = strip.getBoundingClientRect();\n return {\n x: edge - hostRect.left - 1,\n y: stripRect.top - hostRect.top,\n w: 2,\n h: stripRect.height,\n };\n }\n\n static override styles = [\n themeFallbacks,\n handleStyles,\n css`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n --dock-drop-zone-color: var(--accent);\n --dock-drop-zone-opacity: 0.25;\n --dock-collapsed-size: 40px;\n --dock-split-bar-size: 2px;\n position: relative;\n }\n\n .root {\n width: 100%;\n height: 100%;\n }\n\n ixfx-split-layout.split {\n width: 100%;\n height: 100%;\n }\n\n .leaf {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n min-width: 0;\n min-height: 0;\n box-sizing: border-box;\n overflow: hidden;\n border: 1px solid var(--surface-4);\n border-radius: var(--radius-m);\n }\n\n .leaf[collapsed] {\n pointer-events: none;\n }\n\n .leaf[collapsed] .leaf-body,\n .leaf[collapsed] .empty {\n visibility: hidden;\n }\n\n .strip {\n flex-shrink: 0;\n border: 0;\n /* The leaf background shows through selected tabs; a text underline\n (not the border indicator) carries the selection. */\n --ixfx-tab-selected-background: transparent;\n --ixfx-selected-tab-border-width: 0;\n --ixfx-selected-tab-text-decoration: underline;\n --ixfx-selected-tab-text-decoration-thickness: 2px;\n --ixfx-selected-tab-text-decoration-offset: 4px;\n --ixfx-tab-hover-background: var(--surface-4);\n }\n\n /* Uniform tab height: a panel toolbar button would otherwise inflate\n its tab item, giving strips of different stacks different heights. */\n .strip ixfx-tab-list-item {\n height: var(--dock-tab-height, 30px);\n }\n\n /* Breathing room between strip toolbars and the leaf edge. */\n .strip::part(list-toolbar) {\n padding-right: var(--space-xs);\n }\n\n .leaf-body {\n flex: 1;\n min-height: 0;\n min-width: 0;\n box-sizing: border-box;\n padding: var(--dock-leaf-body-padding, var(--space-s));\n }\n\n .empty {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--surface-3-text);\n opacity: 0.6;\n font-size: var(--text-m);\n border: 1px dashed var(--border-subtle);\n border-radius: var(--radius-m);\n margin: var(--space-s);\n }\n\n .overlay {\n position: absolute;\n inset: 0;\n pointer-events: none;\n z-index: 100;\n }\n\n .zone-rect {\n position: absolute;\n background: var(--dock-drop-zone-color);\n opacity: var(--dock-drop-zone-opacity);\n border-radius: var(--radius-s);\n }\n\n .zone-caret {\n position: absolute;\n background: var(--dock-drop-zone-color);\n border-radius: 1px;\n }\n\n .junctions {\n position: absolute;\n inset: 0;\n pointer-events: none;\n z-index: 99;\n }\n\n .junctions[hidden] {\n display: none;\n }\n\n .junction-handle {\n position: absolute;\n width: 14px;\n height: 14px;\n transform: translate(-50%, -50%);\n border-radius: 50%;\n cursor: nwse-resize;\n pointer-events: auto;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .junction-handle .ixfx-handle {\n --ixfx-handle-spot-size: 12px;\n --ixfx-handle-dot-size: 3px;\n --ixfx-handle-opacity: 0;\n --ixfx-handle-opacity-active: 0.9;\n }\n\n slot:not([name]) {\n display: none;\n }\n `,\n ];\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\n/** `split-horizontal` = horizontal divider = panels stacked vertically. */\nfunction opToDirection(op: DockOperation): `row` | `column` {\n return op === `split-horizontal` ? `column` : `row`;\n}\n\nfunction operationToToken(op: DockOperation): string {\n if (op === `tabs`)\n return `tabs`;\n return op === `split-horizontal` ? `horizontal` : `vertical`;\n}\n\n/** Host-level `accepts`: empty or `none` rejects everything. */\nfunction tokenAllows(tokens: string, token: string): boolean {\n const list = tokens.trim().split(/\\s+/).filter(t => t.length > 0);\n if (list.length === 0 || (list.length === 1 && list[0] === `none`))\n return false;\n return list.includes(`all`) || list.includes(token);\n}\n\n/** Panel-level `accepts`: empty means unrestricted (host rules still apply). */\nfunction panelAllows(tokens: string, token: string): boolean {\n const list = tokens.trim().split(/\\s+/).filter(t => t.length > 0);\n if (list.length === 0)\n return true;\n if (list.length === 1 && list[0] === `none`)\n return false;\n return list.includes(`all`) || list.includes(token);\n}\n\nfunction weightsEqual(a: number[], b: number[]): boolean {\n if (a.length !== b.length)\n return false;\n return a.every((v, i) => Math.abs(v - b[i]) < 0.0001);\n}\n\nfunction rectStyle(r: Rect): string {\n return `left:${r.x}px; top:${r.y}px; width:${r.w}px; height:${r.h}px;`;\n}\n\n/** Strip a live `DockDropZone` down to its serializable {@link DockDropTarget}. */\nfunction zoneToTarget(zone: DockDropZone): DockDropTarget {\n return {\n operation: zone.operation,\n targetPath: [...zone.targetPath],\n side: zone.side,\n ...(zone.gapIndex === undefined ? {} : { gapIndex: zone.gapIndex }),\n };\n}\n\nfunction cloneNode(node: DockNode): DockNode {\n return JSON.parse(JSON.stringify(node)) as DockNode;\n}\n\n/** Panel content kind, normalized (`'any'` when unset/blank). */\nfunction normalizeKind(kind: string | undefined): string {\n const trimmed = kind?.trim() ?? ``;\n return trimmed || `any`;\n}\n\nfunction parsePath(pathStr: string): number[] {\n return pathStr.length === 0 ? [] : pathStr.split(`-`).filter(s => s.length > 0).map(Number);\n}\n\n/** Toolbar-slot light children of a dock panel. */\nfunction toolbarNodesOf(el: DockPanelElement): HTMLElement[] {\n return Array.from(el.children).filter((c): c is HTMLElement =>\n c instanceof HTMLElement && c.getAttribute(`slot`) === `toolbar`);\n}\n\n/** Nearest strip gap to the pointer (reuses the tab-list midpoint rule). */\nfunction computeStripGapIndex(strip: Element, clientX: number, _clientY: number): number {\n const items = Array.from(strip.querySelectorAll(`ixfx-tab-list-item`)) as HTMLElement[];\n if (items.length === 0)\n return 0;\n for (let i = 0; i < items.length; i++) {\n const r = items[i].getBoundingClientRect();\n const mid = (r.left + r.right) / 2;\n if (clientX < mid)\n return i;\n }\n return items.length;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-dock-host': DockHostElement;\n }\n}\n\nexport interface DockHostElement {\n addEventListener: (<K extends keyof DockHostElementEventMap>(\n type: K,\n listener: (this: DockHostElement, event: DockHostElementEventMap[K]) => void,\n options?: boolean | AddEventListenerOptions,\n ) => void) & ((\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ) => void);\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","/* eslint-disable ts/no-unsafe-declaration-merging */\nimport type { DragGhost } from '../util/drag-ghost.js';\nimport type { PanelElement, PanelOrientation, PanelToggleInteraction, PanelVariant } from './panel.js';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { property, queryAssignedElements } from 'lit/decorators.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport { createDragGhost } from '../util/drag-ghost.js';\n\nexport type PanelGroupOrientation = `horizontal` | `vertical`;\n\nexport interface PanelGroupReorderDetail {\n readonly fromIndex: number;\n readonly toIndex: number;\n readonly panel: PanelElement;\n}\n\nexport type PanelGroupReorderEvent = CustomEvent<PanelGroupReorderDetail>;\n\nexport interface PanelGroupElementEventMap {\n reorder: PanelGroupReorderEvent;\n}\n\n/** Pointer movement threshold (px) before a press becomes a drag. */\nconst DRAG_THRESHOLD_PX = 5;\n\n/**\n * Pure helper: nearest gap index for a pointer position along one axis.\n * `edges` are the [start, end] of each sibling (excluding the drag source),\n * in DOM order. Returns 0..edges.length.\n */\nexport function panelGapIndex(edges: ReadonlyArray<readonly [number, number]>, pos: number): number {\n let bestGap = 0;\n let bestDist = Number.POSITIVE_INFINITY;\n for (let i = 0; i < edges.length; i++) {\n const [start, end] = edges[i];\n const mid = (start + end) / 2;\n if (pos < mid) {\n const d = Math.abs(pos - start);\n if (d < bestDist) {\n bestDist = d;\n bestGap = i;\n }\n } else {\n const d = Math.abs(pos - end);\n if (d < bestDist) {\n bestDist = d;\n bestGap = i + 1;\n }\n }\n }\n return bestGap;\n}\n\nlet panelGhostStylesInjected = false;\n\n/**\n * Global ghost styling so the drag preview matches `ixfx-titlebar` chrome\n * (font, colours, padding). Injected once; the ghost lives outside shadow DOM\n * (body/theme container) so component styles cannot reach it.\n */\nfunction injectPanelGhostStyles(): void {\n if (panelGhostStylesInjected) {\n return;\n }\n panelGhostStylesInjected = true;\n const style = document.createElement(`style`);\n style.textContent = `\n .ixfx-drag-ghost.ixfx-panel-group-ghost {\n padding: var(--space-s, 8px) var(--space-m, 16px);\n background: var(--surface-4);\n color: var(--surface-3-text);\n border: none;\n border-radius: var(--radius-s, 4px);\n font-family: var(--font-family);\n font-size: var(--text-m);\n font-weight: var(--font-weight-bold, 600);\n min-height: 2em;\n user-select: none;\n -webkit-user-select: none;\n }\n .ixfx-drag-ghost.ixfx-panel-group-ghost ixfx-icon {\n width: 1.25em;\n height: 1.25em;\n flex-shrink: 0;\n }\n `;\n document.head.appendChild(style);\n}\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 }) collapsible = true;\n @property({ type: Boolean, attribute: `accordion`, reflect: true }) accordion = false;\n @property({ type: Boolean, attribute: `allow-reorder`, reflect: true }) allowReorder = false;\n /** Explicit gap between panels. When unset, `--group-gap` (falling back to `--space-l`) controls the gap. */\n @property() gap?: string;\n\n @queryAssignedElements({ slot: `` }) private _panels!: PanelElement[];\n\n private _dragState: {\n pointerId: number;\n source: PanelElement;\n fromIndex: number;\n startX: number;\n startY: number;\n active: boolean;\n ghost: DragGhost | null;\n gapIndex: number | undefined;\n } | null = null;\n\n private _suppressNextClick = false;\n\n private _onPanelToggle(e: Event) {\n const panel = e.target as PanelElement;\n if (panel.collapsed) {\n return;\n }\n\n if (!this.accordion) {\n return;\n }\n\n for (const p of this._panels) {\n if (p !== panel) {\n p.collapsed = true;\n }\n }\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n // Capture phase so we can swallow the trailing click after a real reorder\n // before it reaches the titlebar toggle handler inside ixfx-panel.\n this.addEventListener(`click`, this._onClickCapture, true);\n }\n\n override disconnectedCallback(): void {\n this.removeEventListener(`click`, this._onClickCapture, true);\n if (this._dragState) {\n this._abortDrag();\n this._endDrag(this._dragState.pointerId);\n }\n super.disconnectedCallback();\n }\n\n protected override firstUpdated(): void {\n if (this.gap !== undefined) {\n this.style.setProperty(`--group-gap`, this.gap);\n }\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(`gap`)) {\n if (this.gap !== undefined) {\n this.style.setProperty(`--group-gap`, this.gap);\n } else {\n this.style.removeProperty(`--group-gap`);\n }\n }\n if (changed.has(`variant`) || changed.has(`toggleInteraction`) || changed.has(`orientation`) || changed.has(`collapsible`)) {\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 if (this.collapsible) {\n panel.setAttribute(`collapsible`, ``);\n } else {\n panel.removeAttribute(`collapsible`);\n }\n }\n }\n\n private _onSlotChange(): void {\n this.updateComplete.then(() => {\n this._propagateAll();\n });\n }\n\n private _onClickCapture = (event: Event): void => {\n if (!this._suppressNextClick) {\n return;\n }\n this._suppressNextClick = false;\n event.preventDefault();\n event.stopPropagation();\n };\n\n private _onKeyDown = (event: KeyboardEvent): void => {\n const state = this._dragState;\n if (event.key !== `Escape` || !state?.active) {\n return;\n }\n event.preventDefault();\n const pointerId = state.pointerId;\n this._abortDrag();\n this._endDrag(pointerId);\n };\n\n /**\n * Walk composedPath for the nearest ixfx-panel, requiring the press to have\n * gone through an ixfx-titlebar (titlebar-anywhere drag). Bails when the\n * path crosses interactive chrome (buttons/links/inputs/toolbar/caret/close)\n * so those controls always win over dragging.\n */\n private _findDragTarget(event: PointerEvent): PanelElement | null {\n if (!this.allowReorder) {\n return null;\n }\n const path = event.composedPath();\n let panel: PanelElement | null = null;\n let viaTitlebar = false;\n for (const node of path) {\n if (!(node instanceof HTMLElement)) {\n continue;\n }\n const tag = node.tagName;\n if (tag === `BUTTON` || tag === `A` || tag === `INPUT` || tag === `SELECT` || tag === `TEXTAREA`) {\n return null;\n }\n if (node.classList.contains(`toolbar`) || node.classList.contains(`close-btn`) || node.classList.contains(`caret-btn`)) {\n return null;\n }\n if (node.hasAttribute?.(`slot`) && node.getAttribute(`slot`) === `toolbar`) {\n return null;\n }\n if (tag === `IXFX-TITLEBAR`) {\n viaTitlebar = true;\n }\n if (!panel && tag === `IXFX-PANEL`) {\n panel = node as PanelElement;\n }\n }\n if (!panel || !viaTitlebar) {\n return null;\n }\n return panel;\n }\n\n private _onPointerDown = (event: PointerEvent): void => {\n if (!this.allowReorder || event.button !== 0) {\n return;\n }\n const target = this._findDragTarget(event);\n if (!target?.parentNode) {\n return;\n }\n const fromIndex = Array.prototype.indexOf.call(target.parentNode.children, target);\n if (fromIndex < 0) {\n return;\n }\n // Don't capture yet — capturing on pointerdown would redirect the trailing\n // click to the capture target and break the normal titlebar toggle press.\n // Capture only once the drag activates.\n this._dragState = {\n pointerId: event.pointerId,\n source: target,\n fromIndex,\n startX: event.clientX,\n startY: event.clientY,\n active: false,\n ghost: null,\n gapIndex: undefined,\n };\n window.addEventListener(`pointermove`, this._onPointerMove);\n window.addEventListener(`pointerup`, this._onPointerUp);\n window.addEventListener(`pointercancel`, this._onPointerCancel);\n };\n\n private _onPointerMove = (event: PointerEvent): void => {\n const state = this._dragState;\n if (!state || event.pointerId !== state.pointerId) {\n return;\n }\n const distance = Math.hypot(event.clientX - state.startX, event.clientY - state.startY);\n if (!state.active) {\n if (distance < DRAG_THRESHOLD_PX) {\n return;\n }\n this._beginDrag(event);\n }\n state.ghost?.move(event.clientX, event.clientY);\n const gap = this._computeGapIndex(event.clientX, event.clientY);\n if (gap !== state.gapIndex) {\n state.gapIndex = gap;\n this.requestUpdate();\n }\n };\n\n private _onPointerUp = (event: PointerEvent): void => {\n const state = this._dragState;\n if (!state || event.pointerId !== state.pointerId) {\n return;\n }\n if (state.active) {\n const gap = this._computeGapIndex(event.clientX, event.clientY);\n this._commitDrag(state.source, state.fromIndex, gap);\n }\n this._endDrag(event.pointerId);\n };\n\n private _onPointerCancel = (event: PointerEvent): void => {\n const state = this._dragState;\n if (!state || event.pointerId !== state.pointerId) {\n return;\n }\n this._abortDrag();\n this._endDrag(event.pointerId);\n };\n\n private _beginDrag(event: PointerEvent): void {\n const state = this._dragState;\n if (!state || state.active) {\n return;\n }\n try {\n this.setPointerCapture(event.pointerId);\n } catch {\n // Fall through — window listeners still catch move/up.\n }\n state.active = true;\n // `dragging` kills text selection for the gesture (see styles).\n this.setAttribute(`dragging`, ``);\n state.source.setAttribute(`drag-source`, ``);\n state.ghost = this._createGhost(state.source);\n state.ghost?.move(event.clientX, event.clientY);\n }\n\n private _abortDrag(): void {\n const state = this._dragState;\n if (!state) {\n return;\n }\n state.source.removeAttribute(`drag-source`);\n if (state.gapIndex !== undefined) {\n state.gapIndex = undefined;\n this.requestUpdate();\n }\n }\n\n private _endDrag(pointerId: number): void {\n const state = this._dragState;\n if (!state) {\n return;\n }\n state.ghost?.destroy();\n state.ghost = null;\n this.removeAttribute(`dragging`);\n this._dragState = null;\n window.removeEventListener(`pointermove`, this._onPointerMove);\n window.removeEventListener(`pointerup`, this._onPointerUp);\n window.removeEventListener(`pointercancel`, this._onPointerCancel);\n try {\n this.releasePointerCapture(pointerId);\n } catch { /* already released */ }\n this.requestUpdate();\n }\n\n private _commitDrag(source: PanelElement, fromIndex: number, gapIndex: number | undefined): void {\n source.removeAttribute(`drag-source`);\n // Gap is an index into the without-source panel list; resolve the reference\n // node from that list, then measure the public indices against the real\n // light-DOM children (which may include non-panel elements).\n const siblings = (this._panels ?? []).filter(el => el !== source);\n const target = gapIndex === undefined\n ? siblings.length\n : Math.max(0, Math.min(gapIndex, siblings.length));\n const parent = source.parentNode;\n if (!parent) {\n return;\n }\n const ref = siblings[target] ?? null;\n parent.insertBefore(source, ref);\n const toIndex = Array.prototype.indexOf.call(parent.children, source);\n if (toIndex === fromIndex) {\n return;\n }\n // A real reorder happened — swallow the trailing click so the titlebar\n // implicit toggle doesn't also collapse/expand the dragged panel.\n this._suppressNextClick = true;\n this.dispatchEvent(new CustomEvent<PanelGroupReorderDetail>(`reorder`, {\n bubbles: true,\n composed: true,\n detail: { fromIndex, toIndex, panel: source },\n }));\n }\n\n private _createGhost(source: PanelElement): DragGhost | null {\n // Mirror ixfx-titlebar's title-text-wrapper: icon + title with 1ch indent.\n const content = document.createElement(`span`);\n content.style.display = `inline-flex`;\n content.style.alignItems = `center`;\n content.style.padding = `0 var(--space-s, 8px)`;\n content.style.minWidth = `0`;\n if (source.iconName) {\n const icon = document.createElement(`ixfx-icon`) as HTMLElement & { name: string };\n icon.name = source.iconName;\n content.appendChild(icon);\n }\n const label = document.createElement(`span`);\n label.textContent = (source.title || (source.textContent ?? ``).trim()).slice(0, 60);\n label.style.paddingLeft = `1ch`;\n label.style.overflow = `hidden`;\n label.style.textOverflow = `ellipsis`;\n label.style.whiteSpace = `nowrap`;\n content.appendChild(label);\n try {\n injectPanelGhostStyles();\n return createDragGhost({ anchor: source, content, className: `ixfx-panel-group-ghost` });\n } catch {\n return null;\n }\n }\n\n /**\n * Nearest panel gap to the pointer, ignoring the drag source.\n * The perpendicular axis is ignored — the pointer always resolves to a gap.\n */\n private _computeGapIndex(clientX: number, clientY: number): number | undefined {\n const state = this._dragState;\n if (!state) {\n return undefined;\n }\n const siblings = (this._panels ?? []).filter(el => el !== state.source);\n if (siblings.length === 0) {\n return 0;\n }\n const useX = this.orientation === `horizontal`;\n const pos = useX ? clientX : clientY;\n const edges = siblings.map((el) => {\n const rect = el.getBoundingClientRect();\n return [useX ? rect.left : rect.top, useX ? rect.right : rect.bottom] as const;\n });\n return panelGapIndex(edges, pos);\n }\n\n private _computeCaretStyle(): string | undefined {\n const state = this._dragState;\n if (!state?.active || state.gapIndex === undefined) {\n return undefined;\n }\n const siblings = (this._panels ?? []).filter(el => el !== state.source);\n if (siblings.length === 0) {\n return undefined;\n }\n const hostRect = this.getBoundingClientRect();\n if (!hostRect) {\n return undefined;\n }\n const gap = Math.max(0, Math.min(state.gapIndex, siblings.length));\n const rect = gap < siblings.length\n ? siblings[gap].getBoundingClientRect()\n : siblings[siblings.length - 1].getBoundingClientRect();\n if (this.orientation === `horizontal`) {\n const x = (gap < siblings.length ? rect.left : rect.right) - hostRect.left;\n return `transform: translate(${x - 1}px, 0); width: 2px; height: ${hostRect.height}px;`;\n }\n const y = (gap < siblings.length ? rect.top : rect.bottom) - hostRect.top;\n return `transform: translate(0, ${y - 1}px); width: ${hostRect.width}px; height: 2px;`;\n }\n\n protected override render() {\n const caretStyle = this._computeCaretStyle();\n return html`\n <slot\n @toggle=${this._onPanelToggle}\n @slotchange=${this._onSlotChange}\n @pointerdown=${this._onPointerDown}\n @keydown=${this._onKeyDown}\n ></slot>\n ${caretStyle ? html`<div class=\"drop-caret\" style=${caretStyle}></div>` : nothing}\n `;\n }\n\n static override styles = css`\n :host {\n position: relative;\n display: flex;\n flex-direction: column;\n gap: var(--group-gap, var(--space-l));\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 :host([allow-reorder]) ::slotted(ixfx-panel) {\n cursor: grab;\n }\n\n :host([allow-reorder]) ::slotted(ixfx-panel[drag-source]) {\n cursor: grabbing;\n opacity: 0.4;\n }\n\n /* While dragging, suppress text selection inside the panels. */\n :host([dragging]),\n :host([dragging]) ::slotted(*) {\n user-select: none;\n -webkit-user-select: none;\n }\n\n :host([dragging]) ::slotted(ixfx-panel) {\n cursor: grabbing;\n }\n\n .drop-caret {\n position: absolute;\n top: 0;\n left: 0;\n background: var(--accent);\n border-radius: 1px;\n pointer-events: none;\n z-index: 1;\n }\n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-panel-group': PanelGroupElement;\n }\n}\n\nexport interface PanelGroupElement {\n addEventListener: (<K extends keyof PanelGroupElementEventMap>(\n type: K,\n listener: (this: PanelGroupElement, event: PanelGroupElementEventMap[K]) => void,\n options?: boolean | AddEventListenerOptions,\n ) => void) & ((\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ) => void);\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 { 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(--toolbar-group-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 { ToolbarAlign, 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: String, attribute: `toolbar-align`, reflect: true }) toolbarAlign: ToolbarAlign = `near`;\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 --toolbar-overflow: auto;\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([toolbar-align=\"far\"][orientation=\"horizontal\"]) .inner { justify-content: flex-end; }\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 }\n .overflow-btn[hidden] { display: none; }\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 const overflowMode = getComputedStyle(this).getPropertyValue(`--toolbar-overflow`).trim() as string;\n\n if (this.layout !== `one-line` || overflowMode === `disabled`) {\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\n let mutated = false;\n\n // 'collapsed' mode: all overflowable items start in overflow\n if (overflowMode === `collapsed`) {\n if (inMain.length > 0) {\n for (const el of inMain) {\n el.setAttribute(`slot`, `overflow`);\n }\n inOverflow.push(...inMain);\n inMain.length = 0;\n mutated = true;\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 return;\n }\n\n // 'auto' mode: normal overflow handling\n const btnAllowance = inOverflow.length > 0 ? gap + btnSize : 0;\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 overflowMode = getComputedStyle(this).getPropertyValue(`--toolbar-overflow`).trim();\n const hasOverflow = this._overflowCount > 0 || overflowMode === `collapsed`;\n return html`\n <div class=\"inner\" role=\"toolbar\" aria-orientation=${this.orientation}>\n <slot></slot>\n <ixfx-button class=\"overflow-btn\" ?hidden=${!hasOverflow} @click=${this._toggleOverflow} aria-label=\"More\" aria-haspopup=\"true\" aria-expanded=${this._popover?.matches(`:popover-open`) ?? false}>⋯</ixfx-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 { clamp } from \"@ixfx/numbers\";\nimport { css, html, LitElement } from \"lit\";\nimport { property, state } from \"lit/decorators.js\";\nimport { themeFallbacks } from \"../styles/fallbacks.js\";\nimport { handleStyles } from \"../styles/handle.js\";\nimport { safeCustomElement as customElement } from \"../util/custom-elements.js\";\n\n// TODO: Fire event when panels have been resized\n/**\n * Lays out two elements within a container, with a bar to resize them\n * proportionally.\n *\n * Events\n * ixfx-split-collapsed: Dispatched when a panel is collapsed/uncollapsed via drag.\n * detail: { panel: 'A' | 'B', collapsed: boolean }\n *\n * Attributes\n * layout: `vertical`|`horizontal`\n * sizeA/B: CSS size of section A or B. Can use relative or absolute values\n * fixedA/B: If _true_ size will be calculated in pixels. By default (_false_) it uses % of whole\n * collapsible: If _true_, panels can be collapsed by dragging to edge (default: false)\n * minSizeA/B: Minimum size for panel A or B (e.g., \"100px\" or \"20%\"). Default: none\n * maxSizeA/B: Maximum size for panel A or B (e.g., \"200px\" or \"80%\"). Default: none\n *\n * CSS variables\n * --handle-size: 2px; // Width/height of split bar\n * --handle-colour: var(--surface-5); // Colour of split bar\n * --handle-hover-colour: var(--surface-6); // Split bar on hover\n * --handle-active-colour: var(--accent); // Split bar while dragging\n * --ixfx-handle-* // Grip look — shared handle primitive\n * // (see docs/infra-handle.md)\n */\n@customElement(`ixfx-twosplit-layout`)\nexport class TwoSplitLayoutElement extends LitElement {\n @property({ type: String })\n layout: `vertical` | `horizontal` = `vertical`;\n\n @property({ type: String })\n sizeA = ``;\n\n @property({ type: String })\n sizeB = ``;\n\n @property({ type: Boolean })\n fixedA = false;\n\n @property({ type: Boolean })\n fixedB = false;\n\n @property({ type: Boolean })\n collapsible = false;\n\n @property({ type: Boolean, reflect: true })\n collapsedA = false;\n\n @property({ type: Boolean, reflect: true })\n collapsedB = false;\n\n @property({ type: String })\n minSizeA = ``;\n\n @property({ type: String })\n maxSizeA = ``;\n\n @property({ type: String })\n minSizeB = ``;\n\n @property({ type: String })\n maxSizeB = ``;\n\n @state()\n private _hasCorner = false;\n\n private get showGrabHandle(): boolean {\n const size = getComputedStyle(this).getPropertyValue(`--handle-size`).trim();\n const num = Number.parseFloat(size);\n return !Number.isNaN(num) && num > 3;\n }\n\n #elementBounds: DOMRect | undefined;\n #startSizeA = ``;\n #startSizeB = ``;\n #cornerStartX = 0;\n #cornerStartY = 0;\n #nestedSplitInitialSizeA = ``;\n\n #cornerZone: HTMLElement | undefined;\n #nestedSplit: TwoSplitLayoutElement | undefined;\n #nestedSplitBounds: DOMRect | undefined;\n #nestedHandleBounds: DOMRect | undefined;\n #observer: MutationObserver | undefined;\n #pendingNestedUpdate: { sizeA: number; sizeB: number } | null = null;\n #collapsedAPointerAtCollapse: number | undefined;\n #collapsedBPointerAtCollapse: number | undefined;\n #hysteresisThreshold = 0.1;\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.#observer?.disconnect();\n }\n\n firstUpdated() {\n this.#setupNestedSplitObserver();\n }\n\n updated(changedProperties: Map<string, unknown>) {\n if (changedProperties.has(`sizeA`) || changedProperties.has(`sizeB`)\n || changedProperties.has(`collapsedA`) || changedProperties.has(`collapsedB`)) {\n this.#updateCornerPosition();\n }\n if (changedProperties.has(`sizeA`) || changedProperties.has(`sizeB`)) {\n this.#updateDataCollapsed();\n }\n }\n\n #updateDataCollapsed() {\n if (this.collapsedA) {\n this.setAttribute(`data-collapsed-a`, ``);\n } else {\n this.removeAttribute(`data-collapsed-a`);\n }\n if (this.collapsedB) {\n this.setAttribute(`data-collapsed-b`, ``);\n } else {\n this.removeAttribute(`data-collapsed-b`);\n }\n }\n\n #dispatchCollapsedEvent(panel: `A` | `B`, collapsed: boolean) {\n this.dispatchEvent(new CustomEvent(`ixfx-split-collapsed`, {\n detail: { panel, collapsed },\n bubbles: true,\n composed: true,\n }));\n }\n\n #setupNestedSplitObserver() {\n const slotA = this.shadowRoot?.querySelector(`slot[name=\"a\"]`) as HTMLSlotElement | undefined;\n if (!slotA)\n return;\n\n this.#observer = new MutationObserver(() => {\n this.#checkForNestedSplit();\n });\n\n this.#observer.observe(slotA, { characterData: true, childList: true, subtree: true });\n this.#checkForNestedSplit();\n }\n\n #checkForNestedSplit() {\n const slotA = this.shadowRoot?.querySelector(`slot[name=\"a\"]`) as HTMLSlotElement | undefined;\n if (!slotA)\n return;\n\n const assignedElements = slotA.assignedElements();\n\n const findNestedSplit = (elements: Element[]): TwoSplitLayoutElement | undefined => {\n for (const el of elements) {\n if (el.tagName === `IXFX-SPLIT-LAYOUT`) {\n return el as TwoSplitLayoutElement;\n }\n const nested = findNestedSplit(Array.from(el.children));\n if (nested)\n return nested;\n }\n return undefined;\n };\n\n const nestedSplit = findNestedSplit(assignedElements);\n\n if (nestedSplit) {\n this.#nestedSplit = nestedSplit;\n this._hasCorner = true;\n requestAnimationFrame(() => this.#updateCornerPosition());\n } else {\n this.#nestedSplit = undefined;\n this._hasCorner = false;\n }\n }\n\n #getNestedSplit(): TwoSplitLayoutElement | undefined {\n if (this.#nestedSplit)\n return this.#nestedSplit;\n\n const slotA = this.shadowRoot?.querySelector(`slot[name=\"a\"]`) as HTMLSlotElement | undefined;\n if (!slotA)\n return undefined;\n const assignedElements = slotA.assignedElements();\n return assignedElements.find(\n el => el.tagName === `IXFX-SPLIT-LAYOUT`,\n ) as TwoSplitLayoutElement | undefined;\n }\n\n #parseSizeAsFraction(size: string, total: number): number {\n if (size.endsWith(`px`)) {\n return Number.parseFloat(size.replace(`px`, ``)) / total;\n } else if (size.endsWith(`%`)) {\n return Number.parseFloat(size.replace(`%`, ``)) / 100;\n }\n return 0.5;\n }\n\n #parseSizeToPx(size: string, total: number): number | null {\n if (size.endsWith(`px`)) {\n return Number.parseFloat(size.replace(`px`, ``));\n } else if (size.endsWith(`%`)) {\n return (Number.parseFloat(size.replace(`%`, ``)) / 100) * total;\n }\n return null;\n }\n\n #applyConstraints(sizeA: string, sizeB: string, total: number): { sizeA: string; sizeB: string } {\n let fractionA = this.#parseSizeAsFraction(sizeA, total);\n let fractionB = this.#parseSizeAsFraction(sizeB, total);\n\n const minA = this.#minSizeToFraction(this.minSizeA, total);\n const minB = this.#minSizeToFraction(this.minSizeB, total);\n const maxA = this.#maxSizeToFraction(this.maxSizeA, total);\n const maxB = this.#maxSizeToFraction(this.maxSizeB, total);\n\n if (minA !== null || minB !== null) {\n const minSum = (minA ?? 0) + (minB ?? 0);\n if (minSum > 1) {\n const scale = 1 / minSum;\n if (minA !== null)\n minA !== null ? fractionA = minA * scale : fractionA = 0;\n if (minB !== null)\n minB !== null ? fractionB = minB * scale : fractionB = 0;\n }\n\n if (fractionA < (minA ?? 0))\n fractionA = minA ?? 0;\n if (fractionB < (minB ?? 0))\n fractionB = minB ?? 0;\n }\n\n if (maxA !== null) {\n if (fractionA > maxA)\n fractionA = maxA;\n }\n if (maxB !== null) {\n if (fractionB > maxB)\n fractionB = maxB;\n }\n\n fractionB = 1 - fractionA;\n\n const isPercentA = !this.sizeA.endsWith(`px`);\n const _isPercentB = !this.sizeB.endsWith(`px`);\n\n if (isPercentA) {\n return { sizeA: `${fractionA * 100}%`, sizeB: `${fractionB * 100}%` };\n } else {\n return { sizeA: `${fractionA * total}px`, sizeB: `${fractionB * total}px` };\n }\n }\n\n #minSizeToFraction(minSize: string, total: number): number | null {\n if (minSize.length === 0)\n return null;\n const px = this.#parseSizeToPx(minSize, total);\n if (px !== null)\n return px / total;\n if (minSize.endsWith(`%`))\n return Number.parseFloat(minSize.replace(`%`, ``)) / 100;\n return null;\n }\n\n #maxSizeToFraction(maxSize: string, total: number): number | null {\n if (maxSize.length === 0)\n return null;\n const px = this.#parseSizeToPx(maxSize, total);\n if (px !== null)\n return px / total;\n if (maxSize.endsWith(`%`))\n return Number.parseFloat(maxSize.replace(`%`, ``)) / 100;\n return null;\n }\n\n #getIntersectionPoint(): { x: number; y: number } | null {\n const outerBounds = this.getBoundingClientRect();\n const zoneEl = this.getZone();\n if (!zoneEl)\n return null;\n\n const nestedSplit = this.#getNestedSplit();\n if (!nestedSplit)\n return null;\n\n const _zoneBounds = zoneEl.getBoundingClientRect();\n\n const outerFraction = this.#parseSizeAsFraction(this.sizeA || `50%`, outerBounds.width);\n\n let x: number, y: number;\n\n if (this.layout === `vertical` && nestedSplit.layout === `horizontal`) {\n x = outerFraction * outerBounds.width;\n const nestedFraction = this.#parseSizeAsFraction(nestedSplit.sizeA || `50%`, outerBounds.height);\n y = nestedFraction * outerBounds.height;\n } else if (this.layout === `horizontal` && nestedSplit.layout === `vertical`) {\n const nestedFraction = this.#parseSizeAsFraction(nestedSplit.sizeA || `50%`, outerBounds.width);\n x = nestedFraction * outerBounds.width;\n y = outerFraction * outerBounds.height;\n } else {\n return null;\n }\n\n return { x, y };\n }\n\n #updateCornerPosition() {\n if (!this._hasCorner)\n return;\n\n const cornerZone = this.shadowRoot?.querySelector(`.corner-zone`) as HTMLElement | undefined;\n if (!cornerZone)\n return;\n\n const zoneEl = this.getZone();\n if (!zoneEl)\n return;\n\n const intersection = this.#getIntersectionPoint();\n if (!intersection) {\n cornerZone.style.display = `none`;\n return;\n }\n\n const cornerX = intersection.x - 6;\n const cornerY = intersection.y - 6;\n\n cornerZone.style.left = `${cornerX}px`;\n cornerZone.style.top = `${cornerY}px`;\n cornerZone.style.display = `block`;\n\n const nestedSplit = this.#getNestedSplit();\n if (nestedSplit) {\n if (this.layout === `vertical` && nestedSplit.layout === `horizontal`) {\n cornerZone.style.cursor = `nwse-resize`;\n } else if (this.layout === `horizontal` && nestedSplit.layout === `vertical`) {\n cornerZone.style.cursor = `nesw-resize`;\n }\n }\n }\n\n getZone(): HTMLElement | undefined {\n if (!this.shadowRoot)\n return;\n const el = this.shadowRoot.querySelector(`#zone`);\n if (!el)\n return undefined;\n return el as HTMLElement;\n }\n\n #onResizeHandleDown = (event: PointerEvent) => {\n event.preventDefault();\n const zoneEl = this.getZone();\n if (zoneEl) {\n zoneEl.classList.add(`user-resizing`);\n }\n this.#elementBounds = this.getBoundingClientRect();\n this.#startSizeA = this.sizeA;\n this.#startSizeB = this.sizeB;\n window.addEventListener(`pointerup`, this.#onResizeHandleUp);\n window.addEventListener(`pointermove`, this.#onResizeHandleMove);\n };\n\n #onResizeHandleUp = (event: PointerEvent) => {\n event.preventDefault();\n const zoneEl = this.getZone();\n if (zoneEl) {\n zoneEl.classList.remove(`user-resizing`);\n }\n window.removeEventListener(`pointerup`, this.#onResizeHandleUp);\n window.removeEventListener(`pointermove`, this.#onResizeHandleMove);\n };\n\n #onResizeHandleMove = (event: PointerEvent) => {\n const bounds = this.#elementBounds;\n if (!bounds)\n return;\n\n const threshold = 5;\n\n if (this.layout === `horizontal`) {\n const y = event.y - bounds.y;\n const relativeY = clamp(y / bounds.height);\n\n if (this.collapsible && this.collapsedA) {\n if (relativeY > (this.#collapsedAPointerAtCollapse ?? 0.05) + this.#hysteresisThreshold) {\n this.collapsedA = false;\n this.#dispatchCollapsedEvent(`A`, false);\n this.#collapsedAPointerAtCollapse = undefined;\n const { sizeA, sizeB } = this.#applyConstraints(\n `${relativeY * 100}%`,\n `${(1 - relativeY) * 100}%`,\n bounds.height,\n );\n this.sizeA = sizeA;\n this.sizeB = sizeB;\n }\n } else if (this.collapsible && !this.collapsedA && relativeY < threshold / bounds.height) {\n this.collapsedA = true;\n this.#dispatchCollapsedEvent(`A`, true);\n this.sizeA = `0px`;\n this.sizeB = `100%`;\n this.#collapsedAPointerAtCollapse = relativeY;\n } else if (!this.collapsedA) {\n const { sizeA, sizeB } = this.#applyConstraints(\n `${relativeY * 100}%`,\n `${(1 - relativeY) * 100}%`,\n bounds.height,\n );\n this.sizeA = sizeA;\n this.sizeB = sizeB;\n }\n\n if (this.collapsible && this.collapsedB) {\n if (relativeY < (this.#collapsedBPointerAtCollapse ?? 0.95) - this.#hysteresisThreshold) {\n this.collapsedB = false;\n this.#dispatchCollapsedEvent(`B`, false);\n this.#collapsedBPointerAtCollapse = undefined;\n const { sizeA, sizeB } = this.#applyConstraints(\n `${relativeY * 100}%`,\n `${(1 - relativeY) * 100}%`,\n bounds.height,\n );\n this.sizeA = sizeA;\n this.sizeB = sizeB;\n }\n } else if (this.collapsible && !this.collapsedB && relativeY > (1 - threshold / bounds.height)) {\n this.collapsedB = true;\n this.#dispatchCollapsedEvent(`B`, true);\n this.sizeA = `100%`;\n this.sizeB = `0px`;\n this.#collapsedBPointerAtCollapse = relativeY;\n }\n } else {\n const x = event.x - bounds.x;\n const relativeX = clamp(x / bounds.width);\n\n if (this.collapsible && this.collapsedA) {\n if (relativeX > (this.#collapsedAPointerAtCollapse ?? 0.05) + this.#hysteresisThreshold) {\n this.collapsedA = false;\n this.#dispatchCollapsedEvent(`A`, false);\n this.#collapsedAPointerAtCollapse = undefined;\n const { sizeA, sizeB } = this.#applyConstraints(\n `${relativeX * 100}%`,\n `${(1 - relativeX) * 100}%`,\n bounds.width,\n );\n this.sizeA = sizeA;\n this.sizeB = sizeB;\n }\n } else if (this.collapsible && !this.collapsedA && relativeX < threshold / bounds.width) {\n this.collapsedA = true;\n this.#dispatchCollapsedEvent(`A`, true);\n this.sizeA = `0px`;\n this.sizeB = `100%`;\n this.#collapsedAPointerAtCollapse = relativeX;\n } else if (!this.collapsedA) {\n const { sizeA, sizeB } = this.#applyConstraints(\n `${relativeX * 100}%`,\n `${(1 - relativeX) * 100}%`,\n bounds.width,\n );\n this.sizeA = sizeA;\n this.sizeB = sizeB;\n }\n\n if (this.collapsible && this.collapsedB) {\n if (relativeX < (this.#collapsedBPointerAtCollapse ?? 0.95) - this.#hysteresisThreshold) {\n this.collapsedB = false;\n this.#dispatchCollapsedEvent(`B`, false);\n this.#collapsedBPointerAtCollapse = undefined;\n const { sizeA, sizeB } = this.#applyConstraints(\n `${relativeX * 100}%`,\n `${(1 - relativeX) * 100}%`,\n bounds.width,\n );\n this.sizeA = sizeA;\n this.sizeB = sizeB;\n }\n } else if (this.collapsible && !this.collapsedB && relativeX > (1 - threshold / bounds.width)) {\n this.collapsedB = true;\n this.#dispatchCollapsedEvent(`B`, true);\n this.sizeA = `100%`;\n this.sizeB = `0px`;\n this.#collapsedBPointerAtCollapse = relativeX;\n }\n }\n event.preventDefault();\n };\n\n #onCornerResizeDown = (event: PointerEvent) => {\n event.preventDefault();\n event.stopPropagation();\n\n const zoneEl = this.getZone();\n if (zoneEl) {\n zoneEl.classList.add(`user-resizing`);\n }\n\n this.#elementBounds = this.getBoundingClientRect();\n this.#cornerStartX = event.clientX;\n this.#cornerStartY = event.clientY;\n this.#startSizeA = this.sizeA;\n this.#startSizeB = this.sizeB;\n\n const nestedSplit = this.#getNestedSplit();\n if (nestedSplit) {\n this.#nestedSplitInitialSizeA = nestedSplit.sizeA;\n const nestedBounds = nestedSplit.getBoundingClientRect();\n const nestedHandle = nestedSplit.shadowRoot?.querySelector(`.split-bar`) as HTMLElement;\n if (nestedHandle) {\n this.#nestedSplitBounds = nestedBounds;\n this.#nestedHandleBounds = nestedHandle.getBoundingClientRect();\n }\n const nestedZoneEl = nestedSplit.getZone();\n if (nestedZoneEl) {\n nestedZoneEl.classList.add(`user-resizing`);\n }\n }\n\n window.addEventListener(`pointerup`, this.#onCornerResizeUp);\n window.addEventListener(`pointermove`, this.#onCornerResizeMove);\n };\n\n #onCornerResizeUp = (event: PointerEvent) => {\n event.preventDefault();\n const zoneEl = this.getZone();\n if (zoneEl) {\n zoneEl.classList.remove(`user-resizing`);\n }\n const nestedSplit = this.#getNestedSplit();\n if (nestedSplit) {\n const nestedZoneEl = nestedSplit.getZone();\n if (nestedZoneEl) {\n nestedZoneEl.classList.remove(`user-resizing`);\n }\n }\n window.removeEventListener(`pointerup`, this.#onCornerResizeUp);\n window.removeEventListener(`pointermove`, this.#onCornerResizeMove);\n };\n\n #applyPendingNestedUpdate() {\n if (!this.#pendingNestedUpdate)\n return;\n const { sizeA, sizeB } = this.#pendingNestedUpdate;\n const nested = this.#getNestedSplit();\n if (nested) {\n nested.sizeA = `${sizeA * 100}%`;\n nested.sizeB = `${sizeB * 100}%`;\n }\n this.#pendingNestedUpdate = null;\n }\n\n #onCornerResizeMove = (event: PointerEvent) => {\n const outerBounds = this.#elementBounds;\n const zoneEl = this.getZone();\n const nestedSplit = this.#getNestedSplit();\n if (!outerBounds || !zoneEl || !nestedSplit)\n return;\n\n const zoneBounds = zoneEl.getBoundingClientRect();\n const cursorZoneLocalX = event.clientX - zoneBounds.left;\n const cursorZoneLocalY = event.clientY - zoneBounds.top;\n\n if (this.layout === `vertical` && nestedSplit.layout === `horizontal`) {\n let newOuterFraction = cursorZoneLocalX / outerBounds.width;\n const newNestedFraction = cursorZoneLocalY / outerBounds.height;\n\n const { sizeA: constrainedA, sizeB: constrainedB } = this.#applyConstraints(\n `${newOuterFraction * 100}%`,\n `${(1 - newOuterFraction) * 100}%`,\n outerBounds.width,\n );\n newOuterFraction = this.#parseSizeAsFraction(constrainedA, outerBounds.width);\n\n this.sizeA = constrainedA;\n this.sizeB = constrainedB;\n\n this.#pendingNestedUpdate = {\n sizeA: newNestedFraction,\n sizeB: 1 - newNestedFraction,\n };\n requestAnimationFrame(() => this.#applyPendingNestedUpdate());\n\n const cornerZone = this.shadowRoot?.querySelector(`.corner-zone`) as HTMLElement | undefined;\n if (cornerZone) {\n cornerZone.style.left = `${cursorZoneLocalX - 6}px`;\n cornerZone.style.top = `${cursorZoneLocalY - 6}px`;\n }\n } else if (this.layout === `horizontal` && nestedSplit.layout === `vertical`) {\n const newNestedFraction = cursorZoneLocalX / outerBounds.width;\n let newOuterFraction = cursorZoneLocalY / outerBounds.height;\n\n const { sizeA: constrainedA, sizeB: constrainedB } = this.#applyConstraints(\n `${newOuterFraction * 100}%`,\n `${(1 - newOuterFraction) * 100}%`,\n outerBounds.height,\n );\n newOuterFraction = this.#parseSizeAsFraction(constrainedA, outerBounds.height);\n\n this.sizeA = constrainedA;\n this.sizeB = constrainedB;\n\n this.#pendingNestedUpdate = {\n sizeA: newNestedFraction,\n sizeB: 1 - newNestedFraction,\n };\n requestAnimationFrame(() => this.#applyPendingNestedUpdate());\n\n const cornerZone = this.shadowRoot?.querySelector(`.corner-zone`) as HTMLElement | undefined;\n if (cornerZone) {\n cornerZone.style.left = `${cursorZoneLocalX - 6}px`;\n cornerZone.style.top = `${cursorZoneLocalY - 6}px`;\n }\n }\n\n event.preventDefault();\n };\n\n render() {\n const sizePrefix = this.layout === `vertical` ? `width` : `height`;\n let sizeA = this.sizeA;\n let sizeB = this.sizeB;\n\n if (this.collapsedA) {\n sizeA = `0px`;\n } else if (sizeA.length === 0 && sizeB.length === 0) {\n sizeB = sizeA = `50%`;\n } else if (sizeA.length === 0) {\n sizeA = `auto`;\n } else if (sizeB.length === 0) {\n sizeB = `auto`;\n }\n\n if (this.collapsedB) {\n sizeB = `0px`;\n }\n\n sizeA = `${sizePrefix}:${sizeA}`;\n sizeB = `${sizePrefix}:${sizeB}`;\n\n return html`\n <div id=\"zone\">\n <slot style=${sizeA} name=\"a\"></slot>\n ${this._hasCorner ? html`<div class=\"corner-zone\" @pointerdown=${this.#onCornerResizeDown}></div>` : ``}\n <div @pointerdown=${this.#onResizeHandleDown} class=\"split-bar\">\n ${this.showGrabHandle\n ? html`<span\n class=\"ixfx-handle\"\n part=\"grip\"\n data-handle=\"dimpled\"\n data-shape=${this.layout === `horizontal` ? `horizontal` : `vertical`}\n ></span>`\n : ``}\n </div>\n <slot style=${sizeB} name=\"b\"></slot>\n </div>`;\n }\n\n static styles = [themeFallbacks, handleStyles, css`\n :host {\n --handle-size: 2px;\n --handle-colour: transparent;\n --handle-hover-colour: var(--surface-6);\n --handle-active-colour: var(--accent);\n /* Grip — shared handle primitive (docs/infra-handle.md). */\n --ixfx-handle-length: 16px;\n --ixfx-handle-thickness: 8px;\n\n display: block;\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n }\n * {\n box-sizing: border-box;\n }\n #zone {\n display: flex;\n height: 100%;\n position: relative;\n }\n slot {\n display: block;\n overflow: hidden;\n border: var(--border-subtle);\n border-radius: var(--radius-m);\n }\n :slotted(*) {\n width: 100%;\n height: 100%;\n }\n\n .split-bar {\n position: relative;\n background-color: var(--handle-colour);\n transition: background-color 0.3s ease 0s;\n width: var(--handle-size);\n height: 100%;\n cursor: ew-resize;\n flex-shrink: 0;\n border-radius: var(--radius-m);\n\n }\n\n @keyframes handle-hover {\n from { background-color: var(--handle-colour); }\n to { background-color: var(--handle-hover-colour); }\n }\n\n .split-bar .ixfx-handle {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n }\n\n #zone.user-resizing .ixfx-handle {\n display: none;\n }\n #zone.user-resizing {\n slot {\n opacity: 0.5;\n }\n .split-bar {\n background-color: var(--handle-active-colour);\n transition: none;\n animation: none !important;\n }\n }\n\n #zone:not(.user-resizing) .split-bar:hover {\n animation: handle-hover 0.001s ease-out 0.7s both;\n }\n\n .corner-zone {\n position: absolute;\n width: 12px;\n height: 12px;\n z-index: 10;\n border-radius: 50%;\n background: transparent;\n }\n .corner-zone:hover {\n background: transparent;\n }\n\n :host([layout='horizontal']) {\n #zone {\n flex-direction: column;\n }\n .split-bar {\n position: relative;\n background-color: var(--handle-colour);\n transition: background-color 0.3s ease 0s;\n height: var(--handle-size);\n width: 100%;\n cursor: ns-resize;\n }\n #zone.user-resizing .split-bar {\n background-color: var(--handle-active-colour);\n transition: none;\n animation: none !important;\n }\n }\n\n :host([data-collapsed-a]) slot[name=\"a\"],\n :host([data-collapsed-b]) slot[name=\"b\"] {\n display: none;\n }\n `];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ixfx-twosplit-layout\": TwoSplitLayoutElement;\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 './bottom-drawer/bottom-drawer.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 './data-table/data-table.js';\nexport * from './detail-list/detail-list.js';\nexport {\n getActiveDragPanelId,\n isDragging,\n pointerOverAnyHost,\n} from './dock/dock-drag.js';\nexport type { DockDropZone } from './dock/dock-drag.js';\nexport * from './dock/dock-host.js';\nexport * from './dock/dock-model.js';\nexport * from './dock/dock-panel.js';\nexport * from './dock/types.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 './grid-list/grid-list.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 './interaction/index.js';\nexport * from './labelled-radial-input/index.js';\nexport * from './labelled-range-input/index.js';\nexport * from './labelled-slider-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 './pan-text/index.js';\nexport * from './panel/panel-group.js';\nexport * from './panel/panel.js';\nexport * from './plots/colour-map.js';\nexport * from './plots/data.js';\nexport * from './plots/multi-axis.js';\nexport * from './plots/plot-histogram.js';\nexport * from './plots/single-axis.js';\nexport * from './plots/xy-axis.js';\nexport * from './polar-pad/polar-pad.js';\nexport * from './radial-input/radial-input.js';\nexport * from './radial-input/types.js';\nexport * from './range-input/index.js';\nexport * from './range/range-multi.js';\nexport * from './range/range.js';\nexport * from './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 './split-layout/split-model.js';\nexport * from './split-layout/split-panel.js';\nexport * from './split-layout/types.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 './titlebar/titlebar.js';\nexport * from './toolbar/toolbar-group.js';\nexport * from './toolbar/toolbar.js';\nexport * from './toolbar/types.js';\nexport * from './transitory-label/transitory-label.js';\nexport * from './tree/index.js';\nexport * from './twosplit-layout/split-layout.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}\n"],"mappings":"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"}
|