@ixfx/components 0.6.2 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (181) hide show
  1. package/bundle/index.d.ts +1918 -835
  2. package/bundle/index.d.ts.map +1 -1
  3. package/bundle/index.js +22137 -16840
  4. package/bundle/index.js.map +1 -1
  5. package/bundle/style.css +1 -1
  6. package/dist/ac-text.d.ts +1 -1
  7. package/dist/ac-text.js +3 -2
  8. package/dist/ac-text.js.map +1 -1
  9. package/dist/{ac-token-BAa6ke09.d.ts → ac-token--_vCHXWw.d.ts} +2 -2
  10. package/dist/{ac-token-BAa6ke09.d.ts.map → ac-token--_vCHXWw.d.ts.map} +1 -1
  11. package/dist/ac-token.d.ts +1 -1
  12. package/dist/ac-token.js +3 -2
  13. package/dist/ac-token.js.map +1 -1
  14. package/dist/{button-Bn0BuLpO.js → button-DsFbV4XD.js} +5 -4
  15. package/dist/button-DsFbV4XD.js.map +1 -0
  16. package/dist/button.d.ts.map +1 -1
  17. package/dist/button.js +1 -1
  18. package/dist/checkbox.js +1 -1
  19. package/dist/{colour-picker-0stHB90J.js → colour-picker-Ddsk-7E_.js} +4 -3
  20. package/dist/{colour-picker-0stHB90J.js.map → colour-picker-Ddsk-7E_.js.map} +1 -1
  21. package/dist/colour-picker.js +1 -1
  22. package/dist/crumbs.d.ts +1 -1
  23. package/dist/crumbs.js +4 -2
  24. package/dist/crumbs.js.map +1 -1
  25. package/dist/data-display.js +1 -1
  26. package/dist/{data-grid-C8qIo1-u.d.ts → data-grid-Bh4YrQGK.d.ts} +2 -2
  27. package/dist/{data-grid-C8qIo1-u.d.ts.map → data-grid-Bh4YrQGK.d.ts.map} +1 -1
  28. package/dist/data-grid.d.ts +1 -1
  29. package/dist/data-grid.js +4 -2
  30. package/dist/data-grid.js.map +1 -1
  31. package/dist/{defaults-BCiDhZbF.js → defaults-BJwDsMH4.js} +27 -20
  32. package/dist/defaults-BJwDsMH4.js.map +1 -0
  33. package/dist/editable-label-rzXkjf1H.d.ts +75 -0
  34. package/dist/editable-label-rzXkjf1H.d.ts.map +1 -0
  35. package/dist/editable-label.d.ts +2 -75
  36. package/dist/editable-label.js +2 -1
  37. package/dist/editable-label.js.map +1 -1
  38. package/dist/{fallbacks-DEE1nCTt.js → fallbacks-DNI9xt0F.js} +2 -2
  39. package/dist/{fallbacks-DEE1nCTt.js.map → fallbacks-DNI9xt0F.js.map} +1 -1
  40. package/dist/{grouped-item-lister-_pMDwIo1.d.ts → grouped-item-lister-DnWB-eFT.d.ts} +2 -2
  41. package/dist/{grouped-item-lister-_pMDwIo1.d.ts.map → grouped-item-lister-DnWB-eFT.d.ts.map} +1 -1
  42. package/dist/grouped-item-lister.d.ts +1 -1
  43. package/dist/{hex-editor-Bk6rxhfg.js → hex-editor-BiRfwTz1.js} +2 -2
  44. package/dist/{hex-editor-Bk6rxhfg.js.map → hex-editor-BiRfwTz1.js.map} +1 -1
  45. package/dist/hex.js +1 -1
  46. package/dist/{icon-DpA9x2Ve.d.ts → icon-CDGprSdE.d.ts} +1 -12
  47. package/dist/icon-CDGprSdE.d.ts.map +1 -0
  48. package/dist/{icons-Bm2ByQ3s.js → icon-DcEEGQa_.js} +38 -12
  49. package/dist/icon-DcEEGQa_.js.map +1 -0
  50. package/dist/icons.d.ts +3 -3
  51. package/dist/icons.js +9 -3
  52. package/dist/icons.js.map +1 -0
  53. package/dist/{index-CKtLhgYj.d.ts → index-9AhaHIT2.d.ts} +3 -3
  54. package/dist/{index-CKtLhgYj.d.ts.map → index-9AhaHIT2.d.ts.map} +1 -1
  55. package/dist/index-CG2vIgPv.d.ts +101 -0
  56. package/dist/index-CG2vIgPv.d.ts.map +1 -0
  57. package/dist/{index-BtGFYfaK.d.ts → index-CS9yM8L-.d.ts} +14 -4
  58. package/dist/index-CS9yM8L-.d.ts.map +1 -0
  59. package/dist/index.d.ts +861 -71
  60. package/dist/index.d.ts.map +1 -1
  61. package/dist/index.js +4257 -931
  62. package/dist/index.js.map +1 -1
  63. package/dist/interaction-D5XdKzbR.js +2 -0
  64. package/dist/labelled-radial-input.js +2 -1
  65. package/dist/labelled-radial-input.js.map +1 -1
  66. package/dist/labelled-slider-input-DzigjMwP.js +808 -0
  67. package/dist/labelled-slider-input-DzigjMwP.js.map +1 -0
  68. package/dist/labelled-slider-input.d.ts +2 -0
  69. package/dist/labelled-slider-input.js +2 -0
  70. package/dist/{types-DlVNJez_.d.ts → list-selection-types-DSuRNWpx.d.ts} +10 -2
  71. package/dist/list-selection-types-DSuRNWpx.d.ts.map +1 -0
  72. package/dist/menu-CXDFJxNm.js +825 -0
  73. package/dist/menu-CXDFJxNm.js.map +1 -0
  74. package/dist/{menu-item-Bs2MYyHq.d.ts → menu-item-CZi9vy5O.d.ts} +4 -2
  75. package/dist/menu-item-CZi9vy5O.d.ts.map +1 -0
  76. package/dist/menu-item-D2S4i8u1.js +809 -0
  77. package/dist/menu-item-D2S4i8u1.js.map +1 -0
  78. package/dist/menu.d.ts +2 -2
  79. package/dist/menu.js +2 -1
  80. package/dist/miller.d.ts +1 -1
  81. package/dist/miller.js +3 -2
  82. package/dist/miller.js.map +1 -1
  83. package/dist/narrowed-text.js +4 -2
  84. package/dist/narrowed-text.js.map +1 -1
  85. package/dist/notification-pill-DyZydXoZ.d.ts.map +1 -1
  86. package/dist/notifier.js +4 -3
  87. package/dist/notifier.js.map +1 -1
  88. package/dist/panel.d.ts +13 -13
  89. package/dist/panel.d.ts.map +1 -1
  90. package/dist/panel.js +37 -253
  91. package/dist/panel.js.map +1 -1
  92. package/dist/plots.js +1 -1
  93. package/dist/polar-pad.js +1 -1
  94. package/dist/{radial-input-Dk8Wydp5.js → radial-input-Dp5qz0ly.js} +2 -2
  95. package/dist/{radial-input-Dk8Wydp5.js.map → radial-input-Dp5qz0ly.js.map} +1 -1
  96. package/dist/radial-input.js +1 -1
  97. package/dist/range-input.js +1 -1
  98. package/dist/range.js +1 -1
  99. package/dist/registry-BEtb8_wB.js +46 -0
  100. package/dist/registry-BEtb8_wB.js.map +1 -0
  101. package/dist/select-horiz.js +3 -2
  102. package/dist/select-horiz.js.map +1 -1
  103. package/dist/{slider-input-XppH3vcy.d.ts → slider-input-BfRUW2ZB.d.ts} +16 -3
  104. package/dist/slider-input-BfRUW2ZB.d.ts.map +1 -0
  105. package/dist/{slider-input-CT4gcF-o.js → slider-input-De4eoT11.js} +382 -67
  106. package/dist/slider-input-De4eoT11.js.map +1 -0
  107. package/dist/slider-input.d.ts +1 -1
  108. package/dist/slider-input.js +1 -1
  109. package/dist/snackbar.js +1 -1
  110. package/dist/split-layout-BFSbUZQv.js +969 -0
  111. package/dist/split-layout-BFSbUZQv.js.map +1 -0
  112. package/dist/split-layout-JK3xWVX2.d.ts +179 -0
  113. package/dist/split-layout-JK3xWVX2.d.ts.map +1 -0
  114. package/dist/split-layout.d.ts +2 -60
  115. package/dist/split-layout.js +1 -617
  116. package/dist/style.css +1 -1
  117. package/dist/swipe.js +1 -1
  118. package/dist/{tab-list-D_1cYhB_.d.ts → tab-list-CGyPt07Z.d.ts} +10 -2
  119. package/dist/tab-list-CGyPt07Z.d.ts.map +1 -0
  120. package/dist/tabs.d.ts +1 -1
  121. package/dist/tabs.js +128 -27
  122. package/dist/tabs.js.map +1 -1
  123. package/dist/{tickled-controller-BtevrRLV.d.ts → tickled-controller-CRzdIEjJ.d.ts} +7 -1
  124. package/dist/tickled-controller-CRzdIEjJ.d.ts.map +1 -0
  125. package/dist/{tickled-controller-DkAU-0qL.js → tickled-controller-h9GmJ_bU.js} +8 -2
  126. package/dist/tickled-controller-h9GmJ_bU.js.map +1 -0
  127. package/dist/titlebar-Bj5pfdw_.d.ts +50 -0
  128. package/dist/titlebar-Bj5pfdw_.d.ts.map +1 -0
  129. package/dist/titlebar.d.ts +2 -0
  130. package/dist/titlebar.js +324 -0
  131. package/dist/titlebar.js.map +1 -0
  132. package/dist/tooltip-BlvBUQxx.d.ts.map +1 -1
  133. package/dist/{tree-BO6BXI2b.js → tree-Ch4W8qXQ.js} +4 -3
  134. package/dist/{tree-BO6BXI2b.js.map → tree-Ch4W8qXQ.js.map} +1 -1
  135. package/dist/tree.d.ts +1 -1
  136. package/dist/tree.js +1 -1
  137. package/dist/vertical-list-ClnqTkF3.js +814 -0
  138. package/dist/vertical-list-ClnqTkF3.js.map +1 -0
  139. package/dist/vertical-list.d.ts +8 -9
  140. package/dist/vertical-list.d.ts.map +1 -1
  141. package/dist/vertical-list.js +1 -736
  142. package/dist/{xy-axis-B6yMjckW.js → xy-axis-DWizs0bt.js} +109 -3
  143. package/dist/xy-axis-DWizs0bt.js.map +1 -0
  144. package/dist/xy-pad.js +1 -1
  145. package/docs-user/README.md +5 -0
  146. package/docs-user/detail-list.md +398 -0
  147. package/docs-user/dock.md +461 -0
  148. package/docs-user/icons.md +4 -0
  149. package/docs-user/index.json +28 -3
  150. package/docs-user/labelled-slider-input.md +198 -0
  151. package/docs-user/llms.txt +6 -1
  152. package/docs-user/panel.md +20 -1
  153. package/docs-user/slider-input.md +55 -15
  154. package/docs-user/split-layout.md +136 -170
  155. package/docs-user/tabs.md +54 -0
  156. package/docs-user/titlebar.md +102 -0
  157. package/docs-user/toolbar.md +95 -22
  158. package/docs-user/twosplit-layout.md +254 -0
  159. package/docs-user/user-catalog.md +8 -1
  160. package/docs-user/user-theming.md +109 -0
  161. package/llms.txt +6 -1
  162. package/package.json +1 -2
  163. package/dist/button-Bn0BuLpO.js.map +0 -1
  164. package/dist/defaults-BCiDhZbF.js.map +0 -1
  165. package/dist/editable-label.d.ts.map +0 -1
  166. package/dist/icon-DpA9x2Ve.d.ts.map +0 -1
  167. package/dist/icons-Bm2ByQ3s.js.map +0 -1
  168. package/dist/index-BtGFYfaK.d.ts.map +0 -1
  169. package/dist/menu-DIfU70AA.js +0 -1609
  170. package/dist/menu-DIfU70AA.js.map +0 -1
  171. package/dist/menu-item-Bs2MYyHq.d.ts.map +0 -1
  172. package/dist/slider-input-CT4gcF-o.js.map +0 -1
  173. package/dist/slider-input-XppH3vcy.d.ts.map +0 -1
  174. package/dist/split-layout.d.ts.map +0 -1
  175. package/dist/split-layout.js.map +0 -1
  176. package/dist/tab-list-D_1cYhB_.d.ts.map +0 -1
  177. package/dist/tickled-controller-BtevrRLV.d.ts.map +0 -1
  178. package/dist/tickled-controller-DkAU-0qL.js.map +0 -1
  179. package/dist/types-DlVNJez_.d.ts.map +0 -1
  180. package/dist/vertical-list.js.map +0 -1
  181. package/dist/xy-axis-B6yMjckW.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"menu-DIfU70AA.js","names":["customElement","customElement","customElement","customElement","customElement","customElement","customElement","customElement","customElement","customElement"],"sources":["../src/menu/menu-container.ts","../src/menu/menu-trigger.ts","../src/menu/menu-item.ts","../src/menu/menu-bar.ts","../src/menu/menu-check-item.ts","../src/menu/menu-command-controller.ts","../src/menu/menu-sub-trigger.ts","../src/menu/menu-separator.ts","../src/menu/menu-header.ts","../src/menu/menu-from-tree.ts","../src/menu/menu-radio-item.ts","../src/menu/menu-radio-group.ts","../src/menu/index.ts"],"sourcesContent":["import type { CommandRegistry, KeyboardManager } from '@clinth/ui-commands';\nimport { css, html, LitElement } from 'lit';\nimport { property, query } from 'lit/decorators.js';\nimport { TickledController, tickledStyles } from '../interaction/index.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-menu-container`)\nexport class MenuContainer extends LitElement {\n @property({ type: String, attribute: `anchor` }) anchor?: string;\n @property({ attribute: false }) registry?: CommandRegistry<unknown>;\n @property({ attribute: false }) keyboardManager?: KeyboardManager;\n @query(`.popover`) private _popover!: HTMLElement;\n\n // TickledController manages input mode and tickled state\n private tickled = new TickledController<number>(this, {\n getItems: () => {\n const items = this._getMenuItems();\n return items.map((item, i) => ({\n id: i,\n enabled: !item.hasAttribute(`disabled`),\n }));\n },\n onTickle: (index) => {\n // When an item is tickled (hovered/keyboard focused), handle submenu opening\n const items = this._getMenuItems();\n if (index !== undefined) {\n const item = items[index];\n // Ensure the item is focusable and focus it\n item.tabIndex = 0;\n item.focus({ preventScroll: true });\n }\n },\n onStateChange: () => {\n // Sync DOM attributes for slotted content\n this._syncTickledClasses();\n },\n });\n\n static styles = [popupSurfaceStyles, themeFallbacks, tickledStyles, css`\n :host {\n display: block;\n }\n\n .popover {\n padding: var(--space-xs) 0;\n min-width: 160px;\n }\n\n :host {\n opacity: 1;\n transform: translateY(0) scale(1);\n transition: opacity 0.12s ease-out, transform 0.12s ease-out,\n display 0.12s allow-discrete, overlay 0.12s allow-discrete;\n }\n\n @starting-style :host {\n opacity: 0;\n transform: translateY(-4px) scale(0.97);\n }\n\n ::slotted(menu-separator) {\n display: block;\n margin: var(--space-xs) 0;\n }\n `];\n\n private _updateIconSections(): void {\n const slot = this.shadowRoot?.querySelector(`slot`) as HTMLSlotElement | null;\n if (!slot)\n return;\n\n const assigned = slot.assignedElements({ flatten: true });\n\n // Group direct children into sections delimited by separators and headers\n const sections: Element[][] = [];\n let section: Element[] = [];\n for (const el of assigned) {\n if (el.tagName === `IXFX-MENU-SEPARATOR` || el.tagName === `IXFX-MENU-HEADER`) {\n if (section.length > 0) {\n sections.push(section); section = [];\n }\n } else {\n section.push(el);\n }\n }\n if (section.length > 0)\n sections.push(section);\n\n this._propagateContext();\n\n for (const sec of sections) {\n const hasIcon = sec.some((el) => {\n if (el.tagName === `IXFX-MENU-RADIO-GROUP`) {\n return [...el.children].some(ri => ri.hasAttribute(`icon-name`));\n }\n return el.hasAttribute(`icon-name`);\n });\n\n for (const el of sec) {\n if (el.tagName === `IXFX-MENU-RADIO-GROUP`) {\n for (const ri of el.children) {\n if (hasIcon)\n ri.setAttribute(`data-icon-section`, ``);\n else ri.removeAttribute(`data-icon-section`);\n }\n } else {\n if (hasIcon)\n el.setAttribute(`data-icon-section`, ``);\n else el.removeAttribute(`data-icon-section`);\n }\n }\n }\n\n this.performUpdate();\n }\n\n private _propagateContext(): void {\n const slot = this.shadowRoot?.querySelector(`slot`) as HTMLSlotElement | null;\n if (!slot)\n return;\n for (const el of slot.assignedElements({ flatten: true })) {\n if (`registry` in el)\n (el as any).registry = this.registry;\n if (`keyboardManager` in el)\n (el as any).keyboardManager = this.keyboardManager;\n }\n }\n\n override updated(changedProperties: Map<string, unknown>): void {\n if (changedProperties.has(`registry`) || changedProperties.has(`keyboardManager`)) {\n this._propagateContext();\n }\n }\n\n /**\n * Sync data-input-mode to :host so CSS variables cascade to slotted items\n */\n willUpdate(changed: Map<PropertyKey, unknown>): void {\n super.willUpdate(changed);\n // Set data-input-mode on :host so tickledStyles CSS variables cascade\n // through shadow DOM to slotted menu items\n this.setAttribute(`data-input-mode`, this.tickled.inputMode);\n }\n\n render() {\n return html`\n <div\n class=\"popover popup-surface\"\n role=\"menu\"\n @keydown=${this._handleKeydown}\n @mouseover=${this._handleMouseOver}\n >\n <slot @slotchange=${this._updateIconSections}></slot>\n </div>\n `;\n }\n\n private _getMenuItems(): HTMLElement[] {\n const slot = this.shadowRoot?.querySelector(`slot`);\n if (!slot)\n return [];\n\n const skipTags = [`IXFX-MENU-SEPARATOR`, `IXFX-MENU-HEADER`];\n const result: HTMLElement[] = [];\n\n for (const el of slot.assignedElements({ flatten: true })) {\n if (skipTags.includes(el.tagName))\n continue;\n if (el.hasAttribute(`disabled`))\n continue;\n const role = el.getAttribute(`role`);\n if (role === `none` || role === `presentation`)\n continue;\n\n if (el.tagName === `IXFX-MENU-RADIO-GROUP`) {\n const groupSlot = el.shadowRoot?.querySelector(`slot`) as HTMLSlotElement | null;\n for (const radioItem of groupSlot?.assignedElements({ flatten: true }) ?? []) {\n if (!radioItem.hasAttribute(`disabled`)) {\n result.push(radioItem as HTMLElement);\n }\n }\n } else {\n result.push(el as HTMLElement);\n }\n }\n\n return result;\n }\n\n /**\n * Sync .tickled class on slotted items to match controller state\n * This is called via onStateChange whenever the tickled state changes\n */\n private _syncTickledClasses(): void {\n const items = this._getMenuItems();\n items.forEach((item, i) => {\n if (this.tickled.isTickled(i)) {\n item.classList.add(`tickled`);\n item.tabIndex = 0;\n // Set inline styles to ensure visibility across shadow DOM boundaries\n const innerItem = item.shadowRoot?.querySelector(`.item`) as HTMLElement | null;\n if (innerItem) {\n innerItem.style.background = `rgba(0, 0, 0, 0.06)`;\n innerItem.style.borderColor = `var(--accent)`;\n innerItem.style.color = `inherit`;\n }\n } else {\n item.classList.remove(`tickled`);\n item.tabIndex = -1;\n // Clear inline styles\n const innerItem = item.shadowRoot?.querySelector(`.item`) as HTMLElement | null;\n if (innerItem) {\n innerItem.style.background = ``;\n innerItem.style.borderColor = ``;\n innerItem.style.color = ``;\n }\n }\n });\n\n // Focus the tickled item if in keyboard mode\n if (this.tickled.inputMode === `keyboard` && this.tickled.tickledId !== undefined) {\n const tickledItem = items[this.tickled.tickledId];\n tickledItem?.focus();\n }\n }\n\n private _handleMouseOver = (e: MouseEvent): void => {\n const items = this._getMenuItems();\n // composedPath crosses shadow boundaries to find the hovered menu item\n const path = e.composedPath();\n const hoveredIndex = items.findIndex(item => path.includes(item));\n if (hoveredIndex !== -1) {\n const item = items[hoveredIndex];\n // If IXFX-MENU-CONTAINER appears before this item in the composed path, the\n // event originated from inside a nested submenu. Skip the focus override so the\n // inner container keeps ownership of focus. stopPropagation() alone is not\n // sufficient because it does not reliably cross shadow-root boundaries with\n // popovers in the stack — both this handler and the inner one will fire.\n const itemPathIndex = path.indexOf(item);\n const isFromInsideSubmenu = path.slice(0, itemPathIndex).some(\n node => node instanceof Element && node.tagName === `IXFX-MENU-CONTAINER`,\n );\n if (!isFromInsideSubmenu) {\n // Use TickledController to handle mouse hover\n this.tickled.handlePointerEnter(hoveredIndex);\n }\n // Stop propagation so ancestor MenuContainers don't override this focus\n // with their own mouseover handler (e.g. outer menu focusing the sub-trigger).\n e.stopPropagation();\n }\n };\n\n focusFirst(): void {\n this.tickled.handleKeyboardNavigation(`first`);\n }\n\n private _focusNext(items: HTMLElement[], direction: number): void {\n if (items.length === 0) {\n return;\n }\n\n this.tickled.handleKeyboardNavigation(direction > 0 ? `next` : `previous`);\n }\n\n private _focusItem(items: HTMLElement[], index: number): void {\n if (items.length === 0) {\n return;\n }\n\n // Clamp index to valid range\n const clampedIndex = Math.max(0, Math.min(index, items.length - 1));\n this.tickled.handleKeyboardNavigation(clampedIndex);\n }\n\n private _activateFocusedItem(items: HTMLElement[]): void {\n const tickledIndex = this.tickled.tickledId;\n if (tickledIndex === undefined) {\n return;\n }\n\n const item = items[tickledIndex];\n if (!item) {\n return;\n }\n\n const tagName = item.tagName;\n\n if (tagName === `IXFX-MENU-SUB-TRIGGER`) {\n // Native menu behavior handles submenu navigation automatically\n return;\n }\n\n if (tagName === `IXFX-MENU-CHECK-ITEM`) {\n const checkItem = item as any;\n checkItem.checked = !checkItem.checked;\n checkItem.dispatchEvent(new CustomEvent(`command`, {\n detail: { command: checkItem.command, checked: checkItem.checked },\n bubbles: true,\n composed: true,\n }));\n return;\n }\n\n if (tagName === `IXFX-MENU-RADIO-ITEM`) {\n item.dispatchEvent(new CustomEvent(`radio-select`, {\n detail: { value: (item as any).value },\n bubbles: true,\n composed: true,\n }));\n return;\n }\n\n if (tagName === `IXFX-MENU-ITEM`) {\n const command = (item as any).command;\n if (command) {\n item.dispatchEvent(new CustomEvent(`command`, {\n detail: { command },\n bubbles: true,\n composed: true,\n }));\n }\n return;\n }\n\n (item as HTMLElement).click();\n }\n\n private _handleKeydown = (e: KeyboardEvent): void => {\n const items = this._getMenuItems();\n if (items.length === 0) {\n return;\n }\n\n switch (e.key) {\n case `ArrowDown`:\n e.preventDefault();\n e.stopPropagation();\n this._focusNext(items, 1);\n break;\n case `ArrowUp`:\n e.preventDefault();\n e.stopPropagation();\n this._focusNext(items, -1);\n break;\n case `Home`:\n e.preventDefault();\n e.stopPropagation();\n this._focusItem(items, 0);\n break;\n case `End`:\n e.preventDefault();\n e.stopPropagation();\n this._focusItem(items, items.length - 1);\n break;\n case `Enter`:\n case ` `:\n e.preventDefault();\n e.stopPropagation();\n this._activateFocusedItem(items);\n break;\n }\n };\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-menu-container': MenuContainer;\n }\n}\n","import type { CommandRegistry, KeyboardManager } from '@clinth/ui-commands';\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';\nimport './menu-container.js';\n\ntype MenuMode = `trigger` | `dropdown` | `context`;\ntype Placement = `bottom-start` | `bottom-end` | `right-start`;\n\nexport type MenuTriggerCommandDetail = {\n readonly command?: string;\n readonly value?: string;\n readonly checked?: boolean;\n};\n\nexport type MenuTriggerCommandEvent = CustomEvent<MenuTriggerCommandDetail>;\n\n@customElement(`ixfx-menu-trigger`)\nexport class MenuTrigger extends LitElement {\n @property({ type: String }) mode: MenuMode = `trigger`;\n @property({ type: String }) label = `⋮`;\n @property({ attribute: false }) registry?: CommandRegistry<unknown>;\n @property({ attribute: false }) keyboardManager?: KeyboardManager;\n @property({ type: String }) placement: Placement = `bottom-start`;\n /** Set false when a host widget manages its own roving/virtual focus (e.g. crumb-navigation) and opens this menu programmatically, so the trigger button should not be a native Tab stop. */\n @property({ type: Boolean, attribute: `tab-stop` }) tabStop = true;\n\n @state() private _isOpen = false;\n @state() private _hasMenu = false;\n @state() private _hasTriggerSlot = false;\n\n @query(`.trigger-btn`) private _triggerBtn!: HTMLButtonElement;\n @query(`.popup`) private _popup!: HTMLElement;\n\n private static _count = 0;\n\n private _anchorName = `--mt-${MenuTrigger._count++}`;\n private _clickListener = this._handleClickOutside.bind(this);\n\n connectedCallback(): void {\n super.connectedCallback();\n document.addEventListener(`keydown`, this._handleKeydown);\n this.addEventListener(`command`, this._handleCommand as EventListener);\n this.addEventListener(`radio-change`, this._handleRadioChange as EventListener);\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n document.removeEventListener(`keydown`, this._handleKeydown);\n this.removeEventListener(`command`, this._handleCommand as EventListener);\n this.removeEventListener(`radio-change`, this._handleRadioChange as EventListener);\n document.removeEventListener(`click`, this._clickListener);\n }\n\n firstUpdated(): void {\n this.style.setProperty(`--anchor-name`, this._anchorName);\n this._popup.addEventListener(`toggle`, this._handlePopoverToggle);\n\n this.updateComplete.then(() => {\n const slot = this.shadowRoot?.querySelector(`slot[name=\"menu\"]`) as HTMLSlotElement | undefined;\n if (slot) {\n const assigned = slot.assignedElements({ flatten: true });\n if (assigned.length > 0) {\n this._hasMenu = true;\n this._propagateContext();\n }\n }\n\n this._updatePosition();\n });\n }\n\n updated(changedProperties: Map<string, unknown>): void {\n if (changedProperties.has(`registry`) || changedProperties.has(`keyboardManager`)) {\n this._propagateContext();\n }\n }\n\n private _updatePosition(): void {\n const placements: Record<Placement, { insetArea: string }> = {\n 'bottom-start': { insetArea: `block-end span-inline-start` },\n 'bottom-end': { insetArea: `block-end span-inline-end` },\n 'right-start': { insetArea: `inline-end span-block-start` },\n };\n const pos = placements[this.placement];\n (this._popup.style as any).insetArea = pos.insetArea;\n (this._popup.style as any).positionAnchor = this._anchorName;\n // fallback for browsers without inset-area\n const fallbacks: Record<Placement, { top: string; left: string; right: string }> = {\n 'bottom-start': { top: `anchor(bottom)`, left: `anchor(left)`, right: `auto` },\n 'bottom-end': { top: `anchor(bottom)`, left: `auto`, right: `anchor(left)` },\n 'right-start': { top: `anchor(top)`, left: `anchor(right)`, right: `auto` },\n };\n const fb = fallbacks[this.placement];\n this._popup.style.top = fb.top;\n this._popup.style.left = fb.left;\n (this._popup.style as any).right = fb.right;\n }\n\n private _propagateContext(): void {\n const slot = this.shadowRoot?.querySelector(`slot[name=\"menu\"]`) as HTMLSlotElement | undefined;\n const items = slot?.assignedElements({ flatten: true }) ?? [];\n for (const el of items) {\n if (`registry` in el)\n (el as any).registry = this.registry;\n if (`keyboardManager` in el)\n (el as any).keyboardManager = this.keyboardManager;\n }\n }\n\n private _handleSlotChange(e: Event): void {\n const slot = e.target as HTMLSlotElement;\n const assigned = slot.assignedElements({ flatten: true });\n this._hasMenu = assigned.length > 0;\n this._propagateContext();\n }\n\n private _handleTriggerSlotChange(e: Event): void {\n const slot = e.target as HTMLSlotElement;\n this._hasTriggerSlot = slot.assignedElements({ flatten: true }).length > 0;\n }\n\n get isOpen(): boolean {\n return this._isOpen;\n }\n\n openMenu(): void {\n this._openMenu();\n }\n\n closeMenu(): void {\n this._closeMenu();\n }\n\n focusTrigger(): void {\n this._triggerBtn?.focus();\n }\n\n private _openMenu(): void {\n if (this._isOpen || !this._popup?.popover)\n return;\n try {\n (this._popup as any).showPopover({ source: this });\n this._isOpen = true;\n document.addEventListener(`click`, this._clickListener);\n this.dispatchEvent(new CustomEvent(`menu-trigger-open`, { bubbles: true, composed: true }));\n requestAnimationFrame(() => {\n this._getMenuContainer()?.focusFirst();\n });\n } catch (err) {\n console.warn(`showPopover failed:`, err);\n }\n }\n\n private _handlePopoverToggle = (e: Event): void => {\n if ((e as ToggleEvent).newState === `closed`) {\n this._isOpen = false;\n document.removeEventListener(`click`, this._clickListener);\n this.dispatchEvent(new CustomEvent(`menu-trigger-close`, { bubbles: true, composed: true }));\n }\n };\n\n private _closeMenu(): void {\n if (!this._isOpen)\n return;\n if (this._popup?.popover) {\n try {\n (this._popup as any).hidePopover();\n } catch { /* ignore */ }\n }\n this._isOpen = false;\n document.removeEventListener(`click`, this._clickListener);\n }\n\n private _handleTriggerClick(e: Event): void {\n e.stopPropagation();\n if (this._isOpen) {\n this._closeMenu();\n this._triggerBtn?.focus();\n } else {\n this._openMenu();\n }\n }\n\n private _handleClickOutside(e: Event): void {\n if (!this.contains(e.target as Node)) {\n if (this._popup?.popover && this._popup.hasAttribute(`open`)) {\n try {\n (this._popup as any).hidePopover();\n } catch {\n // ignore\n }\n }\n }\n }\n\n private _getMenuContainer(): (HTMLElement & { focusFirst: () => void }) | null {\n const slot = this.shadowRoot?.querySelector(`slot[name=\"menu\"]`) as HTMLSlotElement | null;\n const assigned = slot?.assignedElements({ flatten: true }) ?? [];\n const container = assigned.find(el => el.tagName === `IXFX-MENU-CONTAINER`);\n return (container as any) ?? null;\n }\n\n private _handleKeydown = (e: KeyboardEvent): void => {\n if (!this._isOpen)\n return;\n\n if (e.key === `Escape`) {\n e.preventDefault();\n e.stopPropagation();\n this._closeMenu();\n this._triggerBtn?.focus();\n } else if (e.key === `Tab`) {\n this._closeMenu();\n this._triggerBtn?.focus();\n }\n };\n\n private _handleCommand(e: CustomEvent): void {\n if (this._popup?.popover) {\n try {\n (this._popup as any).hidePopover();\n } catch {\n // ignore\n }\n }\n this.dispatchEvent(new CustomEvent<MenuTriggerCommandDetail>(`menu-command`, {\n detail: e.detail,\n bubbles: true,\n composed: true,\n }));\n }\n\n private _handleRadioChange(e: CustomEvent): void {\n if (this._popup?.popover) {\n try {\n (this._popup as any).hidePopover();\n } catch {\n // ignore\n }\n }\n this.dispatchEvent(new CustomEvent<MenuTriggerCommandDetail>(`menu-command`, {\n detail: {\n command: e.detail.name,\n value: e.detail.value,\n },\n bubbles: true,\n composed: true,\n }));\n }\n\n private _handleContextMenu(e: MouseEvent): void {\n if (this.mode !== `context`)\n return;\n e.preventDefault();\n this._popup.style.top = `${e.clientY}px`;\n this._popup.style.left = `${e.clientX}px`;\n this._popup.style.position = `fixed`;\n (this._popup.style as any).positionAnchor = `none`;\n if (this._popup?.popover) {\n try {\n (this._popup as any).showPopover();\n } catch {\n // ignore\n }\n }\n }\n\n static styles = [\n themeFallbacks,\n popupSurfaceStyles,\n css`\n :host {\n display: inline-block;\n position: relative;\n --ixfx-button-padding: var(--ixfx-button-padding, var(--space-s) var(--space-m));\n }\n\n .trigger-area {\n anchor-name: var(--anchor-name);\n display: inline-flex;\n align-items: stretch;\n }\n\n .trigger-btn {\n background: none;\n border: none;\n color: var(--surface-3-text);\n cursor: pointer;\n padding: var(--ixfx-button-padding);\n font-family: var(--font-family, inherit);\n font-size: var(--text-m);\n font-weight: 600;\n border-radius: var(--radius-s);\n opacity: 0.6;\n transition: opacity var(--transition), background var(--transition);\n }\n\n .trigger-btn:hover {\n background: var(--_trigger-hover-bg, var(--surface-4));\n color: var(--surface-3-text);\n opacity: var(--_trigger-hover-opacity, 1);\n }\n\n .trigger-btn:focus-visible {\n background: var(--surface-4);\n color: var(--surface-3-text);\n outline: none;\n opacity: 1;\n }\n\n .popup {\n position: fixed;\n position-anchor: var(--anchor-name);\n inset: auto;\n margin: 8px;\n padding: 0;\n border: none;\n background: transparent;\n z-index: 100;\n max-height: min(60vh, 400px);\n max-width: min(90vw, 320px);\n overflow: auto;\n overscroll-behavior: contain;\n position-try-fallbacks: flip-block, flip-inline, flip-block flip-inline;\n }\n\n .popup[popover] {\n opacity: 1;\n transform: translateY(0) scale(1);\n transition: opacity 0.12s ease-out, transform 0.12s ease-out,\n display 0.12s allow-discrete, overlay 0.12s allow-discrete;\n }\n\n @starting-style .popup {\n opacity: 0;\n transform: translateY(-4px) scale(0.97);\n }\n `,\n ];\n\n render() {\n const showButton = this.mode !== `dropdown` && this._hasMenu && !this._hasTriggerSlot;\n return html`\n <div\n class=\"trigger-area\"\n @click=${this._handleTriggerClick}\n @contextmenu=${this._handleContextMenu}\n >\n ${showButton\n ? html`<button class=\"trigger-btn\" part=\"base\" tabindex=${this.tabStop ? `0` : `-1`}>${this.label}</button>`\n : null}\n <slot name=\"trigger\" @slotchange=${this._handleTriggerSlotChange}></slot>\n </div>\n <div\n class=\"popup popup-surface\"\n popover=\"auto\"\n @click=${(e: Event) => e.stopPropagation()}\n >\n <slot name=\"menu\" @slotchange=${this._handleSlotChange}></slot>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-menu-trigger': MenuTrigger;\n }\n}\n","import type { CommandRegistry, KeyboardManager } from '@clinth/ui-commands';\nimport { css, html, LitElement } from 'lit';\nimport { property, query, state } from 'lit/decorators.js';\nimport { tickledItemStyles } from '../interaction/index.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport '../icons/icon.js';\n\nexport type MenuItemCommandDetail = {\n readonly command: string;\n readonly args: string;\n};\n\nexport type MenuItemCommandEvent = CustomEvent<MenuItemCommandDetail>;\n\n@customElement(`ixfx-menu-item`)\nexport class MenuItem extends LitElement {\n @property({ type: String }) command = ``;\n @property({ type: String, attribute: `command-args` }) commandArgs = ``;\n @property({ type: String }) label = ``;\n @property({ type: Boolean }) disabled = false;\n @property({ type: String, attribute: `icon-name` }) iconName = ``;\n @property({ attribute: false }) registry?: CommandRegistry<unknown>;\n @property({ attribute: false }) keyboardManager?: KeyboardManager;\n @property({ attribute: false }) submenuPopover?: HTMLElement;\n\n @state() private _hasChildren = false;\n @query(`slot`) private _slot!: HTMLSlotElement;\n\n private _hoverTimeout: number | null = null;\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n if (this._hoverTimeout) {\n clearTimeout(this._hoverTimeout);\n }\n }\n\n private _handleSlotChange(): void {\n const assigned = this._slot?.assignedElements() ?? [];\n this._hasChildren = assigned.length > 0;\n }\n\n private _handleMouseEnter(): void {\n if (this.disabled || !this._hasChildren || !this.submenuPopover)\n return;\n if (this._hoverTimeout) {\n clearTimeout(this._hoverTimeout);\n }\n this._hoverTimeout = window.setTimeout(() => {\n this._showSubmenu();\n }, 150);\n }\n\n private _handleMouseLeave(): void {\n if (this._hoverTimeout) {\n clearTimeout(this._hoverTimeout);\n this._hoverTimeout = null;\n }\n this._hideSubmenu();\n }\n\n private _showSubmenu(): void {\n if (!this.submenuPopover?.popover)\n return;\n try {\n this.submenuPopover.showPopover();\n } catch (err) {\n console.warn(`showPopover failed:`, err);\n }\n }\n\n private _hideSubmenu(): void {\n if (!this.submenuPopover?.popover)\n return;\n try {\n this.submenuPopover.hidePopover();\n } catch (err) {\n console.warn(`hidePopover failed:`, err);\n }\n }\n\n private handleClick(): void {\n if (this.disabled)\n return;\n\n this.dispatchEvent(new CustomEvent<MenuItemCommandDetail>(`command`, {\n detail: { command: this.command, args: this.commandArgs },\n bubbles: true,\n composed: true,\n }));\n }\n\n private _resolvedLabel(): string {\n if (this.label)\n return this.label;\n if (this.registry && this.command) {\n return this.registry.get(this.command)?.label ?? ``;\n }\n return ``;\n }\n\n private _resolvedIcon(): string | null {\n if (this.iconName)\n return this.iconName;\n if (this.registry && this.command) {\n return this.registry.get(this.command)?.icon ?? null;\n }\n return null;\n }\n\n willUpdate(changedProperties: Map<string, unknown>): void {\n super.willUpdate(changedProperties);\n const resolvedIcon = this._resolvedIcon();\n if (resolvedIcon && !this.iconName) {\n this.setAttribute(`data-icon-section`, ``);\n } else if (!resolvedIcon && !this.iconName) {\n this.removeAttribute(`data-icon-section`);\n }\n }\n\n updated(changedProperties: Map<string, unknown>): void {\n super.updated(changedProperties);\n }\n\n private _getShortcut(): string | null {\n if (!this.keyboardManager || !this.command)\n return null;\n const bindings = (this.keyboardManager as any).getBindings?.() ?? [];\n const binding = bindings.find((b: any) => b.commandId === this.command);\n if (!binding)\n return null;\n const mods = Array.from(binding.modifiers ?? [], (m: string) =>\n ({ ctrl: `⌃`, shift: `⇧`, alt: `⌥`, meta: `⌘` })[m] ?? m);\n const key = binding.key?.length === 1 ? binding.key.toUpperCase() : binding.key;\n return [...mods, key].join(``);\n }\n\n static override styles = [themeFallbacks, tickledItemStyles, css`\n :host {\n display: block;\n }\n\n .item {\n display: flex !important;\n align-items: center;\n padding: 6px var(--space-m);\n font-size: var(--text-m);\n background: var(--item-bg, transparent);\n border: var(--item-border, 1px solid transparent);\n color: var(--item-text, inherit);\n }\n\n :host(.tickled) .item {\n background: var(--item-bg-tickled);\n border: var(--item-border-tickled);\n color: var(--item-text-tickled);\n }\n\n :host(:focus) {\n outline: none;\n }\n\n .item.disabled {\n opacity: var(--disabled-opacity);\n cursor: default;\n }\n\n .item.disabled:hover {\n background: transparent;\n }\n\n .icon-slot {\n width: 0;\n overflow: hidden;\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n\n :host([icon-name]) .icon-slot,\n :host([data-icon-section]) .icon-slot {\n width: 1em;\n height: 1em;\n margin-right: var(--space-s);\n }\n\n .label {\n flex: 1;\n }\n\n .shortcut {\n margin-left: auto;\n color: var(--surface-muted-text);\n font-size: var(--text-s);\n }\n\n .arrow {\n color: var(--surface-muted-text);\n margin-left: var(--space-m);\n }\n `];\n\n render() {\n const shortcut = this._getShortcut();\n const resolvedIcon = this._resolvedIcon();\n return html`\n <div \n class=\"item ${this.disabled ? `disabled` : ``}\"\n @click=${this.handleClick}\n @mouseenter=${this._handleMouseEnter}\n @mouseleave=${this._handleMouseLeave}\n tabindex=\"${this.disabled ? -1 : 0}\"\n role=\"menuitem\"\n aria-haspopup=\"${this._hasChildren ? `true` : `false`}\"\n aria-expanded=\"${this.submenuPopover?.matches(`:popover-open`) ?? false}\"\n >\n <span class=\"icon-slot\">${resolvedIcon ? html`<ixfx-icon name=\"${resolvedIcon}\"></ixfx-icon>` : null}</span>\n <span class=\"label\"><slot></slot>${this._resolvedLabel()}</span>\n ${shortcut ? html`<span class=\"shortcut\">${shortcut}</span>` : null}\n ${this._hasChildren ? html`<span class=\"arrow\"><ixfx-icon name=\"chevron-right\"></ixfx-icon></span>` : null}\n </div>\n <slot @slotchange=${this._handleSlotChange}></slot>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-menu-item': MenuItem;\n }\n}\n","import type { MenuTrigger } from './menu-trigger.js';\nimport { css, html, LitElement } from 'lit';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport './menu-trigger.js';\n\n@customElement(`ixfx-menu-bar`)\nexport class MenuBar extends LitElement {\n private _openTrigger: MenuTrigger | null = null;\n private _inputMode: `keyboard` | `mouse` = `mouse`;\n\n connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener(`menu-trigger-open`, this._handleTriggerOpen as EventListener);\n this.addEventListener(`menu-trigger-close`, this._handleTriggerClose as EventListener);\n this.addEventListener(`focusin`, this._handleFocusIn as EventListener);\n this.addEventListener(`keydown`, this._handleKeydown);\n this.addEventListener(`pointermove`, this._handlePointerMove);\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener(`menu-trigger-open`, this._handleTriggerOpen as EventListener);\n this.removeEventListener(`menu-trigger-close`, this._handleTriggerClose as EventListener);\n this.removeEventListener(`focusin`, this._handleFocusIn as EventListener);\n this.removeEventListener(`keydown`, this._handleKeydown);\n this.removeEventListener(`pointermove`, this._handlePointerMove);\n }\n\n private _setInputMode(mode: `keyboard` | `mouse`): void {\n if (this._inputMode === mode)\n return;\n this._inputMode = mode;\n this.setAttribute(`data-input-mode`, mode);\n }\n\n private _handlePointerMove = (): void => {\n this._setInputMode(`mouse`);\n };\n\n private _getTriggers(): MenuTrigger[] {\n return [...this.children].filter(\n el => el.tagName === `IXFX-MENU-TRIGGER`,\n ) as MenuTrigger[];\n }\n\n private _handleTriggerOpen = (e: Event): void => {\n this._openTrigger = e.target as MenuTrigger;\n };\n\n private _handleTriggerClose = (e: Event): void => {\n if (e.target === this._openTrigger) {\n this._openTrigger = null;\n }\n };\n\n // When focus moves to a trigger button while another menu is open, switch menus.\n // focusin is composed, so e.target is retargeted to the ixfx-menu-trigger host.\n private _handleFocusIn = (e: FocusEvent): void => {\n const triggers = this._getTriggers();\n const trigger = triggers.find(t => t === e.target);\n if (!trigger || !this._openTrigger || trigger === this._openTrigger)\n return;\n this._openTrigger.closeMenu();\n trigger.openMenu();\n };\n\n private _handleKeydown = (e: KeyboardEvent): void => {\n if (e.key !== `ArrowLeft` && e.key !== `ArrowRight`)\n return;\n\n const triggers = this._getTriggers();\n if (triggers.length === 0)\n return;\n\n // When a menu is open, navigate from the open trigger.\n // When no menu is open, navigate from the focused trigger button\n // (e.target is retargeted to ixfx-menu-trigger when focus is on its inner button).\n const current = this._openTrigger ?? triggers.find(t => t === e.target);\n if (!current)\n return;\n\n const idx = triggers.indexOf(current);\n if (idx === -1)\n return;\n\n e.preventDefault();\n e.stopPropagation();\n this._setInputMode(`keyboard`);\n\n const dir = e.key === `ArrowRight` ? 1 : -1;\n const next = triggers[(idx + dir + triggers.length) % triggers.length];\n\n if (this._openTrigger) {\n this._openTrigger.closeMenu();\n next.openMenu();\n } else {\n next.focusTrigger();\n }\n };\n\n static styles = css`\n :host {\n display: flex;\n align-items: center;\n }\n\n /* Keyboard mode: suppress hover highlight on trigger buttons */\n :host([data-input-mode=\"keyboard\"]) {\n --_trigger-hover-bg: transparent;\n --_trigger-hover-opacity: 0.6;\n }\n `;\n\n render() {\n return html`<slot role=\"menubar\"></slot>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-menu-bar': MenuBar;\n }\n}\n","import type { CommandRegistry, KeyboardManager } from '@clinth/ui-commands';\nimport { css, html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { tickledItemStyles } from '../interaction/index.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport '../icons/icon.js';\n\nexport type MenuCheckItemCommandDetail = {\n readonly command: string;\n readonly checked: boolean;\n readonly args: string;\n};\n\nexport type MenuCheckItemCommandEvent = CustomEvent<MenuCheckItemCommandDetail>;\n\n@customElement(`ixfx-menu-check-item`)\nexport class MenuCheckItem extends LitElement {\n @property({ type: String }) command = ``;\n @property({ type: String, attribute: `command-args` }) commandArgs = ``;\n @property({ type: String }) label = ``;\n @property({ type: Boolean }) checked = false;\n @property({ type: Boolean }) disabled = false;\n @property({ type: String, attribute: `icon-name` }) iconName = ``;\n @property({ attribute: false }) registry?: CommandRegistry<unknown>;\n @property({ attribute: false }) keyboardManager?: KeyboardManager;\n\n private handleClick(): void {\n if (this.disabled)\n return;\n\n this.checked = !this.checked;\n this.dispatchEvent(new CustomEvent<MenuCheckItemCommandDetail>(`command`, {\n detail: { command: this.command, checked: this.checked, args: this.commandArgs },\n bubbles: true,\n composed: true,\n }));\n }\n\n private _resolvedLabel(): string {\n if (this.label)\n return this.label;\n if (this.registry && this.command) {\n return this.registry.get(this.command)?.label ?? ``;\n }\n return ``;\n }\n\n private _resolvedIcon(): string | null {\n if (this.iconName)\n return this.iconName;\n if (this.registry && this.command) {\n return this.registry.get(this.command)?.icon ?? null;\n }\n return null;\n }\n\n willUpdate(changedProperties: Map<string, unknown>): void {\n super.willUpdate(changedProperties);\n const resolvedIcon = this._resolvedIcon();\n if (resolvedIcon && !this.iconName) {\n this.setAttribute(`data-icon-section`, ``);\n } else if (!resolvedIcon && !this.iconName) {\n this.removeAttribute(`data-icon-section`);\n }\n }\n\n updated(changedProperties: Map<string, unknown>): void {\n super.updated(changedProperties);\n }\n\n private _getShortcut(): string | null {\n if (!this.keyboardManager || !this.command)\n return null;\n const bindings = (this.keyboardManager as any).getBindings?.() ?? [];\n const binding = bindings.find((b: any) => b.commandId === this.command);\n if (!binding)\n return null;\n const mods = Array.from(binding.modifiers ?? [], (m: string) =>\n ({ ctrl: `⌃`, shift: `⇧`, alt: `⌥`, meta: `⌘` })[m] ?? m);\n const key = binding.key?.length === 1 ? binding.key.toUpperCase() : binding.key;\n return [...mods, key].join(``);\n }\n\n static override styles = [themeFallbacks, tickledItemStyles, css`\n :host {\n display: block;\n }\n\n .item {\n display: flex;\n padding: 6px var(--space-m);\n font-size: var(--text-m);\n }\n\n :host(:focus) {\n outline: none;\n }\n\n .item.disabled {\n opacity: var(--disabled-opacity);\n cursor: default;\n }\n\n .item.disabled:hover {\n background: transparent;\n }\n\n .check {\n width: 16px;\n margin-right: var(--space-s);\n font-size: var(--text-m);\n color: var(--accent);\n }\n\n .icon-slot {\n width: 0;\n overflow: hidden;\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n\n :host([icon-name]) .icon-slot,\n :host([data-icon-section]) .icon-slot {\n width: 1em;\n height: 1em;\n margin-right: var(--space-s);\n }\n\n .label {\n flex: 1;\n }\n\n .shortcut {\n margin-left: var(--space-l);\n color: var(--surface-muted-text);\n font-size: var(--text-s);\n }\n `];\n\n render() {\n const shortcut = this._getShortcut();\n const resolvedIcon = this._resolvedIcon();\n return html`\n <div \n class=\"item ${this.disabled ? `disabled` : ``}\"\n @click=${this.handleClick}\n tabindex=\"${this.disabled ? -1 : 0}\"\n role=\"menuitemcheckbox\"\n aria-checked=\"${this.checked}\"\n >\n <span class=\"check\">${this.checked ? `✓` : ``}</span>\n <span class=\"icon-slot\">${resolvedIcon ? html`<ixfx-icon name=\"${resolvedIcon}\"></ixfx-icon>` : null}</span>\n <span class=\"label\">${this._resolvedLabel()}</span>\n ${shortcut ? html`<span class=\"shortcut\">${shortcut}</span>` : null}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-menu-check-item': MenuCheckItem;\n }\n}\n","import type { CommandRegistry } from '@clinth/ui-commands';\n\nexport class MenuCommandController {\n private registry: CommandRegistry<unknown>;\n private target: EventTarget;\n private boundHandler: (e: Event) => void;\n\n constructor(options: { registry: CommandRegistry<unknown>; target?: EventTarget }) {\n this.registry = options.registry;\n this.target = options.target ?? document;\n this.boundHandler = this.handleCommand.bind(this);\n }\n\n start(): void {\n this.target.addEventListener(`command`, this.boundHandler);\n }\n\n stop(): void {\n this.target.removeEventListener(`command`, this.boundHandler);\n }\n\n private handleCommand(e: Event): void {\n const target = e.target as any;\n const command = target?.command;\n if (!command)\n return;\n\n const args = target?.commandArgs ?? ``;\n this.registry.invoke(command, { args });\n }\n}\n","import type { CommandRegistry, KeyboardManager } from '@clinth/ui-commands';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { property, query, state } from 'lit/decorators.js';\nimport { tickledItemStyles } from '../interaction/index.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport '../icons/icon.js';\n\n@customElement(`ixfx-menu-sub-trigger`)\nexport class MenuSubTrigger extends LitElement {\n @property({ type: String }) command = ``;\n @property({ type: String, attribute: `command-args` }) commandArgs = ``;\n @property({ type: String }) label = ``;\n @property({ type: Boolean }) disabled = false;\n @property({ type: String, attribute: `icon-name` }) iconName = ``;\n @property({ attribute: false }) registry?: CommandRegistry<unknown>;\n @property({ attribute: false }) keyboardManager?: KeyboardManager;\n\n @state() private _hasSubmenu = false;\n @query(`slot[name=\"submenu\"]`) private _slot!: HTMLSlotElement;\n @query(`.submenu-popover`) private _submenuPopover!: HTMLElement;\n @query(`.item`) private _itemEl!: HTMLElement;\n\n private static _count = 0;\n private _anchorName = `--mst-${MenuSubTrigger._count++}`;\n private _hoverTimeout: number | null = null;\n private _hideTimeout: number | null = null;\n\n connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener(`keydown`, this._handleKeydown);\n }\n\n firstUpdated(): void {\n this.style.setProperty(`--anchor-name`, this._anchorName);\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener(`keydown`, this._handleKeydown);\n if (this._hoverTimeout) {\n clearTimeout(this._hoverTimeout);\n }\n if (this._hideTimeout) {\n clearTimeout(this._hideTimeout);\n }\n }\n\n private _propagateContext(): void {\n const items = this._slot?.assignedElements({ flatten: true }) ?? [];\n for (const el of items) {\n if (`registry` in el)\n (el as any).registry = this.registry;\n if (`keyboardManager` in el)\n (el as any).keyboardManager = this.keyboardManager;\n }\n }\n\n override updated(changedProperties: Map<string, unknown>): void {\n if (changedProperties.has(`registry`) || changedProperties.has(`keyboardManager`)) {\n this._propagateContext();\n }\n }\n\n willUpdate(changedProperties: Map<string, unknown>): void {\n super.willUpdate(changedProperties);\n const resolvedIcon = this._resolvedIcon();\n if (resolvedIcon && !this.iconName) {\n this.setAttribute(`data-icon-section`, ``);\n } else if (!resolvedIcon && !this.iconName) {\n this.removeAttribute(`data-icon-section`);\n }\n }\n\n private _resolvedIcon(): string | null {\n if (this.iconName)\n return this.iconName;\n if (this.registry && this.command) {\n return this.registry.get(this.command)?.icon ?? null;\n }\n return null;\n }\n\n private _handleSlotChange(): void {\n this._hasSubmenu = this._slot?.assignedElements().length > 0;\n this._propagateContext();\n }\n\n private _showSubmenu(): void {\n if (!this._submenuPopover?.popover)\n return;\n try {\n (this._submenuPopover as any).showPopover();\n } catch { /* ignore */ }\n }\n\n private _hideSubmenu(): void {\n if (!this._submenuPopover?.popover)\n return;\n try {\n (this._submenuPopover as any).hidePopover();\n } catch { /* ignore */ }\n }\n\n private _cancelHide(): void {\n if (this._hideTimeout) {\n clearTimeout(this._hideTimeout);\n this._hideTimeout = null;\n }\n }\n\n private _scheduleHide(): void {\n this._cancelHide();\n this._hideTimeout = window.setTimeout(() => {\n this._hideSubmenu();\n this._hideTimeout = null;\n }, 100);\n }\n\n private _handleMouseEnter(): void {\n if (this.disabled || !this._hasSubmenu)\n return;\n this._cancelHide();\n if (this._hoverTimeout) {\n clearTimeout(this._hoverTimeout);\n }\n this._hoverTimeout = window.setTimeout(() => {\n this._showSubmenu();\n }, 150);\n }\n\n private _handleMouseLeave(): void {\n if (this._hoverTimeout) {\n clearTimeout(this._hoverTimeout);\n this._hoverTimeout = null;\n }\n this._scheduleHide();\n }\n\n private _handleSubmenuMouseEnter(): void {\n this._cancelHide();\n }\n\n private _handleSubmenuMouseLeave(): void {\n this._scheduleHide();\n }\n\n private _handleClick(): void {\n if (this.disabled || !this.command)\n return;\n\n this.dispatchEvent(new CustomEvent(`command`, {\n detail: { command: this.command, args: this.commandArgs },\n bubbles: true,\n composed: true,\n }));\n }\n\n private _handleKeydown(e: KeyboardEvent): void {\n if (this.disabled)\n return;\n\n switch (e.key) {\n case `ArrowRight`:\n case `Enter`:\n case ` `:\n e.preventDefault();\n e.stopPropagation();\n if (this._hasSubmenu) {\n this._showSubmenu();\n requestAnimationFrame(() => {\n const container = this._slot?.assignedElements({ flatten: true })\n .find(el => el.tagName === `IXFX-MENU-CONTAINER`) as (HTMLElement & { focusFirst: () => void }) | undefined;\n container?.focusFirst();\n });\n }\n break;\n case `ArrowLeft`:\n e.preventDefault();\n e.stopPropagation();\n this._hideSubmenu();\n this._itemEl?.focus();\n break;\n case `Escape`:\n e.preventDefault();\n e.stopPropagation();\n this._hideSubmenu();\n break;\n }\n }\n\n static override styles = [themeFallbacks, tickledItemStyles, css`\n :host {\n display: block;\n }\n\n .item {\n anchor-name: var(--anchor-name);\n display: flex;\n padding: 6px var(--space-m);\n font-size: var(--text-m);\n }\n\n .submenu-popover {\n position: fixed;\n position-anchor: var(--anchor-name);\n inset: auto;\n top: anchor(top);\n left: anchor(right);\n margin: 0;\n padding: 0;\n border: none;\n background: transparent;\n /* UA stylesheet sets overflow:auto on [popover], which clips the box-shadow\n of the inner ixfx-menu-container child. Override to let the shadow render. */\n overflow: visible;\n position-try-fallbacks: flip-inline, flip-block, flip-block flip-inline;\n }\n\n :host(:focus) {\n outline: none;\n }\n\n .item.disabled {\n opacity: var(--disabled-opacity);\n cursor: default;\n }\n\n .item.disabled:hover {\n background: transparent;\n }\n\n .icon-slot {\n width: 0;\n overflow: hidden;\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n\n :host([icon-name]) .icon-slot,\n :host([data-icon-section]) .icon-slot {\n width: 1em;\n height: 1em;\n margin-right: var(--space-s);\n }\n\n .label {\n flex: 1;\n }\n\n .arrow {\n color: var(--surface-muted-text);\n margin-left: var(--space-m);\n }\n `];\n\n render() {\n const resolvedIcon = this._resolvedIcon();\n return html`\n <div\n class=\"item ${this.disabled ? `disabled` : ``}\"\n @click=${this._handleClick}\n @mouseenter=${this._handleMouseEnter}\n @mouseleave=${this._handleMouseLeave}\n tabindex=\"${this.disabled ? -1 : 0}\"\n role=\"menuitem\"\n aria-haspopup=\"true\"\n aria-expanded=\"false\"\n >\n <span class=\"icon-slot\">${resolvedIcon ? html`<ixfx-icon name=\"${resolvedIcon}\"></ixfx-icon>` : null}</span>\n <span class=\"label\"><slot></slot>${this.label}</span>\n <span class=\"arrow\">${this._hasSubmenu ? html`<ixfx-icon name=\"chevron-right\"></ixfx-icon>` : nothing}</span>\n </div>\n <div class=\"submenu-popover\" popover=\"auto\"\n @mouseenter=${this._handleSubmenuMouseEnter}\n @mouseleave=${this._handleSubmenuMouseLeave}\n >\n <slot name=\"submenu\" @slotchange=${this._handleSlotChange}></slot>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-menu-sub-trigger': MenuSubTrigger;\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-menu-separator`)\nexport class MenuSeparator extends LitElement {\n static styles = [themeFallbacks, css`\n :host {\n display: block;\n margin: var(--space-xs) 0;\n }\n\n .separator {\n height: 1px;\n background: var(--surface-4);\n }\n `];\n\n render() {\n return html`<div class=\"separator\"></div>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-menu-separator': MenuSeparator;\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-menu-header`)\nexport class MenuHeader extends LitElement {\n @property({ type: String }) label = ``;\n\n static styles = [themeFallbacks, css`\n :host {\n display: block;\n padding: 6px var(--space-m) var(--space-xs);\n font-size: var(--text-s);\n font-weight: var(--font-weight-bold);\n text-transform: uppercase;\n color: var(--surface-muted-text);\n letter-spacing: 0.5px;\n }\n `];\n\n render() {\n return html`<div>${this.label}</div>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-menu-header': MenuHeader;\n }\n}\n","import type { CommandRegistry, KeyboardManager } from '@clinth/ui-commands';\nimport type { TemplateResult } from 'lit';\nimport type { TreeNode } from '../tree/types.js';\nimport type { MenuTriggerCommandDetail } from './menu-trigger.js';\nimport { html, nothing } from 'lit';\nimport './menu-container.js';\nimport './menu-item.js';\nimport './menu-sub-trigger.js';\nimport './menu-separator.js';\nimport './menu-header.js';\n\nexport type MenuFromTreeOptions = {\n onCommand?: (detail: MenuTriggerCommandDetail) => void;\n registry?: CommandRegistry<unknown>;\n keyboardManager?: KeyboardManager;\n};\n\nfunction isLeaf(node: TreeNode): boolean {\n return node.children === undefined || node.children.length === 0;\n}\n\nexport function menuFromTree(\n nodes: TreeNode[],\n options: MenuFromTreeOptions = {},\n): TemplateResult {\n const { onCommand, registry, keyboardManager } = options;\n\n return html`${nodes.map((node) => {\n const label = node.item.label;\n\n if (label === `-`) {\n return html`<ixfx-menu-separator></ixfx-menu-separator>`;\n }\n\n if (label.startsWith(`# `)) {\n return html`<ixfx-menu-header label=\"${label.slice(2)}\"></ixfx-menu-header>`;\n }\n\n if (!isLeaf(node)) {\n const submenu = menuFromTree(node.children!, options);\n return html`\n <ixfx-menu-sub-trigger label=\"${label}\">\n <ixfx-menu-container\n slot=\"submenu\"\n .registry=${registry ?? nothing}\n .keyboardManager=${keyboardManager ?? nothing}\n >${submenu}</ixfx-menu-container>\n </ixfx-menu-sub-trigger>\n `;\n }\n\n return html`\n <ixfx-menu-item\n command=\"${node.item.key}\"\n label=\"${label}\"\n icon-name=\"${node.item.icon ?? nothing}\"\n @command=${onCommand ? (e: CustomEvent) => onCommand(e.detail) : nothing}\n ></ixfx-menu-item>\n `;\n })}`;\n}\n\nfunction buildMenuItemEl(\n node: TreeNode,\n options: MenuFromTreeOptions,\n): HTMLElement {\n const { onCommand, registry } = options;\n const label = node.item.label;\n\n const el = document.createElement(`ixfx-menu-item`);\n el.setAttribute(`command`, node.item.key);\n el.setAttribute(`label`, label);\n if (node.item.icon) {\n el.setAttribute(`icon-name`, node.item.icon);\n }\n if (onCommand) {\n el.addEventListener(`command`, e => onCommand((e as CustomEvent).detail));\n }\n if (registry) {\n (el as any).registry = registry;\n }\n return el;\n}\n\nfunction buildMenuSeparatorEl(): HTMLElement {\n return document.createElement(`ixfx-menu-separator`);\n}\n\nfunction buildMenuHeaderEl(label: string): HTMLElement {\n const el = document.createElement(`ixfx-menu-header`);\n el.setAttribute(`label`, label);\n return el;\n}\n\nfunction buildMenuSubTriggerEl(\n node: TreeNode,\n options: MenuFromTreeOptions,\n): HTMLElement {\n const { registry, keyboardManager } = options;\n\n const el = document.createElement(`ixfx-menu-sub-trigger`);\n el.setAttribute(`label`, node.item.label);\n if (registry)\n (el as any).registry = registry;\n if (keyboardManager)\n (el as any).keyboardManager = keyboardManager;\n\n const container = document.createElement(`ixfx-menu-container`);\n container.setAttribute(`slot`, `submenu`);\n if (registry)\n (container as any).registry = registry;\n if (keyboardManager)\n (container as any).keyboardManager = keyboardManager;\n\n const childEls = menuFromTreeToElements(node.children!, options);\n for (const child of childEls) {\n container.appendChild(child);\n }\n\n el.appendChild(container);\n return el;\n}\n\nexport function menuFromTreeToElements(\n nodes: TreeNode[],\n options: MenuFromTreeOptions = {},\n): HTMLElement[] {\n return nodes.map((node) => {\n const label = node.item.label;\n\n if (label === `-`) {\n return buildMenuSeparatorEl();\n }\n\n if (label.startsWith(`# `)) {\n return buildMenuHeaderEl(label.slice(2));\n }\n\n if (!isLeaf(node)) {\n return buildMenuSubTriggerEl(node, options);\n }\n\n return buildMenuItemEl(node, options);\n });\n}\n","import { css, html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { tickledItemStyles } from '../interaction/index.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport '../icons/icon.js';\n\nexport type MenuRadioItemSelectDetail = {\n readonly value: string;\n};\n\nexport type MenuRadioItemSelectEvent = CustomEvent<MenuRadioItemSelectDetail>;\n\n@customElement(`ixfx-menu-radio-item`)\nexport class MenuRadioItem extends LitElement {\n @property({ type: String }) value = ``;\n @property({ type: String }) label = ``;\n @property({ type: Boolean }) disabled = false;\n @property({ type: String }) groupValue = ``;\n @property({ type: String, attribute: `icon-name` }) iconName = ``;\n\n private handleClick(): void {\n if (this.disabled)\n return;\n\n this.dispatchEvent(new CustomEvent<MenuRadioItemSelectDetail>(`radio-select`, {\n detail: { value: this.value },\n bubbles: true,\n composed: true,\n }));\n }\n\n static override styles = [themeFallbacks, tickledItemStyles, css`\n :host {\n display: block;\n }\n\n .item {\n display: flex;\n padding: 6px var(--space-m);\n font-size: var(--text-m);\n }\n\n :host(:focus) {\n outline: none;\n }\n\n .item.disabled {\n opacity: var(--disabled-opacity);\n cursor: default;\n }\n\n .item.disabled:hover {\n background: transparent;\n }\n\n .radio {\n width: 16px;\n margin-right: var(--space-s);\n font-size: var(--text-m);\n color: var(--accent);\n }\n\n .icon-slot {\n width: 0;\n overflow: hidden;\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n\n :host([icon-name]) .icon-slot,\n :host([data-icon-section]) .icon-slot {\n width: 1em;\n height: 1em;\n margin-right: var(--space-s);\n }\n\n .label {\n flex: 1;\n }\n `];\n\n render() {\n const isSelected = this.groupValue === this.value;\n\n return html`\n <div \n class=\"item ${this.disabled ? `disabled` : ``}\"\n @click=${this.handleClick}\n tabindex=\"${this.disabled ? -1 : 0}\"\n role=\"menuitemradio\"\n aria-checked=\"${isSelected}\"\n >\n <span class=\"radio\">${isSelected ? `●` : ``}</span>\n <span class=\"icon-slot\">${this.iconName ? html`<ixfx-icon name=\"${this.iconName}\"></ixfx-icon>` : null}</span>\n <span class=\"label\">${this.label}</span>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-menu-radio-item': MenuRadioItem;\n }\n}\n","import { css, html, LitElement } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport './menu-radio-item.js';\n\nexport type MenuRadioGroupChangeDetail = {\n readonly name: string;\n readonly value: string;\n};\n\nexport type MenuRadioGroupChangeEvent = CustomEvent<MenuRadioGroupChangeDetail>;\n\n@customElement(`ixfx-menu-radio-group`)\nexport class MenuRadioGroup extends LitElement {\n @property({ type: String }) name = ``;\n @property({ type: String }) value = ``;\n\n @state() private slottedElements: Element[] = [];\n\n private handleSlotChange(e: Event): void {\n const slot = e.target as HTMLSlotElement;\n this.slottedElements = slot.assignedElements();\n this.updateSlottedValues();\n }\n\n private updateSlottedValues(): void {\n for (const el of this.slottedElements) {\n (el as any).groupValue = this.value;\n }\n }\n\n private handleRadioSelect(e: CustomEvent): void {\n this.value = e.detail.value;\n this.dispatchEvent(new CustomEvent<MenuRadioGroupChangeDetail>(`radio-change`, {\n detail: {\n name: this.name,\n value: this.value,\n },\n bubbles: true,\n composed: true,\n }));\n }\n\n updated(changedProperties: Map<string, unknown>): void {\n if (changedProperties.has(`value`)) {\n this.updateSlottedValues();\n }\n }\n\n static styles = css`\n :host {\n display: block;\n }\n\n ::slotted(menu-radio-item) {\n display: block;\n }\n `;\n\n render() {\n return html`\n <slot @slotchange=${this.handleSlotChange} @radio-select=${this.handleRadioSelect}></slot>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-menu-radio-group': MenuRadioGroup;\n }\n}\n","export { MenuBar } from './menu-bar.js';\nexport { MenuCheckItem } from './menu-check-item.js';\nexport { MenuCommandController } from './menu-command-controller.js';\nexport { MenuContainer } from './menu-container.js';\nexport { menuFromTree, menuFromTreeToElements } from './menu-from-tree.js';\nexport type { MenuFromTreeOptions } from './menu-from-tree.js';\nexport { MenuHeader } from './menu-header.js';\nexport { MenuItem } from './menu-item.js';\nexport { MenuRadioGroup } from './menu-radio-group.js';\nexport { MenuRadioItem } from './menu-radio-item.js';\nexport { MenuSeparator } from './menu-separator.js';\nexport { MenuSubTrigger } from './menu-sub-trigger.js';\nexport { MenuTrigger } from './menu-trigger.js';\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"menu-item-Bs2MYyHq.d.ts","names":[],"sources":["../src/menu/menu-container.ts","../src/menu/menu-trigger.ts","../src/menu/menu-item.ts"],"mappings":";;;;cASa,sBAAsB;EACgB;EACjB,WAAW;EACX,kBAAkB;UACvB;UAGnB;SAwBD,sBAAM;UA4BL;UAkDA;EAYC,QAAQ,mBAAmB;;;;EASpC,WAAW,SAAS,IAAI;EAOxB,wBAAM;UAaE;;;;;UAoCA;UAiCA;EA0BR;UAIQ;UAQA;UAUA;UAqDA;;QAqCF;YACI;IACR,uBAAuB;;;;;KCxWtB;KACA;KAEO;WACD;WACA;WACA;;cAME,oBAAoB;EACH,MAAM;EACN;EACI,WAAW;EACX,kBAAkB;EACtB,WAAW;;EAEa;UAEnC;UACA;UACA;UAEc;UACN;iBAEV;UAEP;UACA;EAER;EAOA;EAQA;EAkBA,QAAQ,mBAAmB;UAMnB;UAqBA;UAWA;UAOA;MAKJ;EAIJ;EAIA;EAIA;UAIQ;UAgBA;UAQA;UAYA;UAUA;UAYA;UAOA;UAeA;UAeA;UAkBA;SAiBD,sBAAM;EAyEb,wBAAM;;QAwBA;YACI;IACR,qBAAqB;;;;;cCjWZ,iBAAiB;EACA;EAC2B;EAC3B;EACC;EACuB;EACpB,WAAW;EACX,kBAAkB;EAClB,iBAAiB;UAEhC;UACM;UAEf;EAER;UAOQ;UAKA;UAWA;UAQA;UAUA;UAUA;UAWA;UASA;EASR,WAAW,mBAAmB;EAU9B,QAAQ,mBAAmB;UAInB;SAaQ,sBAAM;EAkEtB,wBAAM;;QAwBA;YACI;IACR,kBAAkB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"slider-input-CT4gcF-o.js","names":["#onKeyDown","#ensureUserGradientDefs","#lastInteractedHandle","#dragHandle","#setSingleValueFromRelative","#dragging","#activePointerId","#dragStartClientPos","#poleValueAtDragStart","#onPointerMove","#onPointerUp","#getRelativeValueA","#getRelativeValueB","#poleA","#poleB","#getRelativeValueC","#lowKey","#highKey","#lengthDragStart","#lengthDragLowKey","#lengthDragHighKey","#lengthDragLength","#lengthDragStartLow","#lengthDragStartRelative","#setDualOrTripleValueFromRelative","#applyLengthDragFromRelative","#onPointerMoveCursor","#lastPointerClient","#poleC","#low","#stepHandleByRelativeDelta","#cursorAtRelative","#lanes","#onHostKeyDown","#syncGradientDefs","#gradientObserver","#userGradientDefs","#quantise","#isUserInteraction","#applySingleStyleValueLane","#emitInputAndChange","#resolvePoleChange","#poles","#syncPoleProperties","#detectChanged","#high","#hasInitialisedValueC","#getEffectiveValueMin","#buildInputDetail","#buildChangeDetail","#scheduleChangeEvent","#fireChangeEvent","#changeDebounceTimer","#getCssVar","#getCssVarColor","#isMultiHandle","#renderHandleGroup","#renderValueMarker","#viewBox","#onPointerDown","#onPointerLeaveCursor","#onFocusIn","#renderTrack","#renderLane","#renderMidpointMarker","customElement"],"sources":["../src/slider-input/svg-utils.ts","../src/slider-input/slider-input.ts"],"sourcesContent":["/**\n * SVG utilities for the slider-input component.\n * Linear track geometry helpers (mirrors radial-input's svg-utils for arc maths).\n */\n\nimport type { SliderOrientation, SliderSingleStyle } from './types.js';\n\nexport interface Point {\n x: number;\n y: number;\n}\n\n/**\n * Track geometry in viewBox units.\n * Horizontal: trackStart = track-INSET, trackEnd = 100 - INSET (along x).\n * Vertical: trackStart = INSET, trackEnd = 100 - INSET (along y, top = high).\n */\nexport interface TrackBounds {\n trackStart: number;\n trackEnd: number;\n /** Centre along the long axis. */\n centre: number;\n /** Centre along the cross axis (always 100/2 = 50 here, but kept for symmetry). */\n crossCentre: number;\n}\n\nexport const INSET = 5;\nexport const LONG = 100;\nexport const CROSS = 24;\n\n/**\n * Get the track bounds in viewBox units for a given orientation.\n */\nexport function getTrackBounds(orientation: SliderOrientation): TrackBounds {\n if (orientation === `horizontal`) {\n return {\n trackStart: INSET,\n trackEnd: LONG - INSET,\n centre: (LONG - INSET + INSET) / 2,\n crossCentre: CROSS / 2,\n };\n }\n // Vertical: viewBox is 0 0 CROSS LONG; the track runs along the y axis from\n // INSET to LONG-INSET. `centre` is the middle of the long (y) axis; the\n // `crossCentre` is the middle of the cross (x) axis.\n return {\n trackStart: INSET,\n trackEnd: LONG - INSET,\n centre: (LONG - INSET + INSET) / 2,\n crossCentre: CROSS / 2,\n };\n}\n\n/**\n * Map a relative value (0..1) to a leader point on the track for the given\n * orientation and single-style.\n *\n * Range: grows from trackStart to trackEnd.\n * Bipolar: track centre is 0.5; values spread from centre outward.\n * Unipolar: spread symmetrically around centre.\n *\n * For vertical orientation, higher values are toward the top of the track,\n * matching the spec (\"higher values → top of track\").\n */\nexport function valueToPosition(\n relativeValue: number,\n singleStyle: SliderSingleStyle,\n trackBounds: TrackBounds,\n orientation: SliderOrientation,\n): Point {\n const span = trackBounds.trackEnd - trackBounds.trackStart;\n const centre = trackBounds.centre;\n const crossCentre = trackBounds.crossCentre;\n\n let pos: number;\n if (singleStyle === `range`) {\n pos = trackBounds.trackStart + relativeValue * span;\n } else if (singleStyle === `bipolar`) {\n // Mid (0.5) -> centre; <0.5 below centre, >0.5 above.\n if (relativeValue <= 0.5) {\n const t = relativeValue / 0.5;\n pos = trackBounds.trackStart + t * (centre - trackBounds.trackStart);\n } else {\n const t = (relativeValue - 0.5) / 0.5;\n pos = centre + t * (trackBounds.trackEnd - centre);\n }\n } else {\n // unipolar: spread symmetrically around centre\n const halfLen = (relativeValue * span) / 2;\n pos = centre + halfLen;\n }\n\n if (orientation === `horizontal`) {\n return { x: pos, y: crossCentre };\n }\n // Vertical: higher values toward top (smaller y). `pos` is a value along the\n // long axis (0..LONG), so the SVG y coordinate (0 at top) is LONG - pos.\n return { x: crossCentre, y: LONG - pos };\n}\n\n/**\n * Get the segment endpoints for a 'value' lane. The lane is drawn from\n * the lane's lower relative value to its upper relative value.\n *\n * For 'range' and 'bipolar' styles, the endpoints are obtained by mapping\n * each value through `valueToPosition`. For 'unipolar', the bar is centred\n * on the track centre with length proportional to valueMax (valueMin is\n * ignored), matching the spec: \"spreads symmetrically around centre\".\n */\nexport function getValueSegment(\n valueMin: number,\n valueMax: number,\n singleStyle: SliderSingleStyle,\n trackBounds: TrackBounds,\n orientation: SliderOrientation,\n): { start: Point; end: Point } {\n if (singleStyle === `unipolar`) {\n const span = trackBounds.trackEnd - trackBounds.trackStart;\n const centre = trackBounds.centre;\n const crossCentre = trackBounds.crossCentre;\n const halfLen = (valueMax * span) / 2;\n if (orientation === `horizontal`) {\n return {\n start: { x: centre - halfLen, y: crossCentre },\n end: { x: centre + halfLen, y: crossCentre },\n };\n }\n // Vertical: spread the bar symmetrically around the track centre along y.\n return {\n start: { x: crossCentre, y: centre - halfLen },\n end: { x: crossCentre, y: centre + halfLen },\n };\n }\n\n return {\n start: valueToPosition(valueMin, singleStyle, trackBounds, orientation),\n end: valueToPosition(valueMax, singleStyle, trackBounds, orientation),\n };\n}\n\n/**\n * Get the segment endpoints for an 'anchored' lane. The lane is centered\n * on the current value, with length controlled by laneValue (0..1).\n */\nexport function getAnchoredSegment(\n relativeValue: number,\n laneValue: number,\n singleStyle: SliderSingleStyle,\n trackBounds: TrackBounds,\n orientation: SliderOrientation,\n): { start: Point; end: Point } {\n const span = trackBounds.trackEnd - trackBounds.trackStart;\n const halfLen = (laneValue * span) / 2;\n\n // For unipolar, the value represents the size of a bar centred on the track\n // centre, not a spatial position. Anchor the lane to the track centre so it\n // follows the value's \"magnitude\" rather than the bar's right-end.\n // Mirrors radial-input's getAnchoredArcAngles for unipolar.\n // `centre.x` is along the track axis; `centre.y` is perpendicular. For\n // horizontal that's (LONG/2, CROSS/2); for vertical that's (CROSS/2, LONG/2).\n const centre = singleStyle === `unipolar`\n ? (orientation === `horizontal`\n ? { x: trackBounds.centre, y: trackBounds.crossCentre }\n : { x: trackBounds.crossCentre, y: trackBounds.centre })\n : valueToPosition(relativeValue, singleStyle, trackBounds, orientation);\n\n // Compute along-axis offsets\n let startPos: number;\n let endPos: number;\n if (orientation === `horizontal`) {\n startPos = centre.x - halfLen;\n endPos = centre.x + halfLen;\n } else {\n startPos = centre.y - halfLen;\n endPos = centre.y + halfLen;\n }\n\n const start = orientation === `horizontal`\n ? { x: startPos, y: centre.y }\n : { x: centre.x, y: startPos };\n const end = orientation === `horizontal`\n ? { x: endPos, y: centre.y }\n : { x: centre.x, y: endPos };\n return { start, end };\n}\n\n/**\n * Generate an SVG path string for a straight line. Returns '' for a\n * zero-length segment (start ≈ end), mirroring the radial-input arc\n * helper's edge case.\n */\nexport function generateLinePath(start: Point, end: Point): string {\n if (Math.abs(start.x - end.x) < 0.001 && Math.abs(start.y - end.y) < 0.001) {\n return ``;\n }\n return `M ${start.x} ${start.y} L ${end.x} ${end.y}`;\n}\n\n/**\n * Generate a closed SVG `<path>` for a filled rectangle (used for filled\n * lane segments). `halfWidth` is the perpendicular half-thickness; `perpOffset`\n * shifts the rect perpendicularly from the track centreline.\n */\nexport function generateRectPath(\n start: Point,\n end: Point,\n halfWidth: number,\n perpOffset: number,\n orientation: SliderOrientation,\n): string {\n // Direction vector along the track\n const dx = end.x - start.x;\n const dy = end.y - start.y;\n const len = Math.sqrt(dx * dx + dy * dy);\n if (len < 0.001)\n return ``;\n\n // Unit perpendicular\n const perpX = -dy / len;\n const perpY = dx / len;\n\n // Inset corners slightly so the rect's ends don't extend past the start/end\n const insetX = (dx / len) * halfWidth;\n const insetY = (dy / len) * halfWidth;\n\n const sIn = { x: start.x + insetX, y: start.y + insetY };\n const eIn = { x: end.x - insetX, y: end.y - insetY };\n\n const c1 = { x: sIn.x + perpX * (halfWidth + perpOffset), y: sIn.y + perpY * (halfWidth + perpOffset) };\n const c2 = { x: eIn.x + perpX * (halfWidth + perpOffset), y: eIn.y + perpY * (halfWidth + perpOffset) };\n const c3 = { x: eIn.x + perpX * (-halfWidth + perpOffset), y: eIn.y + perpY * (-halfWidth + perpOffset) };\n const c4 = { x: sIn.x + perpX * (-halfWidth + perpOffset), y: sIn.y + perpY * (-halfWidth + perpOffset) };\n\n // Silence unused-orientation warning — kept for API parity\n void orientation;\n\n return `M ${c1.x} ${c1.y} L ${c2.x} ${c2.y} L ${c3.x} ${c3.y} L ${c4.x} ${c4.y} Z`;\n}\n\n/**\n * Clamp `value` to the [min, max] range.\n */\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\n/**\n * Linear-reinterpolate `value` from [fromMin, fromMax] to [toMin, toMax].\n */\nexport function scale(\n value: number,\n fromMin: number,\n fromMax: number,\n toMin: number,\n toMax: number,\n): number {\n if (fromMax === fromMin)\n return toMin;\n const normalized = (value - fromMin) / (fromMax - fromMin);\n return toMin + normalized * (toMax - toMin);\n}\n\n/**\n * Convert a relative value (0..1) to an absolute value in the min..max range.\n */\nexport function relativeToValue(\n relativeValue: number,\n min: number,\n max: number,\n): number {\n return scale(relativeValue, 0, 1, min, max);\n}\n\n/**\n * Convert an absolute value to a relative (0..1) position.\n */\nexport function valueToRelative(\n value: number,\n min: number,\n max: number,\n): number {\n return scale(value, min, max, 0, 1);\n}\n\n/**\n * Convert a pointer client position (clientX or clientY depending on\n * orientation) to a relative value (0..1) given the host element's\n * bounding rect on the long axis.\n */\nexport function clientPosToRelative(\n clientPos: number,\n hostStart: number,\n hostSize: number,\n): number {\n if (hostSize <= 0)\n return 0;\n return clamp((clientPos - hostStart) / hostSize, 0, 1);\n}\n\n/**\n * Inverse: relative value (0..1) → client position offset from host start.\n */\nexport function relativeToClientPos(\n relativeValue: number,\n hostStart: number,\n hostSize: number,\n): number {\n return hostStart + relativeValue * hostSize;\n}\n","/* eslint-disable ts/no-unsafe-declaration-merging */\n/**\n * <ixfx-slider-input> — linear SVG-based slider.\n *\n * Mirrors `ixfx-radial-input` as closely as possible, swapping arc geometry\n * for a linear track. Supports horizontal and vertical orientations, three\n * value modes (single/dual/triple), triple-segment \"value\" lanes, and\n * `value-drag` length-drag gestures for dual/triple modes.\n *\n * Attributes / properties\n * value-a, value-b, value-c — primary/secondary/tertiary handle values\n * min, max — value range\n * step, stops — keyboard/wheel/pointer step resolution\n * value-mode — 'single' | 'dual' | 'triple'\n * single-style — 'range' | 'bipolar' | 'unipolar' (single mode only)\n * orientation — 'horizontal' | 'vertical'\n * marker-style — 'needle' | 'dot' | 'none'\n * crossover — 'none' | 'allow' (dual/triple modes)\n * value-drag — 'none' | 'stop' | 'flex' (dual/triple modes)\n * value-min — minimum gap between A and B (dual/triple modes)\n * disabled — boolean\n * lighttouch — boolean — wheel adjusts value on hover instead of requiring focus\n *\n * Events\n * input — fires continuously during user interaction\n * change — debounced 150ms after interaction; immediate for programmatic\n *\n * Mouse wheel (via WheelNudgeMixin): up = increase, down = decrease. In multi-handle\n * modes wheel targets the last-interacted-with handle (focus or pointerdown).\n * Shift+wheel halves the step. See docs/infra-mousewheel.md.\n */\nimport type { PropertyValues } from 'lit';\nimport type { WheelDirection } from '../mixins/wheel-nudge.js';\nimport type { Point } from './svg-utils.js';\nimport type {\n SliderChangedField,\n SliderCrossover,\n SliderHandleKey,\n SliderInputChangeDetail,\n SliderInputElementEventMap,\n SliderInputInputDetail,\n SliderLaneData,\n SliderLaneType,\n SliderMarkerStyle,\n SliderOrientation,\n SliderSingleStyle,\n SliderValueCFollow,\n SliderValueDrag,\n SliderValueMode,\n} from './types.js';\nimport { css, html, LitElement, svg } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { resolveAxisStep } from '../keyboard.js';\nimport { WheelNudgeMixin } from '../mixins/wheel-nudge.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { prominenceStyles } from '../styles/prominence.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport {\n clamp,\n clientPosToRelative,\n CROSS,\n generateLinePath,\n getAnchoredSegment,\n getTrackBounds,\n getValueSegment,\n INSET,\n LONG,\n scale,\n valueToPosition,\n valueToRelative,\n} from './svg-utils.js';\n\nconst HANDLE_HIT_RADIUS = 0.06;\nconst DEFAULT_VALUE_MIN_FRACTION = 0.01;\nconst CHANGE_DEBOUNCE_MS = 150;\n\n@customElement(`ixfx-slider-input`)\nexport class SliderInputElement extends WheelNudgeMixin(LitElement) {\n // ─── Public properties ───────────────────────────────────────────────\n @property({ type: Number, attribute: `value-a` })\n valueA = 50;\n\n @property({ type: Number, attribute: `value-b` })\n valueB = 0;\n\n /**\n * Triple-mode middle handle. `undefined` until first willUpdate, then\n * defaulted to the midpoint of valueA/valueB (matching radial-input's\n * deferred lane-correction pattern).\n */\n @property({ type: Number, attribute: `value-c` })\n valueC: number | undefined = undefined;\n\n @property({ type: Number })\n min = 0;\n\n @property({ type: Number })\n max = 100;\n\n @property({ type: Number })\n step: number | undefined = undefined;\n\n @property({ type: Number })\n stops: number | undefined = undefined;\n\n @property({ type: String, attribute: `value-mode` })\n valueMode: SliderValueMode = `single`;\n\n @property({ type: String, attribute: `single-style` })\n singleStyle: SliderSingleStyle = `range`;\n\n @property({ type: String })\n orientation: SliderOrientation = `horizontal`;\n\n @property({ type: String, attribute: `marker-style` })\n markerStyle: SliderMarkerStyle = `needle`;\n\n /**\n * Optional marker-style override for the C handle in triple mode. Lets\n * consumers give C a different shape (e.g. dot) from the global\n * `markerStyle` applied to A/B.\n */\n @property({ type: String, attribute: `marker-style-c` })\n markerStyleC: SliderMarkerStyle | undefined = undefined;\n\n @property({ type: String })\n crossover: SliderCrossover = `allow`;\n\n @property({ type: String, attribute: `value-drag` })\n valueDrag: SliderValueDrag = `none`;\n\n /**\n * In triple mode, how the C handle reacts when A or B moves the [A, B]\n * band. `none` (default): C keeps its value unless pushed outside the\n * new band. `proportional`: C is re-anchored at the same fractional\n * position it had within the *old* band, so it moves with A/B.\n */\n @property({ type: String, attribute: `value-c-follow` })\n valueCFollow: SliderValueCFollow = `none`;\n\n @property({ type: Number, attribute: `value-min` })\n valueMin = 1;\n\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n // ─── Internal state ──────────────────────────────────────────────────\n #lanes: Map<string, SliderLaneData> = new Map();\n\n /** Raw pole values: independent of which is \"low\" or \"high\". */\n #poleA = 50;\n #poleB = 0;\n #poleC: number | undefined = undefined;\n\n #dragging = false;\n /** Pointer ID being tracked (fixes radial-input's hardcoded pointerId). */\n #activePointerId: number | undefined = undefined;\n #dragStartClientPos = 0;\n #poleValueAtDragStart = 0;\n /** Which handle is currently being dragged, or 'length' for segment drag. */\n #dragHandle: SliderHandleKey | `length` | undefined = undefined;\n /** Snapshotted poles at length-drag start. */\n #lengthDragStart: { poleA: number; poleB: number } | undefined = undefined;\n /** Track the low/high identity at length-drag start (so we know which raw pole gets which end). */\n #lengthDragLowKey: SliderHandleKey | undefined = undefined;\n #lengthDragHighKey: SliderHandleKey | undefined = undefined;\n #lengthDragLength = 0;\n #lengthDragStartLow = 0;\n /**\n * Where the pointer was when the length drag began (in host-relative\n * 0..1 terms). Preserves the grab offset so dragging the bar doesn't snap\n * its low edge under the cursor.\n */\n #lengthDragStartRelative = 0;\n\n /** The handle that last received direct interaction (pointerdown/keydown/wheel/focus). */\n #lastInteractedHandle: SliderHandleKey = `a`;\n\n /**\n * Last pointer client position seen by #onPointerMoveCursor, used to\n * recompute the cursor after a drag ends (without waiting for a fresh\n * pointermove).\n */\n #lastPointerClient = { x: 0, y: 0 };\n\n #changeDebounceTimer: number | undefined = undefined;\n #isUserInteraction = false;\n #hasInitialisedValueC = false;\n\n /**\n * Holds `<linearGradient>`/`<radialGradient>` elements authored as light-DOM\n * children of this element, once relocated into the shadow root (see\n * `#syncGradientDefs`). Lets consumers reference `url(#id)` paint servers\n * from `--lane-*-color` / `--track-color` etc. — CSS custom properties\n * pierce the shadow boundary, but `url(#id)` paint-server *resolution* does\n * not, so the gradient definitions themselves must physically live inside\n * this element's shadow root to be resolvable by lanes/track painted there.\n */\n #userGradientDefs: SVGDefsElement | undefined;\n #gradientObserver: MutationObserver | undefined;\n\n // ─── Construction ───────────────────────────────────────────────────\n constructor() {\n super();\n // Make the host focusable so users can Tab to the slider. The actual\n // focus indicator + keyboard listener are on the inner <svg> (which\n // sits inside the shadow DOM), but the host needs an HTML tabindex\n // attribute to be reachable from the document's tab order.\n if (!this.disabled) {\n this.setAttribute(`tabindex`, `0`);\n }\n this.#lanes.set(`track`, {\n key: `track`,\n value: 1,\n type: `fixed`,\n offset: 0,\n width: 0.16,\n });\n this.#lanes.set(`value`, {\n key: `value`,\n valueMin: 0,\n valueMax: 0,\n type: `value`,\n offset: 0,\n width: 0.24,\n });\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.setAttribute(`tabindex`, this.disabled ? `-1` : `0`);\n // Listen for keydown on the host itself (in addition to the SVG in\n // shadow DOM) so the keyboard handler fires when the host has focus\n // from Tab navigation. The host is the focusable element (via its\n // tabindex attribute set in the constructor); events fired while the\n // host is focused don't reach the inner <svg>'s lit listener.\n this.addEventListener(`keydown`, this.#onHostKeyDown as EventListener);\n this.#syncGradientDefs();\n this.#gradientObserver = new MutationObserver(this.#syncGradientDefs);\n this.#gradientObserver.observe(this, { childList: true, subtree: true });\n }\n\n #onHostKeyDown = (event: KeyboardEvent): void => {\n this.#onKeyDown(event);\n };\n\n // ─── Gradient defs relocation ───────────────────────────────────────\n /**\n * Lazily creates the inert `<svg><defs>` carrier that user-authored\n * gradients get moved into. Kept entirely outside Lit's managed template —\n * it's a plain sibling of the interactive `<svg class=\"slider-svg\">` inside\n * the shadow root, so `url(#id)` references from lane/track paint\n * properties resolve against it regardless of render() re-runs.\n */\n #ensureUserGradientDefs(): SVGDefsElement {\n if (this.#userGradientDefs)\n return this.#userGradientDefs;\n const svgNs = `http://www.w3.org/2000/svg`;\n const carrier = document.createElementNS(svgNs, `svg`);\n carrier.setAttribute(`width`, `0`);\n carrier.setAttribute(`height`, `0`);\n carrier.setAttribute(`aria-hidden`, `true`);\n // Inline (not classed) so no shadow stylesheet rule — including a broad\n // `svg { width: 100%; ... }` selector — can ever stretch this carrier\n // into a click-blocking overlay; `:host` has no explicit `position`, so\n // an accidentally-enlarged `position: absolute` box here would escape to\n // whatever ancestor up the *light* DOM happens to be positioned.\n carrier.style.cssText = `position: absolute; width: 0; height: 0; overflow: hidden; pointer-events: none;`;\n const defs = document.createElementNS(svgNs, `defs`) as SVGDefsElement;\n carrier.append(defs);\n this.renderRoot.append(carrier);\n this.#userGradientDefs = defs;\n return defs;\n }\n\n /**\n * Moves any `<linearGradient>`/`<radialGradient>` authored as light-DOM\n * descendants of this element into the shadow root (see\n * `#ensureUserGradientDefs`). This *reparents* rather than clones the\n * nodes, so consumers get normal, live SVG paint-server semantics — e.g.\n * animating a `<stop>`'s `stop-color` \"just works\" — with no gradient\n * management on the component's part. Idempotent: once moved, a node is no\n * longer a light-DOM descendant of `this`, so it won't be found again.\n */\n #syncGradientDefs = (): void => {\n const found = this.querySelectorAll(`linearGradient, radialGradient`);\n if (found.length === 0)\n return;\n const defs = this.#ensureUserGradientDefs();\n for (const node of found) {\n defs.append(node);\n }\n };\n\n // ─── Lane management API ────────────────────────────────────────────\n addLane(\n key: string,\n options?: {\n value?: number;\n valueMin?: number;\n valueMax?: number;\n type?: SliderLaneType;\n offset?: number;\n width?: number;\n },\n ): void {\n const rel = this.#getRelativeValueA();\n this.#lanes.set(key, {\n key,\n value: options?.value ?? rel,\n valueMin: options?.valueMin ?? 0,\n valueMax: options?.valueMax ?? rel,\n type: options?.type ?? `value`,\n offset: options?.offset ?? 0,\n width: options?.width ?? 0.1,\n });\n this.requestUpdate();\n }\n\n setLaneValue(key: string, value: number): void {\n const lane = this.#lanes.get(key);\n if (lane) {\n lane.value = clamp(value, 0, 1);\n this.requestUpdate();\n }\n }\n\n setLaneRange(key: string, valueMin: number, valueMax: number): void {\n const lane = this.#lanes.get(key);\n if (!lane)\n return;\n const lo = clamp(Math.min(valueMin, valueMax), 0, 1);\n const hi = clamp(Math.max(valueMin, valueMax), 0, 1);\n lane.valueMin = lo;\n lane.valueMax = hi;\n this.requestUpdate();\n }\n\n removeLane(key: string): void {\n this.#lanes.delete(key);\n this.requestUpdate();\n }\n\n getLanes(): ReadonlyMap<string, SliderLaneData> {\n return new Map(this.#lanes);\n }\n\n getLane(key: string): SliderLaneData | undefined {\n return this.#lanes.get(key);\n }\n\n // ─── Derived getters ────────────────────────────────────────────────\n #getRelativeValueA(): number {\n return valueToRelative(this.valueA, this.min, this.max);\n }\n\n #getRelativeValueB(): number {\n return valueToRelative(this.valueB, this.min, this.max);\n }\n\n #getRelativeValueC(): number {\n const c = this.valueC ?? (this.#poleA + this.#poleB) / 2;\n return valueToRelative(c, this.min, this.max);\n }\n\n #low(): number {\n return Math.min(this.#poleA, this.#poleB);\n }\n\n #high(): number {\n return Math.max(this.#poleA, this.#poleB);\n }\n\n #lowKey(): SliderHandleKey {\n return this.#poleA <= this.#poleB ? `a` : `b`;\n }\n\n #highKey(): SliderHandleKey {\n return this.#poleA > this.#poleB ? `a` : `b`;\n }\n\n /**\n * Effective `valueMin` in value units between A and B. Mirrors radial-input's\n * default of 1% of max-min when the property holds the literal minimum.\n */\n #getEffectiveValueMin(): number {\n const range = this.max - this.min;\n if (this.valueMin && this.valueMin > 0)\n return this.valueMin;\n return range * DEFAULT_VALUE_MIN_FRACTION;\n }\n\n #quantise(value: number): number {\n if (this.stops && this.stops > 1) {\n const range = this.max - this.min;\n const step = range / this.stops;\n const snapped = Math.round((value - this.min) / step) * step + this.min;\n return clamp(snapped, this.min, this.max);\n }\n if (this.step !== undefined && this.step > 0) {\n const snapped = Math.round((value - this.min) / this.step) * this.step + this.min;\n return clamp(snapped, this.min, this.max);\n }\n return value;\n }\n\n // ─── Value setting ──────────────────────────────────────────────────\n #setSingleValueFromRelative(relativeValue: number, isUserInteraction = false): void {\n const newValue = scale(relativeValue, 0, 1, this.min, this.max);\n const clampedValue = this.#quantise(clamp(newValue, this.min, this.max));\n\n if (clampedValue === this.valueA)\n return;\n\n const previousValue = this.valueA;\n this.valueA = clampedValue;\n this.#poleA = clampedValue;\n this.#isUserInteraction = isUserInteraction;\n\n const valueLane = this.#lanes.get(`value`);\n if (valueLane && valueLane.type === `value`) {\n this.#applySingleStyleValueLane(valueLane, this.#getRelativeValueA());\n }\n\n if (this.hasAttribute(`data-tooltip-live`)) {\n const percentage = Math.round(this.#getRelativeValueA() * 100);\n this.setAttribute(`data-tooltip`, `${percentage}%`);\n }\n\n this.#emitInputAndChange(\n { previousValue },\n isUserInteraction,\n );\n }\n\n #setDualOrTripleValueFromRelative(\n relativeValue: number,\n handle: SliderHandleKey,\n isUserInteraction = false,\n ): void {\n const newValue = scale(relativeValue, 0, 1, this.min, this.max);\n const clamped = clamp(newValue, this.min, this.max);\n\n const result = this.#resolvePoleChange(handle, clamped, this.#lastInteractedHandle);\n if (!result)\n return;\n\n const previous = { ...this.#poles() };\n this.#poleA = result.poleA;\n this.#poleB = result.poleB;\n if (result.poleC !== undefined)\n this.#poleC = result.poleC;\n this.#syncPoleProperties();\n\n const changed = this.#detectChanged(previous, this.#poles());\n this.#isUserInteraction = isUserInteraction;\n\n const valueLane = this.#lanes.get(`value`);\n if (valueLane && valueLane.type === `value`) {\n valueLane.valueMin = valueToRelative(this.#low(), this.min, this.max);\n valueLane.valueMax = valueToRelative(this.#high(), this.min, this.max);\n }\n\n if (this.hasAttribute(`data-tooltip-live`)) {\n const percentage = Math.round(valueToRelative(this.#high(), this.min, this.max) * 100);\n this.setAttribute(`data-tooltip`, `${percentage}%`);\n }\n\n this.#emitInputAndChange(\n {\n previousValue: Math.max(previous.poleA, previous.poleB),\n previousValueMin: Math.min(previous.poleA, previous.poleB),\n previousValueMax: Math.max(previous.poleA, previous.poleB),\n previousValueC: previous.poleC,\n },\n isUserInteraction,\n changed,\n );\n }\n\n #poles(): { poleA: number; poleB: number; poleC: number | undefined } {\n return { poleA: this.#poleA, poleB: this.#poleB, poleC: this.#poleC };\n }\n\n #syncPoleProperties(): void {\n this.valueA = this.#poleA;\n this.valueB = this.#poleB;\n if (this.valueMode === `triple` && this.#poleC !== undefined) {\n this.valueC = this.#poleC;\n this.#hasInitialisedValueC = true;\n }\n }\n\n #resolvePoleChange(\n handle: SliderHandleKey,\n proposed: number,\n originalHandle: SliderHandleKey,\n ): { poleA: number; poleB: number; poleC?: number } | null {\n let poleA = this.#poleA;\n let poleB = this.#poleB;\n let poleC = this.#poleC;\n\n if (this.valueMode === `triple` && handle === `c`) {\n const lo = this.#low();\n const hi = this.#high();\n const clamped = clamp(proposed, lo, hi);\n const quantised = this.#quantise(clamped);\n if (quantised === this.#poleC)\n return null;\n return { poleA, poleB, poleC: quantised };\n }\n\n const gap = this.#getEffectiveValueMin();\n const other = handle === `a` ? poleB : poleA;\n\n let desired = this.#quantise(clamp(proposed, this.min, this.max));\n\n if (this.crossover === `none`) {\n // Pin to the side this handle started on relative to the other one.\n const startedLow = (handle === `a` ? poleA : poleB) <= other;\n if (startedLow) {\n desired = Math.min(desired, other - gap);\n } else {\n desired = Math.max(desired, other + gap);\n }\n } else {\n // 'allow' — snap into the forbidden band, but allow crossover beyond.\n if (desired > other - gap && desired < other + gap) {\n // Within forbidden band; snap to nearer edge.\n const distToLow = Math.abs(desired - (other - gap));\n const distToHigh = Math.abs(desired - (other + gap));\n desired = distToLow <= distToHigh ? other - gap : other + gap;\n }\n }\n\n // Final clamp to [min, max]\n desired = clamp(desired, this.min, this.max);\n\n if (handle === `a`) {\n if (desired === poleA)\n return null;\n poleA = desired;\n } else {\n if (desired === poleB)\n return null;\n poleB = desired;\n }\n\n // Triple-mode: re-anchor C relative to the new [low, high]\n if (this.valueMode === `triple` && poleC !== undefined) {\n const oldLo = Math.min(this.#poleA, this.#poleB);\n const oldHi = Math.max(this.#poleA, this.#poleB);\n const newLo = Math.min(poleA, poleB);\n const newHi = Math.max(poleA, poleB);\n if (this.valueCFollow === `proportional` && oldHi > oldLo) {\n const frac = clamp((poleC - oldLo) / (oldHi - oldLo), 0, 1);\n poleC = newLo + frac * (newHi - newLo);\n } else {\n if (poleC < newLo)\n poleC = newLo;\n if (poleC > newHi)\n poleC = newHi;\n }\n }\n\n // Avoid unused-warning for originalHandle (used in caller for tie-breaking)\n void originalHandle;\n return { poleA, poleB, poleC };\n }\n\n #detectChanged(\n prev: { poleA: number; poleB: number; poleC: number | undefined },\n curr: { poleA: number; poleB: number; poleC: number | undefined },\n ): SliderChangedField {\n const aDiff = prev.poleA !== curr.poleA;\n const bDiff = prev.poleB !== curr.poleB;\n const cDiff = prev.poleC !== curr.poleC;\n\n if (this.valueMode === `triple`) {\n if (aDiff && bDiff && !cDiff)\n return `both`;\n if (aDiff && bDiff)\n return `both`;\n if (aDiff)\n return `min`;\n if (bDiff)\n return `max`;\n if (cDiff)\n return `c`;\n return `min`;\n }\n if (aDiff && bDiff)\n return `both`;\n if (aDiff)\n return `min`;\n if (bDiff)\n return `max`;\n return `min`;\n }\n\n #emitInputAndChange(\n previous: {\n previousValue: number;\n previousValueMin?: number;\n previousValueMax?: number;\n previousValueC?: number;\n },\n isUserInteraction: boolean,\n changed?: SliderChangedField,\n ): void {\n const detailInput = this.#buildInputDetail(changed);\n const detailChange = this.#buildChangeDetail(previous, changed);\n\n if (isUserInteraction) {\n this.dispatchEvent(\n new CustomEvent<SliderInputInputDetail>(`input`, {\n detail: detailInput,\n bubbles: true,\n composed: true,\n }),\n );\n this.#scheduleChangeEvent(detailChange);\n } else {\n this.#fireChangeEvent(detailChange);\n }\n }\n\n #buildInputDetail(changed?: SliderChangedField): SliderInputInputDetail {\n if (this.valueMode === `single`) {\n return {\n value: this.valueA,\n valueRelative: this.#getRelativeValueA(),\n };\n }\n\n const lo = this.#low();\n const hi = this.#high();\n const valueMinRel = valueToRelative(lo, this.min, this.max);\n const valueMaxRel = valueToRelative(hi, this.min, this.max);\n\n if (this.valueMode === `triple` && this.#poleC !== undefined) {\n return {\n value: hi,\n valueRelative: valueMaxRel,\n valueMin: lo,\n valueMax: hi,\n valueMinRelative: valueMinRel,\n valueMaxRelative: valueMaxRel,\n valueC: this.#poleC,\n valueCRelative: valueToRelative(this.#poleC, this.min, this.max),\n changed,\n };\n }\n\n return {\n value: hi,\n valueRelative: valueMaxRel,\n valueMin: lo,\n valueMax: hi,\n valueMinRelative: valueMinRel,\n valueMaxRelative: valueMaxRel,\n changed,\n };\n }\n\n #buildChangeDetail(\n previous: {\n previousValue: number;\n previousValueMin?: number;\n previousValueMax?: number;\n previousValueC?: number;\n },\n changed?: SliderChangedField,\n ): SliderInputChangeDetail {\n if (this.valueMode === `single`) {\n return {\n value: this.valueA,\n valueRelative: this.#getRelativeValueA(),\n previousValue: previous.previousValue,\n };\n }\n\n const lo = this.#low();\n const hi = this.#high();\n const valueMaxRel = valueToRelative(hi, this.min, this.max);\n\n if (this.valueMode === `triple` && this.#poleC !== undefined) {\n return {\n value: hi,\n valueRelative: valueMaxRel,\n previousValue: previous.previousValue,\n valueMin: lo,\n valueMax: hi,\n previousValueMin: previous.previousValueMin ?? lo,\n previousValueMax: previous.previousValueMax ?? hi,\n valueC: this.#poleC,\n previousValueC: previous.previousValueC ?? this.#poleC,\n changed,\n };\n }\n\n return {\n value: hi,\n valueRelative: valueMaxRel,\n previousValue: previous.previousValue,\n valueMin: lo,\n valueMax: hi,\n previousValueMin: previous.previousValueMin ?? lo,\n previousValueMax: previous.previousValueMax ?? hi,\n changed,\n };\n }\n\n #scheduleChangeEvent(detail: SliderInputChangeDetail): void {\n if (this.#changeDebounceTimer !== undefined) {\n clearTimeout(this.#changeDebounceTimer);\n }\n this.#changeDebounceTimer = window.setTimeout(() => {\n this.#fireChangeEvent(detail);\n this.#changeDebounceTimer = undefined;\n }, CHANGE_DEBOUNCE_MS);\n }\n\n #fireChangeEvent(detail: SliderInputChangeDetail): void {\n this.dispatchEvent(\n new CustomEvent<SliderInputChangeDetail>(`change`, {\n detail,\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n // ─── CSS-var lookup ────────────────────────────────────────────────\n #getCssVar(name: string, defaultValue: number): number {\n const style = getComputedStyle(this);\n const val = style.getPropertyValue(name).trim();\n if (!val)\n return defaultValue;\n\n if (val.includes(`calc(`)) {\n const valueRelative = style.getPropertyValue(`--value-relative`).trim();\n if (!valueRelative) {\n const parsed = Number.parseFloat(val.replace(/[^0-9.-]/g, ``));\n return Number.isNaN(parsed) ? defaultValue : parsed;\n }\n const evalStr = val.replace(/var\\(--value-relative\\)/g, valueRelative);\n try {\n const fn = new Function(`return ${evalStr.replace(/calc\\s*\\(([^)]+)\\)/g, `$1`)}`);\n const result = fn();\n return typeof result === `number` && !Number.isNaN(result) ? result : defaultValue;\n } catch {\n const parsed = Number.parseFloat(val.replace(/[^0-9.-]/g, ``));\n return Number.isNaN(parsed) ? defaultValue : parsed;\n }\n }\n\n const parsed = Number.parseFloat(val);\n return Number.isNaN(parsed) ? defaultValue : parsed;\n }\n\n // ─── Pointer interaction ────────────────────────────────────────────\n #onPointerDown = (event: PointerEvent): void => {\n if (this.disabled)\n return;\n\n const svg = this.renderRoot.querySelector(`svg.slider-svg`) as SVGElement | null;\n if (!svg)\n return;\n\n event.preventDefault();\n\n // Move focus to the host so keyboard interaction (arrows, wheel)\n // continues to work after a click/drag, and the focus indicator shows.\n this.focus();\n\n // Force the dragging cursor immediately, since the pointer may move\n // outside the SVG bounds while dragged (and #onPointerMoveCursor is\n // bound to the SVG only).\n svg.style.cursor = `grabbing`;\n\n const rect = this.getBoundingClientRect();\n const isVertical = this.orientation === `vertical`;\n const clientPos = isVertical ? event.clientY : event.clientX;\n const hostStart = isVertical ? rect.top : rect.left;\n const hostSize = isVertical ? rect.height : rect.width;\n // For vertical, top of host = high value, so flip the relative value\n // (clientPosToRelative gives 0 at hostStart, 1 at hostEnd).\n const rawRelative = clientPosToRelative(clientPos, hostStart, hostSize);\n let relativeValue = isVertical ? 1 - rawRelative : rawRelative;\n // For unipolar (single mode), the value bar is symmetric around the track\n // centre, so the click position maps to the value via a V-shape: 0 at\n // the centre, 1 at either end. Clicking 25% in from either side sets\n // the same value (0.5), as does clicking at the very start or end (1).\n if (this.valueMode === `single` && this.singleStyle === `unipolar`) {\n relativeValue = Math.abs(2 * relativeValue - 1);\n }\n\n // Resolve handle\n if (this.valueMode === `single`) {\n this.#lastInteractedHandle = `a`;\n this.#dragHandle = `a`;\n this.#setSingleValueFromRelative(relativeValue, true);\n this.#dragging = true;\n this.toggleAttribute(`dragging`, true);\n this.#activePointerId = event.pointerId;\n try {\n svg.setPointerCapture(event.pointerId);\n } catch {\n // ignore\n }\n this.#dragStartClientPos = clientPos;\n this.#poleValueAtDragStart = this.valueA;\n window.addEventListener(`pointermove`, this.#onPointerMove);\n window.addEventListener(`pointerup`, this.#onPointerUp);\n window.addEventListener(`pointercancel`, this.#onPointerUp);\n return;\n }\n\n // Multi-handle: hit-test\n const aRel = this.#getRelativeValueA();\n const bRel = this.#getRelativeValueB();\n const lo = Math.min(aRel, bRel);\n const hi = Math.max(aRel, bRel);\n const aHandle = this.#poleA <= this.#poleB ? `a` : `b`;\n const bHandle = this.#poleA > this.#poleB ? `a` : `b`;\n const posA = aRel;\n const posB = bRel;\n const isTriple = this.valueMode === `triple`;\n const cRel = isTriple ? this.#getRelativeValueC() : 0;\n const posC = cRel;\n const nearA = Math.abs(relativeValue - posA) < HANDLE_HIT_RADIUS;\n const nearB = Math.abs(relativeValue - posB) < HANDLE_HIT_RADIUS;\n const nearC = isTriple && Math.abs(relativeValue - posC) < HANDLE_HIT_RADIUS;\n\n let chosenHandle: SliderHandleKey | `length` | undefined;\n\n // When two or more handles overlap (e.g. A and C, A and B, etc.), pick\n // the one whose raw pole was NOT last-interacted, so repeated clicks\n // on a near-coincident pair alternate rather than sticking.\n const pickNonLast = (candidates: SliderHandleKey[]): SliderHandleKey => {\n const notLast = candidates.find(h => h !== this.#lastInteractedHandle);\n return notLast ?? candidates[0];\n };\n if (nearA && nearB && nearC) {\n chosenHandle = pickNonLast([aHandle, bHandle, `c`]);\n } else if (nearA && nearB) {\n chosenHandle = pickNonLast([aHandle, bHandle]);\n } else if (nearA && nearC) {\n chosenHandle = pickNonLast([aHandle, `c`]);\n } else if (nearB && nearC) {\n chosenHandle = pickNonLast([bHandle, `c`]);\n } else if (nearA) {\n chosenHandle = aHandle;\n } else if (nearB) {\n chosenHandle = bHandle;\n } else if (nearC) {\n chosenHandle = `c`;\n } else if (this.valueDrag !== `none` && relativeValue > lo && relativeValue < hi) {\n chosenHandle = `length`;\n } else if (this.valueDrag === `none` && relativeValue <= lo) {\n // Dead zone on low side — click-to-set low handle (only when\n // value-drag is off; otherwise clicks outside the bar are a no-op).\n chosenHandle = this.#lowKey();\n } else if (this.valueDrag === `none` && relativeValue >= hi) {\n // Dead zone on high side — click-to-set high handle (only when\n // value-drag is off; otherwise clicks outside the bar are a no-op).\n chosenHandle = this.#highKey();\n } else {\n // Not on a handle, not on a draggable segment, not on a click-to-set\n // dead zone (when value-drag is off). No-op — the pointer event will\n // still register and release cleanly via #onPointerUp, but no value\n // changes.\n chosenHandle = undefined;\n }\n\n this.#dragging = true;\n this.toggleAttribute(`dragging`, true);\n this.#activePointerId = event.pointerId;\n try {\n svg.setPointerCapture(event.pointerId);\n } catch {\n // ignore\n }\n this.#dragStartClientPos = clientPos;\n\n if (chosenHandle === undefined) {\n // Linger-as-track-click but no drag started.\n window.addEventListener(`pointermove`, this.#onPointerMove);\n window.addEventListener(`pointerup`, this.#onPointerUp);\n window.addEventListener(`pointercancel`, this.#onPointerUp);\n return;\n }\n\n this.#dragHandle = chosenHandle;\n\n if (chosenHandle === `length`) {\n this.#lengthDragStart = { poleA: this.#poleA, poleB: this.#poleB };\n this.#lengthDragLowKey = this.#lowKey();\n this.#lengthDragHighKey = this.#highKey();\n this.#lengthDragLength = this.#poleB - this.#poleA < 0\n ? this.#poleA - this.#poleB\n : this.#poleB - this.#poleA;\n this.#lengthDragStartLow = Math.min(this.#poleA, this.#poleB);\n // Remember where the user grabbed the bar (host-relative). Without\n // this, the low edge would jump under the cursor at drag-start.\n this.#lengthDragStartRelative = relativeValue;\n } else {\n this.#lastInteractedHandle = chosenHandle;\n this.#poleValueAtDragStart = chosenHandle === `a` ? this.#poleA : this.#poleB;\n // Click-to-set immediately\n this.#setDualOrTripleValueFromRelative(relativeValue, chosenHandle, true);\n }\n\n window.addEventListener(`pointermove`, this.#onPointerMove);\n window.addEventListener(`pointerup`, this.#onPointerUp);\n window.addEventListener(`pointercancel`, this.#onPointerUp);\n };\n\n #onPointerMove = (event: PointerEvent): void => {\n if (!this.#dragging)\n return;\n\n event.preventDefault();\n\n const rect = this.getBoundingClientRect();\n const isVertical = this.orientation === `vertical`;\n const clientPos = isVertical ? event.clientY : event.clientX;\n const hostStart = isVertical ? rect.top : rect.left;\n const hostSize = isVertical ? rect.height : rect.width;\n const rawRelative = clientPosToRelative(clientPos, hostStart, hostSize);\n let relativeValue = isVertical ? 1 - rawRelative : rawRelative;\n if (this.valueMode === `single` && this.singleStyle === `unipolar`) {\n relativeValue = Math.abs(2 * relativeValue - 1);\n }\n\n if (this.valueMode === `single`) {\n this.#setSingleValueFromRelative(relativeValue, true);\n return;\n }\n\n if (this.#dragHandle === `length`) {\n this.#applyLengthDragFromRelative(relativeValue);\n } else if (this.#dragHandle) {\n this.#setDualOrTripleValueFromRelative(relativeValue, this.#dragHandle, true);\n }\n };\n\n #applyLengthDragFromRelative(relativeValue: number): void {\n if (!this.#lengthDragStart)\n return;\n const range = this.max - this.min;\n const deltaR = relativeValue - this.#lengthDragStartRelative;\n const deltaValue = deltaR * range;\n\n let proposedLow = this.#lengthDragStartLow + deltaValue;\n let proposedHigh = proposedLow + this.#lengthDragLength;\n\n if (this.valueDrag === `stop`) {\n const originalLength = this.#lengthDragLength;\n let candidateLow = proposedLow;\n let candidateHigh = proposedLow + originalLength;\n if (candidateLow < this.min) {\n const maxDelta = this.min - this.#lengthDragStartLow;\n candidateLow = this.#lengthDragStartLow + maxDelta;\n candidateHigh = candidateLow + originalLength;\n }\n if (candidateHigh > this.max) {\n // Translate back so high sits at max.\n const shift = this.max - candidateHigh;\n candidateLow += shift;\n candidateHigh += shift;\n }\n proposedLow = candidateLow;\n proposedHigh = candidateHigh;\n } else if (this.valueDrag === `flex`) {\n proposedLow = clamp(proposedLow, this.min, this.max);\n proposedHigh = clamp(proposedHigh, this.min, this.max);\n }\n\n const lowKey = this.#lengthDragLowKey ?? this.#lowKey();\n const highKey = this.#lengthDragHighKey ?? this.#highKey();\n\n const previous = this.#poles();\n const newPoleA = lowKey === `a` ? proposedLow : proposedHigh;\n const newPoleB = lowKey === `b` ? proposedLow : proposedHigh;\n this.#poleA = newPoleA;\n this.#poleB = newPoleB;\n if (this.valueMode === `triple` && this.#poleC !== undefined) {\n const oldLo = Math.min(previous.poleA, previous.poleB);\n const oldHi = Math.max(previous.poleA, previous.poleB);\n const newLo = Math.min(newPoleA, newPoleB);\n const newHi = Math.max(newPoleA, newPoleB);\n if (this.valueCFollow === `proportional` && oldHi > oldLo) {\n const frac = clamp((this.#poleC - oldLo) / (oldHi - oldLo), 0, 1);\n this.#poleC = newLo + frac * (newHi - newLo);\n } else {\n if (this.#poleC < newLo)\n this.#poleC = newLo;\n if (this.#poleC > newHi)\n this.#poleC = newHi;\n }\n }\n this.#syncPoleProperties();\n\n const changed: SliderChangedField = `both`;\n this.#isUserInteraction = true;\n\n const valueLane = this.#lanes.get(`value`);\n if (valueLane && valueLane.type === `value`) {\n valueLane.valueMin = valueToRelative(this.#low(), this.min, this.max);\n valueLane.valueMax = valueToRelative(this.#high(), this.min, this.max);\n }\n\n this.#emitInputAndChange(\n {\n previousValue: previous.poleA,\n previousValueMin: Math.min(previous.poleA, previous.poleB),\n previousValueMax: Math.max(previous.poleA, previous.poleB),\n previousValueC: previous.poleC,\n },\n true,\n changed,\n );\n }\n\n #onPointerUp = (): void => {\n this.#dragging = false;\n this.#dragHandle = undefined;\n this.#lengthDragStart = undefined;\n this.#lengthDragLowKey = undefined;\n this.#lengthDragHighKey = undefined;\n this.toggleAttribute(`dragging`, false);\n\n // Re-evaluate cursor at the last known pointer position so the cursor\n // doesn't stay stuck at `grabbing` after release.\n this.#onPointerMoveCursor(\n new PointerEvent(`pointermove`, {\n clientX: this.#lastPointerClient.x,\n clientY: this.#lastPointerClient.y,\n }),\n );\n\n const svg = this.renderRoot.querySelector(`svg.slider-svg`);\n if (\n svg\n && this.#activePointerId !== undefined\n && `hasPointerCapture` in svg\n && typeof (svg as Element & { hasPointerCapture?: (id: number) => boolean }).hasPointerCapture === `function`\n ) {\n const has = (svg as Element & { hasPointerCapture: (id: number) => boolean }).hasPointerCapture;\n if (has.call(svg, this.#activePointerId)) {\n try {\n (svg as Element & { releasePointerCapture: (id: number) => void }).releasePointerCapture(this.#activePointerId);\n } catch {\n // ignore\n }\n }\n }\n this.#activePointerId = undefined;\n\n window.removeEventListener(`pointermove`, this.#onPointerMove);\n window.removeEventListener(`pointerup`, this.#onPointerUp);\n window.removeEventListener(`pointercancel`, this.#onPointerUp);\n };\n\n // ─── Keyboard interaction ───────────────────────────────────────────\n #onKeyDown = (event: KeyboardEvent): void => {\n if (this.disabled)\n return;\n\n const range = this.max - this.min;\n const effectiveStep = resolveAxisStep(range, this.stops, this.step, event.shiftKey);\n\n // Determine which handle to act on\n let handle: SliderHandleKey = `a`;\n const target = event.target as Element | null;\n if (target && typeof target.closest === `function`) {\n const handleEl = target.closest(`[data-handle]`) as HTMLElement | null;\n if (handleEl) {\n const h = handleEl.dataset?.handle as SliderHandleKey | undefined;\n if (h === `a` || h === `b` || h === `c`)\n handle = h;\n }\n }\n if (this.valueMode === `single`)\n handle = `a`;\n this.#lastInteractedHandle = handle;\n\n let handled = false;\n\n switch (event.key) {\n case `ArrowUp`:\n case `ArrowRight`:\n if (this.valueMode === `single`) {\n const r = this.#getRelativeValueA() + effectiveStep / range;\n this.#setSingleValueFromRelative(clamp(r, 0, 1), true);\n } else {\n const current = handle === `a` ? this.#poleA : (handle === `b` ? this.#poleB : (this.#poleC ?? this.#low()));\n const r = valueToRelative(current, this.min, this.max) + effectiveStep / range;\n this.#stepHandleByRelativeDelta(handle, r);\n }\n handled = true;\n break;\n\n case `ArrowDown`:\n case `ArrowLeft`:\n if (this.valueMode === `single`) {\n const r = this.#getRelativeValueA() - effectiveStep / range;\n this.#setSingleValueFromRelative(clamp(r, 0, 1), true);\n } else {\n const current = handle === `a` ? this.#poleA : (handle === `b` ? this.#poleB : (this.#poleC ?? this.#low()));\n const r = valueToRelative(current, this.min, this.max) - effectiveStep / range;\n this.#stepHandleByRelativeDelta(handle, r);\n }\n handled = true;\n break;\n\n case `Home`:\n if (this.valueMode === `single`) {\n this.#setSingleValueFromRelative(0, true);\n } else {\n this.#stepHandleByRelativeDelta(handle, 0);\n }\n handled = true;\n break;\n\n case `End`:\n if (this.valueMode === `single`) {\n this.#setSingleValueFromRelative(1, true);\n } else {\n this.#stepHandleByRelativeDelta(handle, 1);\n }\n handled = true;\n break;\n }\n\n if (handled)\n event.preventDefault();\n };\n\n #stepHandleByRelativeDelta(handle: SliderHandleKey, targetRelative: number): void {\n if (this.valueMode === `single`) {\n this.#setSingleValueFromRelative(clamp(targetRelative, 0, 1), true);\n return;\n }\n if (handle === `c`) {\n const lo = this.#low();\n const hi = this.#high();\n const proposed = scale(clamp(targetRelative, 0, 1), 0, 1, this.min, this.max);\n const clamped = clamp(proposed, lo, hi);\n const q = this.#quantise(clamped);\n if (q === this.#poleC)\n return;\n const previous = this.#poles();\n this.#poleC = q;\n this.#syncPoleProperties();\n this.#isUserInteraction = true;\n this.#emitInputAndChange(\n {\n previousValue: previous.poleA,\n previousValueMin: Math.min(previous.poleA, previous.poleB),\n previousValueMax: Math.max(previous.poleA, previous.poleB),\n previousValueC: previous.poleC,\n },\n true,\n `c`,\n );\n return;\n }\n\n this.#setDualOrTripleValueFromRelative(clamp(targetRelative, 0, 1), handle, true);\n }\n\n // ─── Wheel interaction ──────────────────────────────────────────────\n // The WheelNudgeMixin installs a host-level `wheel` listener; this method is\n // called once per handled tick with the resolved direction.\n override _applyWheelDelta(direction: WheelDirection, event: WheelEvent): void {\n // Resolve target handle from event target, falling back to last-interacted.\n let handle: SliderHandleKey = this.#lastInteractedHandle;\n const target = event.target as Element | null;\n if (target && typeof target.closest === `function`) {\n const handleEl = target.closest(`[data-handle]`) as HTMLElement | null;\n if (handleEl) {\n const h = handleEl.dataset?.handle as SliderHandleKey | undefined;\n if (h === `a` || h === `b` || h === `c`)\n handle = h;\n }\n }\n if (this.valueMode === `single`)\n handle = `a`;\n this.#lastInteractedHandle = handle;\n\n const range = this.max - this.min;\n const effectiveStep = resolveAxisStep(range, this.stops, this.step, event.shiftKey);\n\n const current = handle === `a`\n ? this.#poleA\n : handle === `b`\n ? this.#poleB\n : (this.#poleC ?? this.#low());\n const currentRel = valueToRelative(current, this.min, this.max);\n // Negate the direction so \"wheel forward\" always increases the value,\n // regardless of the platform's deltaY convention (Windows reports\n // deltaY < 0 for forward, Mac natural-scrolling reports deltaY > 0).\n // Shift narrows the step but doesn't change polarity.\n const targetRel = clamp(currentRel - direction * effectiveStep / range, 0, 1);\n\n this.#stepHandleByRelativeDelta(handle, targetRel);\n }\n\n #onFocusIn = (event: FocusEvent): void => {\n const target = event.target as Element | null;\n if (target && typeof target.closest === `function`) {\n const handleEl = target.closest(`[data-handle]`) as HTMLElement | null;\n if (handleEl) {\n const h = handleEl.dataset?.handle as SliderHandleKey | undefined;\n if (h === `a` || h === `b` || h === `c`)\n this.#lastInteractedHandle = h;\n }\n }\n };\n\n // ─── Rendering ──────────────────────────────────────────────────────\n #viewBox(): string {\n if (this.orientation === `horizontal`)\n return `0 0 ${LONG} ${CROSS}`;\n return `0 0 ${CROSS} ${LONG}`;\n }\n\n #renderTrack() {\n const isVertical = this.orientation === `vertical`;\n const strokeWidth = this.#getCssVar(`--track-width`, 2);\n const color = this.#getCssVarColor(`--track-color`, `var(--surface-4)`);\n const fill = this.#getCssVarColor(`--track-fill`, `transparent`);\n\n if (isVertical) {\n return svg`\n <rect\n class=\"track\"\n x=\"${CROSS / 2 - strokeWidth / 2}\"\n y=\"${INSET}\"\n width=\"${strokeWidth}\"\n height=\"${LONG - 2 * INSET}\"\n fill=\"${fill}\"\n stroke=\"${color}\"\n stroke-width=\"0\"\n />\n `;\n }\n return svg`\n <rect\n class=\"track\"\n x=\"${INSET}\"\n y=\"${CROSS / 2 - strokeWidth / 2}\"\n width=\"${LONG - 2 * INSET}\"\n height=\"${strokeWidth}\"\n fill=\"${fill}\"\n stroke=\"${color}\"\n stroke-width=\"0\"\n />\n `;\n }\n\n #getCssVarColor(name: string, fallback: string): string {\n const style = getComputedStyle(this);\n const val = style.getPropertyValue(name).trim();\n return val || fallback;\n }\n\n #renderLane(lane: SliderLaneData) {\n const bounds = getTrackBounds(this.orientation);\n let path = ``;\n\n if (lane.type === `fixed`) {\n const start = this.orientation === `horizontal`\n ? { x: bounds.trackStart, y: bounds.crossCentre }\n : { x: bounds.crossCentre, y: bounds.trackStart };\n const end = this.orientation === `horizontal`\n ? { x: bounds.trackEnd, y: bounds.crossCentre }\n : { x: bounds.crossCentre, y: bounds.trackEnd };\n path = generateLinePath(start, end);\n } else if (lane.type === `anchored`) {\n const rel = this.#getRelativeValueA();\n const seg = getAnchoredSegment(rel, lane.value ?? 0.1, this.singleStyle, bounds, this.orientation);\n path = generateLinePath(seg.start, seg.end);\n } else {\n // 'value' lane: from valueMin to valueMax.\n const lo = lane.valueMin ?? 0;\n const hi = lane.valueMax ?? 0;\n const seg = getValueSegment(lo, hi, this.singleStyle, bounds, this.orientation);\n path = generateLinePath(seg.start, seg.end);\n }\n\n if (!path)\n return svg``;\n\n const offset = lane.offset;\n const w = this.orientation === `horizontal`\n ? `calc(var(--lane-${lane.key}-width, var(--lane-width)) * ${CROSS}%)`\n : `calc(var(--lane-${lane.key}-width, var(--lane-width)) * ${CROSS}%)`;\n const transform = this.orientation === `horizontal`\n ? `translateY(${offset * CROSS / 2}px)`\n : `translateX(${offset * CROSS / 2}px)`;\n\n return svg`\n <path\n class=\"lane\"\n data-lane-key=\"${lane.key}\"\n part=\"lane lane-${lane.key}\"\n d=\"${path}\"\n style=\"\n stroke-width: ${w};\n stroke-linecap: round;\n transform: ${transform};\n \"\n />\n `;\n }\n\n #renderValueMarker(handle: SliderHandleKey | undefined, defs: unknown[]) {\n const bounds = getTrackBounds(this.orientation);\n const isHorizontal = this.orientation === `horizontal`;\n\n let value: number;\n if (this.valueMode === `single`) {\n value = this.#getRelativeValueA();\n } else {\n if (handle === `a`)\n value = this.#getRelativeValueA();\n else if (handle === `b`)\n value = this.#getRelativeValueB();\n else value = this.#getRelativeValueC();\n }\n\n const pos = valueToPosition(value, this.singleStyle, bounds, this.orientation);\n\n const markerOffset = this.#getCssVar(`--marker-offset`, 0);\n const markerLength = this.#getCssVar(`--marker-length`, 0.8);\n const markerThickness = this.#getCssVar(`--marker-thickness`, 0.15);\n const markerBorderWidth = this.#getCssVar(`--marker-border-width`, 0);\n\n const center = isHorizontal\n ? { x: pos.x, y: bounds.crossCentre + markerOffset * (CROSS / 2) }\n : { x: bounds.crossCentre + markerOffset * (CROSS / 2), y: pos.y };\n\n // For unipolar, the value bar is symmetric around the track centre, so\n // the \"low end\" is the reflection of the high end across the centre.\n const isUnipolarSingle = this.valueMode === `single` && this.singleStyle === `unipolar`;\n const lowCenter = isUnipolarSingle\n ? (isHorizontal\n ? { x: 2 * bounds.centre - center.x, y: center.y }\n : { x: center.x, y: 2 * bounds.centre - center.y })\n : undefined;\n\n const id = handle ?? `s`;\n\n // Per-handle marker-style override: in triple mode the C handle can\n // take a different shape than the global `markerStyle` applied to A/B.\n const effectiveMarkerStyle = handle === `c` && this.markerStyleC\n ? this.markerStyleC\n : this.markerStyle;\n\n if (effectiveMarkerStyle === `dot`) {\n const r = markerThickness * (CROSS / 2);\n const renderDot = (cx: number, cy: number, mid: string) => {\n if (markerBorderWidth > 0) {\n defs.push(svg`<circle id=\"dot-${mid}-path\" cx=\"${cx}\" cy=\"${cy}\" r=\"${r}\" />`);\n return svg`\n <use href=\"#dot-${mid}-path\" class=\"marker-border\" />\n <use href=\"#dot-${mid}-path\" class=\"marker-fill\" />\n `;\n }\n return svg`<circle cx=\"${cx}\" cy=\"${cy}\" r=\"${r}\" />`;\n };\n\n const high = renderDot(center.x, center.y, id);\n if (lowCenter) {\n return svg`${high}${renderDot(lowCenter.x, lowCenter.y, `${id}-low`)}`;\n }\n return high;\n }\n\n if (effectiveMarkerStyle === `needle`) {\n const halfLen = (markerLength * CROSS) / 4;\n // Draw perpendicular to the track\n const renderNeedle = (cx: number, cy: number, mid: string) => {\n let start: Point;\n let end: Point;\n if (isHorizontal) {\n start = { x: cx, y: cy - halfLen };\n end = { x: cx, y: cy + halfLen };\n } else {\n start = { x: cx - halfLen, y: cy };\n end = { x: cx + halfLen, y: cy };\n }\n const path = `M ${start.x} ${start.y} L ${end.x} ${end.y}`;\n if (markerBorderWidth > 0) {\n defs.push(svg`<path id=\"needle-${mid}-path\" d=\"${path}\" />`);\n return svg`\n <use href=\"#needle-${mid}-path\" class=\"marker-border\" />\n <use href=\"#needle-${mid}-path\" class=\"marker-fill\" />\n `;\n }\n return svg`<path d=\"${path}\" stroke-linecap=\"round\" />`;\n };\n\n const high = renderNeedle(center.x, center.y, id);\n if (lowCenter) {\n return svg`${high}${renderNeedle(lowCenter.x, lowCenter.y, `${id}-low`)}`;\n }\n return high;\n }\n\n if (effectiveMarkerStyle === `triangle`) {\n // Apex sits on the value-track centreline at `center`; base sits\n // perpendicular to the track, offset *outward* by markerLength so the\n // shape hangs outside the value band with its point facing in.\n const halfLen = (markerLength * CROSS) / 4;\n const halfBase = markerThickness * (CROSS / 2);\n const renderTriangle = (cx: number, cy: number, mid: string) => {\n let apex: Point;\n let base1: Point;\n let base2: Point;\n if (isHorizontal) {\n apex = { x: cx, y: cy };\n base1 = { x: cx - halfBase, y: cy + halfLen };\n base2 = { x: cx + halfBase, y: cy + halfLen };\n } else {\n apex = { x: cx, y: cy };\n base1 = { x: cx + halfLen, y: cy - halfBase };\n base2 = { x: cx + halfLen, y: cy + halfBase };\n }\n const points = `${apex.x},${apex.y} ${base1.x},${base1.y} ${base2.x},${base2.y}`;\n if (markerBorderWidth > 0) {\n defs.push(svg`<polygon id=\"triangle-${mid}-path\" points=\"${points}\" />`);\n return svg`\n <use href=\"#triangle-${mid}-path\" class=\"marker-border\" />\n <use href=\"#triangle-${mid}-path\" class=\"marker-fill\" />\n `;\n }\n return svg`<polygon points=\"${points}\" />`;\n };\n\n const high = renderTriangle(center.x, center.y, id);\n if (lowCenter) {\n return svg`${high}${renderTriangle(lowCenter.x, lowCenter.y, `${id}-low`)}`;\n }\n return high;\n }\n\n return svg``;\n }\n\n #renderMidpointMarker() {\n if (this.valueMode !== `single`)\n return svg``;\n if (this.singleStyle !== `bipolar` && this.singleStyle !== `unipolar`)\n return svg``;\n const bounds = getTrackBounds(this.orientation);\n const isHorizontal = this.orientation === `horizontal`;\n const length = this.#getCssVar(`--midpoint-length`, 0.15);\n const halfLen = (length * CROSS) / 4;\n\n const center = isHorizontal\n ? { x: bounds.centre, y: bounds.crossCentre }\n : { x: bounds.crossCentre, y: bounds.centre };\n\n if (this.markerStyle === `dot`) {\n const size = this.#getCssVar(`--midpoint-thickness`, 0.08);\n return svg`\n <g class=\"midpoint-marker\" part=\"midpoint-marker\">\n <circle cx=\"${center.x}\" cy=\"${center.y}\" r=\"${size * (CROSS / 2)}\" />\n </g>\n `;\n }\n\n let start: Point;\n let end: Point;\n if (isHorizontal) {\n start = { x: center.x, y: center.y - halfLen };\n end = { x: center.x, y: center.y + halfLen };\n } else {\n start = { x: center.x - halfLen, y: center.y };\n end = { x: center.x + halfLen, y: center.y };\n }\n\n return svg`\n <g class=\"midpoint-marker\" part=\"midpoint-marker\">\n <line x1=\"${start.x}\" y1=\"${start.y}\" x2=\"${end.x}\" y2=\"${end.y}\" />\n </g>\n `;\n }\n\n #renderHandleGroup(handle: SliderHandleKey | undefined, content: unknown) {\n if (!handle) {\n // Single-mode: don't put tabindex on the `<g>`. The SVG itself is the\n // focusable element (see render()), so the host is tab-reachable and\n // the SVG-level keydown handler fires.\n return svg`<g role=\"slider\"\n class=\"value-marker\"\n aria-orientation=\"${this.orientation}\"\n aria-valuemin=\"${this.min}\" aria-valuemax=\"${this.max}\"\n aria-valuenow=\"${this.valueA}\"\n part=\"value-marker\">${content}</g>`;\n }\n const partName = `value-marker value-marker-${handle}`;\n const value = handle === `a`\n ? this.valueA\n : handle === `b`\n ? this.valueB\n : (this.valueC ?? (this.#poleA + this.#poleB) / 2);\n // Multi-handle: each handle is its own focusable group so Tab moves\n // between them independently.\n return svg`<g tabindex=\"${this.disabled ? -1 : 0}\" role=\"slider\"\n class=\"value-marker\"\n data-handle=\"${handle}\"\n aria-label=\"${handle}\"\n aria-orientation=\"${this.orientation}\"\n aria-valuemin=\"${this.min}\" aria-valuemax=\"${this.max}\"\n aria-valuenow=\"${value}\"\n part=\"${partName}\">${content}</g>`;\n }\n\n #isMultiHandle(): boolean {\n return this.valueMode !== `single`;\n }\n\n // ─── Lifecycle ──────────────────────────────────────────────────────\n protected override willUpdate(changed: PropertyValues): void {\n super.willUpdate(changed);\n\n // Sync internal poles from public properties\n if (changed.has(`valueA`) || changed.has(`valueB`) || !this.hasUpdated) {\n this.#poleA = this.valueA;\n this.#poleB = this.valueB;\n }\n\n // Initial / mode-change valueC defaulting\n if (this.valueMode === `triple`) {\n if (\n this.valueC === undefined\n || !this.#hasInitialisedValueC\n || changed.has(`valueMode`)\n ) {\n this.#poleC = (this.#poleA + this.#poleB) / 2;\n this.valueC = this.#poleC;\n this.#hasInitialisedValueC = true;\n } else {\n this.#poleC = this.valueC;\n }\n // Clamp C to [low, high]\n const lo = Math.min(this.#poleA, this.#poleB);\n const hi = Math.max(this.#poleA, this.#poleB);\n if (this.#poleC < lo)\n this.#poleC = lo;\n if (this.#poleC > hi)\n this.#poleC = hi;\n this.valueC = this.#poleC;\n } else {\n this.#poleC = undefined;\n }\n\n // Sync value lane before render\n if (\n changed.has(`valueA`)\n || changed.has(`valueB`)\n || changed.has(`valueMode`)\n || changed.has(`singleStyle`)\n || !this.hasUpdated\n ) {\n const valueLane = this.#lanes.get(`value`);\n if (valueLane && valueLane.type === `value`) {\n if (this.valueMode === `single`) {\n this.#applySingleStyleValueLane(valueLane, this.#getRelativeValueA());\n } else {\n valueLane.valueMin = valueToRelative(this.#low(), this.min, this.max);\n valueLane.valueMax = valueToRelative(this.#high(), this.min, this.max);\n }\n }\n }\n }\n\n /**\n * Sync the default 'value' lane's valueMin/valueMax for single-mode single-styles.\n * Range: bar from trackStart to value.\n * Bipolar: bar grows from track centre outward to value (or value to centre if below midpoint).\n * Unipolar: bar is centred on the track centre with length proportional to value.\n */\n #applySingleStyleValueLane(valueLane: SliderLaneData, relativeValue: number): void {\n if (this.singleStyle === `bipolar`) {\n valueLane.valueMin = Math.min(0.5, relativeValue);\n valueLane.valueMax = Math.max(0.5, relativeValue);\n } else {\n valueLane.valueMin = 0;\n valueLane.valueMax = relativeValue;\n }\n }\n\n override render(): unknown {\n const lanes = Array.from(this.#lanes.values());\n\n // Initial cursor before the first pointermove arrives. The dynamic\n // cursor (#onPointerMoveCursor) takes over as soon as the user moves\n // the pointer. In single mode the default `pointer` matches \"click to\n // set\"; in multi mode `default` matches \"no implicit interaction for\n // arbitrary track positions\".\n const cursor = this.disabled\n ? `not-allowed`\n : this.valueMode === `single`\n ? `pointer`\n : `default`;\n\n const handles: SliderHandleKey[] = this.#isMultiHandle()\n ? (this.valueMode === `triple` ? [`a`, `b`, `c`] : [`a`, `b`])\n : [];\n\n // Halo shapes for --marker-border-width>0 are pushed here so they end up\n // inside a single root <defs>, matching radial-input's pattern.\n // Compute marker content first so the defs list is populated, then\n // reference both in the template below.\n const markerDefs: unknown[] = [];\n const handleGroups = this.#isMultiHandle()\n ? handles.map(h => this.#renderHandleGroup(h, this.#renderValueMarker(h, markerDefs)))\n : this.#renderHandleGroup(undefined, this.#renderValueMarker(undefined, markerDefs));\n\n return html`\n <svg\n class=\"slider-svg\"\n viewBox=\"${this.#viewBox()}\"\n preserveAspectRatio=\"none\"\n tabindex=\"${this.disabled ? -1 : 0}\"\n style=\"cursor: ${cursor}; width: 100%; height: 100%;\"\n @pointerdown=\"${this.#onPointerDown}\"\n @pointermove=\"${this.#onPointerMoveCursor}\"\n @pointerleave=\"${this.#onPointerLeaveCursor}\"\n @keydown=\"${this.#onKeyDown}\"\n @focusin=\"${this.#onFocusIn}\"\n >\n ${markerDefs.length > 0 ? svg`<defs>${markerDefs}</defs>` : svg``}\n ${this.#renderTrack()}\n ${lanes.map(lane => this.#renderLane(lane))}\n ${this.#renderMidpointMarker()}\n ${handleGroups}\n </svg>\n `;\n }\n\n /**\n * Compute the cursor for the current pointer position. The mapping:\n * - `grab` over a marker handle (single A, or multi A/B/C)\n * - `move` over a draggable segment (between A and B when value-drag is on)\n * - `pointer` over empty track where clicking sets a value (single mode,\n * or the dead zones outside A/B in multi mode)\n * - `default` over no-op segments (between A and B in dual mode when\n * value-drag is none, or between A-C/C-B in triple when value-drag is none)\n * - `not-allowed` when disabled\n *\n * `relativeValue` is in the host's long-axis space (0 = start, 1 = end,\n * already flipped for vertical). For unipolar single mode, the value\n * bar's marker positions are computed in the same space; the abs(2x-1)\n * remap only applies when setting the value on click/drag.\n */\n #cursorAtRelative(relativeValue: number): string {\n if (this.disabled)\n return `not-allowed`;\n if (this.#dragging)\n return `grabbing`;\n\n const HANDLE_HIT = 0.06;\n\n if (this.valueMode === `single`) {\n if (this.singleStyle === `unipolar`) {\n // In unipolar the bar is symmetric around the track centre; the\n // value bar's two ends sit at `0.5 ± value/2`.\n const halfLen = this.#getRelativeValueA() / 2;\n const low = 0.5 - halfLen;\n const high = 0.5 + halfLen;\n if (\n Math.abs(relativeValue - low) < HANDLE_HIT\n || Math.abs(relativeValue - high) < HANDLE_HIT\n ) {\n return `grab`;\n }\n return `pointer`;\n }\n const aRel = this.#getRelativeValueA();\n if (Math.abs(relativeValue - aRel) < HANDLE_HIT) {\n return `grab`;\n }\n return `pointer`;\n }\n\n const aRel = this.#getRelativeValueA();\n const bRel = this.#getRelativeValueB();\n const lo = Math.min(aRel, bRel);\n const hi = Math.max(aRel, bRel);\n\n // Over a handle: grab\n if (Math.abs(relativeValue - aRel) < HANDLE_HIT)\n return `grab`;\n if (Math.abs(relativeValue - bRel) < HANDLE_HIT)\n return `grab`;\n if (this.valueMode === `triple`) {\n const cRel = this.#getRelativeValueC();\n if (Math.abs(relativeValue - cRel) < HANDLE_HIT)\n return `grab`;\n }\n\n // Inside the segment between A and B\n if (relativeValue > lo && relativeValue < hi) {\n return this.valueDrag !== `none` ? `move` : `default`;\n }\n\n // Outside A/B (dead zone) — clicking here jumps A or B to that position\n return `pointer`;\n }\n\n #onPointerMoveCursor = (event: PointerEvent): void => {\n const svg = this.renderRoot.querySelector(`svg.slider-svg`) as SVGElement | null;\n if (!svg)\n return;\n this.#lastPointerClient = { x: event.clientX, y: event.clientY };\n const rect = this.getBoundingClientRect();\n const isVertical = this.orientation === `vertical`;\n const clientPos = isVertical ? event.clientY : event.clientX;\n const hostStart = isVertical ? rect.top : rect.left;\n const hostSize = isVertical ? rect.height : rect.width;\n const rawRelative = clientPosToRelative(clientPos, hostStart, hostSize);\n // For vertical, top of host = high value, so flip the relative value.\n // Unipolar click mapping is NOT applied here — it's only for click-to-set;\n // the cursor needs the host-relative position to find the markers.\n const relativeValue = isVertical ? 1 - rawRelative : rawRelative;\n const cursor = this.#cursorAtRelative(relativeValue);\n if (svg.style.cursor !== cursor) {\n svg.style.cursor = cursor;\n }\n };\n\n #onPointerLeaveCursor = (): void => {\n // Reset to the default cursor (whatever the host sets) when the pointer\n // leaves the slider area, so the cursor doesn't stay stuck on `grab` etc.\n const svg = this.renderRoot.querySelector(`svg.slider-svg`) as SVGElement | null;\n if (!svg)\n return;\n const cursor = this.disabled ? `not-allowed` : `default`;\n if (svg.style.cursor !== cursor) {\n svg.style.cursor = cursor;\n }\n };\n\n protected override updated(changed: PropertyValues): void {\n super.updated(changed);\n\n // Update --value-relative / min/max/c CSS variables unconditionally\n if (this.valueMode === `single`) {\n this.style.setProperty(`--value-relative`, this.#getRelativeValueA().toString());\n } else {\n const lo = valueToRelative(this.#low(), this.min, this.max);\n const hi = valueToRelative(this.#high(), this.min, this.max);\n this.style.setProperty(`--value-min-relative`, lo.toString());\n this.style.setProperty(`--value-max-relative`, hi.toString());\n this.style.setProperty(`--value-relative`, hi.toString());\n if (this.valueMode === `triple` && this.#poleC !== undefined) {\n this.style.setProperty(`--value-c-relative`, valueToRelative(this.#poleC, this.min, this.max).toString());\n }\n }\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener(`keydown`, this.#onHostKeyDown);\n this.#gradientObserver?.disconnect();\n this.#gradientObserver = undefined;\n if (this.#changeDebounceTimer !== undefined) {\n clearTimeout(this.#changeDebounceTimer);\n this.#changeDebounceTimer = undefined;\n }\n this.#onPointerUp();\n }\n\n static override styles = [themeFallbacks, prominenceStyles, css`\n :host {\n display: inline-block;\n width: 200px;\n height: 24px;\n touch-action: none;\n user-select: none;\n tabindex: 0;\n --value-relative: 0;\n --value-min-relative: 0;\n --value-max-relative: 0;\n --value-c-relative: 0;\n\n --lane-width: 0.16;\n --lane-track-width: 0.08;\n --lane-value-width: 0.12;\n }\n\n :host([orientation=\"vertical\"]) {\n width: 24px;\n height: 200px;\n }\n\n :host([disabled]) {\n cursor: not-allowed;\n }\n\n :host {\n outline: none;\n }\n\n :host(:focus-visible) {\n outline: var(--slider-input-svg-focus-outline, 2px solid var(--accent));\n outline-offset: var(--slider-input-svg-focus-outline-offset, 2px);\n }\n\n svg.slider-svg {\n width: 100%;\n height: 100%;\n outline: none;\n overflow: visible;\n }\n\n svg.slider-svg:focus {\n outline: none;\n }\n\n svg.slider-svg:focus-visible,\n :host(:focus-visible) svg.slider-svg {\n outline: var(--slider-input-svg-focus-outline, 2px solid var(--accent));\n outline-offset: var(--slider-input-svg-focus-outline-offset, 2px);\n }\n\n .track {\n stroke: var(--track-color, var(--surface-4));\n stroke-width: var(--track-width, 2);\n }\n\n .lane {\n fill: none;\n stroke-linecap: round;\n stroke-dasharray: var(--lane-dasharray, none);\n stroke-dashoffset: var(--lane-dashoffset, 0);\n vector-effect: non-scaling-stroke;\n }\n\n .lane[data-lane-key='track'] {\n stroke: var(--lane-track-color, var(--surface-4));\n }\n\n .lane[data-lane-key='value'] {\n stroke: var(--lane-value-color, var(--accent));\n }\n\n .lane:not([data-lane-key='track']):not([data-lane-key='value']) {\n stroke: var(--lane-color, var(--accent));\n }\n\n .value-marker > path:not(.marker-border):not(.marker-fill),\n .value-marker > .marker-fill {\n stroke: var(--marker-color, var(--accent));\n stroke-width: calc(var(--marker-thickness, 0.15) * 12px);\n stroke-linecap: round;\n stroke-dasharray: var(--marker-dasharray, none);\n stroke-dashoffset: var(--marker-dashoffset, 0);\n vector-effect: non-scaling-stroke;\n }\n\n .value-marker > .marker-border {\n stroke: var(--marker-border-color, transparent);\n stroke-width: calc((var(--marker-thickness, 0.15) + var(--marker-border-width, 0) * 2) * 12px);\n stroke-linecap: round;\n vector-effect: non-scaling-stroke;\n }\n\n .value-marker .marker-fill,\n .value-marker circle,\n .value-marker polygon {\n fill: var(--marker-color, var(--accent));\n stroke-width: calc(var(--marker-thickness, 0.15) * 12px);\n }\n\n .value-marker[data-handle=\"a\"] > path:not(.marker-border):not(.marker-fill),\n .value-marker[data-handle=\"a\"] > .marker-fill,\n .value-marker[data-handle=\"a\"] > circle,\n .value-marker[data-handle=\"a\"] > polygon {\n stroke: var(--marker-a-color, var(--marker-color, var(--accent)));\n fill: var(--marker-a-color, var(--marker-color, var(--accent)));\n }\n\n .value-marker[data-handle=\"b\"] > path:not(.marker-border):not(.marker-fill),\n .value-marker[data-handle=\"b\"] > .marker-fill,\n .value-marker[data-handle=\"b\"] > circle,\n .value-marker[data-handle=\"b\"] > polygon {\n stroke: var(--marker-b-color, var(--marker-color, var(--accent)));\n fill: var(--marker-b-color, var(--marker-color, var(--accent)));\n }\n\n .value-marker[data-handle=\"c\"] > path:not(.marker-border):not(.marker-fill),\n .value-marker[data-handle=\"c\"] > .marker-fill,\n .value-marker[data-handle=\"c\"] > circle,\n .value-marker[data-handle=\"c\"] > polygon {\n stroke: var(--marker-c-color, var(--marker-color, var(--accent)));\n fill: var(--marker-c-color, var(--marker-color, var(--accent)));\n }\n\n .midpoint-marker line {\n stroke: var(--midpoint-color, var(--surface-muted-text));\n stroke-width: var(--midpoint-thickness, 1px);\n stroke-linecap: round;\n vector-effect: non-scaling-stroke;\n }\n\n .midpoint-marker circle {\n fill: var(--midpoint-color, var(--surface-muted-text));\n stroke: var(--midpoint-border-color, transparent);\n stroke-width: var(--midpoint-border-width, 0);\n vector-effect: non-scaling-stroke;\n }\n `];\n}\n\n// ─── Tag-name registration ───────────────────────────────────────────\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-slider-input': SliderInputElement;\n }\n}\n\n// ─── Module-scope interface merge (typed addEventListener) ─────────────\nexport interface SliderInputElement {\n addEventListener: (<K extends keyof SliderInputElementEventMap>(\n type: K,\n listener: (this: SliderInputElement, event: SliderInputElementEventMap[K]) => void,\n options?: boolean | AddEventListenerOptions,\n ) => void) & ((\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ) => void);\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"slider-input-XppH3vcy.d.ts","names":[],"sources":["../src/slider-input/types.ts","../src/slider-input/slider-input.ts"],"mappings":";;;;;;KAIY;KACA;KACA;KACA;KACA;KACA;;;;;;;KAOA;KACA;KACA;;;;;;;UAQK;EACf;EACA,MAAM;;;;;EAKN;;EAEA;;EAEA;;EAEA;;EAEA;;;;;;KAOU;;;;;;;;UASK;WACN;WACA;;WAEA;;WAEA;WACA;WACA;;WAEA;WACA;;WAEA,UAAU;;UAGJ;WACN;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,UAAU;;KAGT,wBAAwB,YAAY;KACpC,yBAAyB,YAAY;UAEhC;EACf,OAAO;EACP,QAAQ;;;;;cCdG,2BAA2B;;EAGtC;EAGA;;;;;;EAQA;EAGA;EAGA;EAGA;EAGA;EAGA,WAAW;EAGX,aAAa;EAGb,aAAa;EAGb,aAAa;;;;;;EAQb,cAAc;EAGd,WAAW;EAGX,WAAW;;;;;;;EASX,cAAc;EAGd;EAGA;;EAoFS;EAmET,QACE,aACA;IACE;IACA;IACA;IACA,OAAO;IACP;IACA;;EAgBJ,aAAa,aAAa;EAQ1B,aAAa,aAAa,kBAAkB;EAW5C,WAAW;EAKX,YAAY,oBAAoB;EAIhC,QAAQ,cAAc;EA8zBb,iBAAiB,WAAW,gBAAgB,OAAO;YAgWzC,WAAW,SAAS;EAsE9B;YAwJU,QAAQ,SAAS;EAkB3B;SAYO,sBAAM;;QA+IhB;YACI;IACR,qBAAqB;;;UAKR;EACf,oBAAoB,gBAAgB,4BAClC,MAAM,GACN,WAAW,MAAM,oBAAoB,OAAO,2BAA2B,aACvE,oBAAoB,sCAEpB,cACA,UAAU,oCACV,oBAAoB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"split-layout.d.ts","names":[],"sources":["../src/split-layout/split-layout.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAmCa,2BAA2B;;EAEtC;EAGA;EAGA;EAGA;EAGA;EAGA;EAGA;EAGA;EAGA;EAGA;EAGA;EAGA;UAGQ;cAEI;EAuBZ;EAKA;EAIA,QAAQ,mBAAmB;EAgP3B,WAAW;EAsRX,wBAAM;SAyCC,sBAAM;;QA8IP;YACI;IACR,qBAAqB"}