@ixfx/components 0.4.3 → 0.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (225) hide show
  1. package/bundle/index.d.ts +395 -1176
  2. package/bundle/index.d.ts.map +1 -1
  3. package/bundle/index.js +7699 -20648
  4. package/bundle/index.js.map +1 -1
  5. package/dist/ac-text.d.ts +12 -7
  6. package/dist/ac-text.d.ts.map +1 -1
  7. package/dist/ac-text.js +2 -3
  8. package/dist/ac-text.js.map +1 -1
  9. package/dist/{button-C3fLMKUv.js → button-DxYee1ZH.js} +2 -2
  10. package/dist/{button-C3fLMKUv.js.map → button-DxYee1ZH.js.map} +1 -1
  11. package/dist/button.d.ts +1 -2
  12. package/dist/button.d.ts.map +1 -1
  13. package/dist/button.js +1 -2
  14. package/dist/checkbox.d.ts +0 -1
  15. package/dist/checkbox.d.ts.map +1 -1
  16. package/dist/checkbox.js +1 -1
  17. package/dist/checkbox.js.map +1 -1
  18. package/dist/{colour-picker-0sgAha1T.js → colour-picker-BacNRabo.js} +14 -16
  19. package/dist/colour-picker-BacNRabo.js.map +1 -0
  20. package/dist/colour-picker.d.ts +1 -1
  21. package/dist/colour-picker.js +1 -1
  22. package/dist/crumbs.d.ts +5 -2
  23. package/dist/crumbs.d.ts.map +1 -1
  24. package/dist/crumbs.js +45 -20
  25. package/dist/crumbs.js.map +1 -1
  26. package/dist/data-display.d.ts +1 -2
  27. package/dist/data-display.d.ts.map +1 -1
  28. package/dist/data-display.js +25 -23
  29. package/dist/data-display.js.map +1 -1
  30. package/dist/{data-provider-DgI909FP.js → data-provider-35TyWclX.js} +2 -2
  31. package/dist/data-provider-35TyWclX.js.map +1 -0
  32. package/dist/{decorate-DdjvVHS-.js → decorate-VRK8rslU.js} +2 -2
  33. package/dist/{decorate-DdjvVHS-.js.map → decorate-VRK8rslU.js.map} +1 -1
  34. package/dist/editable-label.d.ts +1 -2
  35. package/dist/editable-label.d.ts.map +1 -1
  36. package/dist/editable-label.js +1 -1
  37. package/dist/editable-label.js.map +1 -1
  38. package/dist/{hex-editor-WZrjRtvL.js → hex-editor-Bk6rxhfg.js} +9 -11
  39. package/dist/hex-editor-Bk6rxhfg.js.map +1 -0
  40. package/dist/{hex-editor-CMIxtNgT.d.ts → hex-editor-Caq8vNQk.d.ts} +2 -3
  41. package/dist/hex-editor-Caq8vNQk.d.ts.map +1 -0
  42. package/dist/hex.d.ts +1 -1
  43. package/dist/hex.js +1 -1
  44. package/dist/highlight-B-eQrhhb.js.map +1 -1
  45. package/dist/{icon-Ndo40kNO.js → icon-B22XVlCt.js} +6 -4
  46. package/dist/{icon-Ndo40kNO.js.map → icon-B22XVlCt.js.map} +1 -1
  47. package/dist/{icon-Bd5BiU4b.d.ts → icon-DpA9x2Ve.d.ts} +2 -3
  48. package/dist/icon-DpA9x2Ve.d.ts.map +1 -0
  49. package/dist/icons.d.ts +2 -2
  50. package/dist/icons.js +1 -1
  51. package/dist/{incr-search-CeERfijK.js → incr-search-2pz21xtR.js} +9 -6
  52. package/dist/incr-search-2pz21xtR.js.map +1 -0
  53. package/dist/incr-search.d.ts +1 -1
  54. package/dist/incr-search.js +1 -1
  55. package/dist/{index-CowKi2mo.d.ts → index-BeuCXtiO.d.ts} +3 -4
  56. package/dist/index-BeuCXtiO.d.ts.map +1 -0
  57. package/dist/{index-D87kRcEs.d.ts → index-BtGFYfaK.d.ts} +2 -1
  58. package/dist/index-BtGFYfaK.d.ts.map +1 -0
  59. package/dist/{index-s_IhSnwc.d.ts → index-CoqtMSd9.d.ts} +6 -4
  60. package/dist/index-CoqtMSd9.d.ts.map +1 -0
  61. package/dist/{index-9fGVAg1d.d.ts → index-Cxwxtj6g.d.ts} +3 -3
  62. package/dist/index-Cxwxtj6g.d.ts.map +1 -0
  63. package/dist/index-D_ftz_IT.d.ts +184 -0
  64. package/dist/index-D_ftz_IT.d.ts.map +1 -0
  65. package/dist/{index-_RTQSKHi.d.ts → index-DfEkTGvT.d.ts} +11 -11
  66. package/dist/index-DfEkTGvT.d.ts.map +1 -0
  67. package/dist/index.d.ts +44 -29
  68. package/dist/index.d.ts.map +1 -1
  69. package/dist/index.js +304 -3075
  70. package/dist/index.js.map +1 -1
  71. package/dist/keyboard-B5xD7Fz-.js +36 -0
  72. package/dist/keyboard-B5xD7Fz-.js.map +1 -0
  73. package/dist/{labelled-input-base-ORb1rGq6.d.ts → labelled-input-base-DiTme1JO.d.ts} +1 -2
  74. package/dist/labelled-input-base-DiTme1JO.d.ts.map +1 -0
  75. package/dist/{labelled-input-base-9K_w3oLj.js → labelled-input-base-hoKGwyKT.js} +2 -2
  76. package/dist/{labelled-input-base-9K_w3oLj.js.map → labelled-input-base-hoKGwyKT.js.map} +1 -1
  77. package/dist/labelled-radial-input.d.ts +5 -4
  78. package/dist/labelled-radial-input.d.ts.map +1 -1
  79. package/dist/labelled-radial-input.js +7 -3
  80. package/dist/labelled-radial-input.js.map +1 -1
  81. package/dist/labelled-range-input.d.ts +1 -1
  82. package/dist/labelled-range-input.js +27 -3
  83. package/dist/labelled-range-input.js.map +1 -1
  84. package/dist/led.d.ts +1 -2
  85. package/dist/led.d.ts.map +1 -1
  86. package/dist/led.js +1 -1
  87. package/dist/led.js.map +1 -1
  88. package/dist/{menu-vjoiHZ13.js → menu-g6yd7ddN.js} +8 -9
  89. package/dist/menu-g6yd7ddN.js.map +1 -0
  90. package/dist/{menu-item-COx-Azgj.d.ts → menu-item-DSyf9f_L.d.ts} +4 -4
  91. package/dist/menu-item-DSyf9f_L.d.ts.map +1 -0
  92. package/dist/{menu-item-BrIuORYD.js → menu-item-NUKwJ4s5.js} +3 -4
  93. package/dist/{menu-item-BrIuORYD.js.map → menu-item-NUKwJ4s5.js.map} +1 -1
  94. package/dist/menu.d.ts +2 -2
  95. package/dist/menu.js +2 -2
  96. package/dist/miller.d.ts +8 -5
  97. package/dist/miller.d.ts.map +1 -1
  98. package/dist/miller.js +22 -24
  99. package/dist/miller.js.map +1 -1
  100. package/dist/narrowed-text.d.ts +7 -3
  101. package/dist/narrowed-text.d.ts.map +1 -1
  102. package/dist/narrowed-text.js +73 -47
  103. package/dist/narrowed-text.js.map +1 -1
  104. package/dist/panel.d.ts +1 -1
  105. package/dist/panel.d.ts.map +1 -1
  106. package/dist/panel.js +2 -2
  107. package/dist/panel.js.map +1 -1
  108. package/dist/plots.d.ts +2 -2
  109. package/dist/plots.js +1 -1
  110. package/dist/polar-pad.d.ts +15 -3
  111. package/dist/polar-pad.d.ts.map +1 -1
  112. package/dist/polar-pad.js +64 -11
  113. package/dist/polar-pad.js.map +1 -1
  114. package/dist/{radial-input-CpQPs1Mp.d.ts → radial-input-DXMN55Nz.d.ts} +6 -4
  115. package/dist/radial-input-DXMN55Nz.d.ts.map +1 -0
  116. package/dist/{radial-input-DZ7eQCcM.js → radial-input-DxCrt_NE.js} +41 -19
  117. package/dist/radial-input-DxCrt_NE.js.map +1 -0
  118. package/dist/radial-input.d.ts +1 -1
  119. package/dist/radial-input.js +1 -1
  120. package/dist/range-input.d.ts +15 -4
  121. package/dist/range-input.d.ts.map +1 -1
  122. package/dist/range-input.js +23 -2
  123. package/dist/range-input.js.map +1 -1
  124. package/dist/range.d.ts +15 -4
  125. package/dist/range.d.ts.map +1 -1
  126. package/dist/range.js +23 -2
  127. package/dist/range.js.map +1 -1
  128. package/dist/selecthorizontal.d.ts +1 -2
  129. package/dist/selecthorizontal.d.ts.map +1 -1
  130. package/dist/selecthorizontal.js +1 -1
  131. package/dist/selecthorizontal.js.map +1 -1
  132. package/dist/slider-input-DFpG23bS.js +1592 -0
  133. package/dist/slider-input-DFpG23bS.js.map +1 -0
  134. package/dist/slider-input-XppH3vcy.d.ts +160 -0
  135. package/dist/slider-input-XppH3vcy.d.ts.map +1 -0
  136. package/dist/slider-input.d.ts +2 -0
  137. package/dist/slider-input.js +2 -0
  138. package/dist/snap-container.d.ts +1 -2
  139. package/dist/snap-container.d.ts.map +1 -1
  140. package/dist/snap-container.js +6 -5
  141. package/dist/snap-container.js.map +1 -1
  142. package/dist/split-layout.d.ts +1 -2
  143. package/dist/split-layout.d.ts.map +1 -1
  144. package/dist/split-layout.js +6 -4
  145. package/dist/split-layout.js.map +1 -1
  146. package/dist/swipe.d.ts +12 -2
  147. package/dist/swipe.d.ts.map +1 -1
  148. package/dist/swipe.js +22 -3
  149. package/dist/swipe.js.map +1 -1
  150. package/dist/{tab-list-DLzb-m-I.d.ts → tab-list-BohmbvqF.d.ts} +14 -5
  151. package/dist/tab-list-BohmbvqF.d.ts.map +1 -0
  152. package/dist/tab-list-DzknpdSo.js +592 -0
  153. package/dist/tab-list-DzknpdSo.js.map +1 -0
  154. package/dist/tabs.d.ts +2 -2
  155. package/dist/tabs.js +1 -208
  156. package/dist/{tickled-controller-BjYCzGrU.d.ts → tickled-controller-BF2Ea0DE.d.ts} +2 -31
  157. package/dist/tickled-controller-BF2Ea0DE.d.ts.map +1 -0
  158. package/dist/tickled-styles-fNDdqf6l.js.map +1 -1
  159. package/dist/{timeline-2OFtN4Ta.js → timeline-B2fgDL4U.js} +37 -1438
  160. package/dist/timeline-B2fgDL4U.js.map +1 -0
  161. package/dist/timeline.d.ts +1 -1
  162. package/dist/timeline.js +1 -1
  163. package/dist/{tooltip-RGVIwHrZ.d.ts → tooltip-BlvBUQxx.d.ts} +3 -3
  164. package/dist/tooltip-BlvBUQxx.d.ts.map +1 -0
  165. package/dist/{tree-D84RUgFC.js → tree-BnvzhsAw.js} +8 -9
  166. package/dist/tree-BnvzhsAw.js.map +1 -0
  167. package/dist/{tree-component-BaCSPWg1.d.ts → tree-component-DCmmKZ4j.d.ts} +8 -124
  168. package/dist/tree-component-DCmmKZ4j.d.ts.map +1 -0
  169. package/dist/tree.d.ts +10 -4
  170. package/dist/tree.d.ts.map +1 -1
  171. package/dist/tree.js +1 -1
  172. package/dist/types-DO3gt5vg.d.ts +130 -0
  173. package/dist/types-DO3gt5vg.d.ts.map +1 -0
  174. package/dist/wheel-nudge-BlSCe_hD.js +86 -0
  175. package/dist/wheel-nudge-BlSCe_hD.js.map +1 -0
  176. package/dist/wheel-nudge-DGrNzWuE.d.ts +29 -0
  177. package/dist/wheel-nudge-DGrNzWuE.d.ts.map +1 -0
  178. package/dist/{xy-axis-BeWRMmbo.d.ts → xy-axis-5KhVTNoX.d.ts} +30 -7
  179. package/dist/xy-axis-5KhVTNoX.d.ts.map +1 -0
  180. package/dist/xy-axis-CxHC8z5E.js +1849 -0
  181. package/dist/xy-axis-CxHC8z5E.js.map +1 -0
  182. package/dist/xy-pad.d.ts +13 -2
  183. package/dist/xy-pad.d.ts.map +1 -1
  184. package/dist/xy-pad.js +47 -6
  185. package/dist/xy-pad.js.map +1 -1
  186. package/docs-user/radial-input.md +2 -2
  187. package/package.json +21 -20
  188. package/dist/colour-C3MQIjFJ-vRCdr8W-.js +0 -3732
  189. package/dist/colour-C3MQIjFJ-vRCdr8W-.js.map +0 -1
  190. package/dist/colour-picker-0sgAha1T.js.map +0 -1
  191. package/dist/data-provider-DgI909FP.js.map +0 -1
  192. package/dist/dist-CA13FvMn.js +0 -980
  193. package/dist/dist-CA13FvMn.js.map +0 -1
  194. package/dist/hex-editor-CMIxtNgT.d.ts.map +0 -1
  195. package/dist/hex-editor-WZrjRtvL.js.map +0 -1
  196. package/dist/icon-Bd5BiU4b.d.ts.map +0 -1
  197. package/dist/incr-search-CeERfijK.js.map +0 -1
  198. package/dist/index-9fGVAg1d.d.ts.map +0 -1
  199. package/dist/index-CowKi2mo.d.ts.map +0 -1
  200. package/dist/index-D87kRcEs.d.ts.map +0 -1
  201. package/dist/index-DgXpCg_G.d.ts +0 -1244
  202. package/dist/index-DgXpCg_G.d.ts.map +0 -1
  203. package/dist/index-_RTQSKHi.d.ts.map +0 -1
  204. package/dist/index-s_IhSnwc.d.ts.map +0 -1
  205. package/dist/keyboard-CimiEskD.js +0 -20
  206. package/dist/keyboard-CimiEskD.js.map +0 -1
  207. package/dist/labelled-input-base-ORb1rGq6.d.ts.map +0 -1
  208. package/dist/menu-item-COx-Azgj.d.ts.map +0 -1
  209. package/dist/menu-vjoiHZ13.js.map +0 -1
  210. package/dist/radial-input-CpQPs1Mp.d.ts.map +0 -1
  211. package/dist/radial-input-DZ7eQCcM.js.map +0 -1
  212. package/dist/tab-list-DLzb-m-I.d.ts.map +0 -1
  213. package/dist/tabs.js.map +0 -1
  214. package/dist/tickled-controller-BjYCzGrU.d.ts.map +0 -1
  215. package/dist/timeline-2OFtN4Ta.js.map +0 -1
  216. package/dist/tooltip-RGVIwHrZ.d.ts.map +0 -1
  217. package/dist/tree-D84RUgFC.js.map +0 -1
  218. package/dist/tree-component-BaCSPWg1.d.ts.map +0 -1
  219. package/dist/types-DSfbtHs3.d.ts +0 -8
  220. package/dist/types-DSfbtHs3.d.ts.map +0 -1
  221. package/dist/xy-axis-BeWRMmbo.d.ts.map +0 -1
  222. package/dist/xy-axis-no0OL_O1.js +0 -7893
  223. package/dist/xy-axis-no0OL_O1.js.map +0 -1
  224. /package/bundle/{chunk-D7D4PA-g.js → rolldown-runtime-D7D4PA-g.js} +0 -0
  225. /package/dist/{chunk-D7D4PA-g.js → rolldown-runtime-D7D4PA-g.js} +0 -0
@@ -1,7 +1,7 @@
1
1
  import { n as tickledStyles, r as TickledController, t as tickledItemStyles } from "./tickled-styles-fNDdqf6l.js";
2
2
  import { t as themeFallbacks } from "./fallbacks-pNMOMx38.js";
3
- import { n as safeCustomElement, t as __decorate } from "./decorate-DdjvVHS-.js";
4
- import "./icon-Ndo40kNO.js";
3
+ import { n as safeCustomElement, t as __decorate } from "./decorate-VRK8rslU.js";
4
+ import "./icon-B22XVlCt.js";
5
5
  import { t as popupSurfaceStyles } from "./popup-DiWMxsWj.js";
6
6
  import "./interaction-D6efrBLo.js";
7
7
  import { LitElement, css, html } from "lit";
@@ -69,7 +69,6 @@ let MenuContainer = class MenuContainer extends LitElement {
69
69
  e.preventDefault();
70
70
  e.stopPropagation();
71
71
  this._activateFocusedItem(items);
72
- break;
73
72
  }
74
73
  };
75
74
  }
@@ -773,4 +772,4 @@ MenuItem = __decorate([safeCustomElement(`ixfx-menu-item`)], MenuItem);
773
772
  //#endregion
774
773
  export { MenuTrigger as n, MenuContainer as r, MenuItem as t };
775
774
 
776
- //# sourceMappingURL=menu-item-BrIuORYD.js.map
775
+ //# sourceMappingURL=menu-item-NUKwJ4s5.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"menu-item-BrIuORYD.js","names":["customElement","customElement","customElement"],"sources":["../src/menu/menu-container.ts","../src/menu/menu-trigger.ts","../src/menu/menu-item.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\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, { top: string; left: string }> = {\n 'bottom-start': { top: `anchor(bottom)`, left: `anchor(left)` },\n 'bottom-end': { top: `anchor(bottom)`, left: `anchor(right)` },\n 'right-start': { top: `anchor(top)`, left: `anchor(right)` },\n };\n const pos = placements[this.placement];\n this._popup.style.top = pos.top;\n this._popup.style.left = pos.left;\n (this._popup.style as any).positionAnchor = this._anchorName;\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 }\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(--space-s) var(--space-m);\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: 0;\n padding: 0;\n border: none;\n background: transparent;\n z-index: 100;\n position-try-fallbacks: flip-inline, flip-block, 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\">${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: rgba(0, 0, 0, 0.06);\n border: 1px solid var(--accent);\n color: inherit;\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"],"mappings":";;;;;;;;;AASO,IAAA,gBAAA,MAAM,sBAAsB,WAAW;;;iBAO1B,IAAI,kBAA0B,MAAM;GACpD,gBAAgB;IAEd,OADc,KAAK,cACR,EAAE,KAAK,MAAM,OAAO;KAC7B,IAAI;KACJ,SAAS,CAAC,KAAK,aAAa,UAAU;IACxC,EAAE;GACJ;GACA,WAAW,UAAU;IAEnB,MAAM,QAAQ,KAAK,cAAc;IACjC,IAAI,UAAU,KAAA,GAAW;KACvB,MAAM,OAAO,MAAM;KAEnB,KAAK,WAAW;KAChB,KAAK,MAAM,EAAE,eAAe,KAAK,CAAC;IACpC;GACF;GACA,qBAAqB;IAEnB,KAAK,oBAAoB;GAC3B;EACF,CAAC;2BA8L2B,MAAwB;GAClD,MAAM,QAAQ,KAAK,cAAc;GAEjC,MAAM,OAAO,EAAE,aAAa;GAC5B,MAAM,eAAe,MAAM,WAAU,SAAQ,KAAK,SAAS,IAAI,CAAC;GAChE,IAAI,iBAAiB,IAAI;IACvB,MAAM,OAAO,MAAM;IAMnB,MAAM,gBAAgB,KAAK,QAAQ,IAAI;IAIvC,IAAI,CAHwB,KAAK,MAAM,GAAG,aAAa,EAAE,MACvD,SAAQ,gBAAgB,WAAW,KAAK,YAAY,qBAE/B,GAErB,KAAK,QAAQ,mBAAmB,YAAY;IAI9C,EAAE,gBAAgB;GACpB;EACF;yBA6E0B,MAA2B;GACnD,MAAM,QAAQ,KAAK,cAAc;GACjC,IAAI,MAAM,WAAW,GACnB;GAGF,QAAQ,EAAE,KAAV;IACE,KAAK;KACH,EAAE,eAAe;KACjB,EAAE,gBAAgB;KAClB,KAAK,WAAW,OAAO,CAAC;KACxB;IACF,KAAK;KACH,EAAE,eAAe;KACjB,EAAE,gBAAgB;KAClB,KAAK,WAAW,OAAO,EAAE;KACzB;IACF,KAAK;KACH,EAAE,eAAe;KACjB,EAAE,gBAAgB;KAClB,KAAK,WAAW,OAAO,CAAC;KACxB;IACF,KAAK;KACH,EAAE,eAAe;KACjB,EAAE,gBAAgB;KAClB,KAAK,WAAW,OAAO,MAAM,SAAS,CAAC;KACvC;IACF,KAAK;IACL,KAAK;KACH,EAAE,eAAe;KACjB,EAAE,gBAAgB;KAClB,KAAK,qBAAqB,KAAK;KAC/B;GACJ;EACF;;;gBAnUgB;GAAC;GAAoB;GAAgB;GAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0BtE;;CAED,sBAAoC;EAClC,MAAM,OAAO,KAAK,YAAY,cAAc,MAAM;EAClD,IAAI,CAAC,MACH;EAEF,MAAM,WAAW,KAAK,iBAAiB,EAAE,SAAS,KAAK,CAAC;EAGxD,MAAM,WAAwB,CAAC;EAC/B,IAAI,UAAqB,CAAC;EAC1B,KAAK,MAAM,MAAM,UACf,IAAI,GAAG,YAAY,yBAAyB,GAAG,YAAY;OACrD,QAAQ,SAAS,GAAG;IACtB,SAAS,KAAK,OAAO;IAAG,UAAU,CAAC;GACrC;SAEA,QAAQ,KAAK,EAAE;EAGnB,IAAI,QAAQ,SAAS,GACnB,SAAS,KAAK,OAAO;EAEvB,KAAK,kBAAkB;EAEvB,KAAK,MAAM,OAAO,UAAU;GAC1B,MAAM,UAAU,IAAI,MAAM,OAAO;IAC/B,IAAI,GAAG,YAAY,yBACjB,OAAO,CAAC,GAAG,GAAG,QAAQ,EAAE,MAAK,OAAM,GAAG,aAAa,WAAW,CAAC;IAEjE,OAAO,GAAG,aAAa,WAAW;GACpC,CAAC;GAED,KAAK,MAAM,MAAM,KACf,IAAI,GAAG,YAAY,yBACjB,KAAK,MAAM,MAAM,GAAG,UAClB,IAAI,SACF,GAAG,aAAa,qBAAqB,EAAE;QACpC,GAAG,gBAAgB,mBAAmB;QAG7C,IAAI,SACF,GAAG,aAAa,qBAAqB,EAAE;QACpC,GAAG,gBAAgB,mBAAmB;EAGjD;EAEA,KAAK,cAAc;CACrB;CAEA,oBAAkC;EAChC,MAAM,OAAO,KAAK,YAAY,cAAc,MAAM;EAClD,IAAI,CAAC,MACH;EACF,KAAK,MAAM,MAAM,KAAK,iBAAiB,EAAE,SAAS,KAAK,CAAC,GAAG;GACzD,IAAI,cAAc,IAChB,GAAY,WAAW,KAAK;GAC9B,IAAI,qBAAqB,IACvB,GAAY,kBAAkB,KAAK;EACvC;CACF;CAEA,QAAiB,mBAA+C;EAC9D,IAAI,kBAAkB,IAAI,UAAU,KAAK,kBAAkB,IAAI,iBAAiB,GAC9E,KAAK,kBAAkB;CAE3B;;;;CAKA,WAAW,SAA0C;EACnD,MAAM,WAAW,OAAO;EAGxB,KAAK,aAAa,mBAAmB,KAAK,QAAQ,SAAS;CAC7D;CAEA,SAAS;EACP,OAAO,IAAI;;;;mBAII,KAAK,eAAe;qBAClB,KAAK,iBAAiB;;4BAEf,KAAK,oBAAoB;;;CAGnD;CAEA,gBAAuC;EACrC,MAAM,OAAO,KAAK,YAAY,cAAc,MAAM;EAClD,IAAI,CAAC,MACH,OAAO,CAAC;EAEV,MAAM,WAAW,CAAC,uBAAuB,kBAAkB;EAC3D,MAAM,SAAwB,CAAC;EAE/B,KAAK,MAAM,MAAM,KAAK,iBAAiB,EAAE,SAAS,KAAK,CAAC,GAAG;GACzD,IAAI,SAAS,SAAS,GAAG,OAAO,GAC9B;GACF,IAAI,GAAG,aAAa,UAAU,GAC5B;GACF,MAAM,OAAO,GAAG,aAAa,MAAM;GACnC,IAAI,SAAS,UAAU,SAAS,gBAC9B;GAEF,IAAI,GAAG,YAAY,yBAAyB;IAC1C,MAAM,YAAY,GAAG,YAAY,cAAc,MAAM;IACrD,KAAK,MAAM,aAAa,WAAW,iBAAiB,EAAE,SAAS,KAAK,CAAC,KAAK,CAAC,GACzE,IAAI,CAAC,UAAU,aAAa,UAAU,GACpC,OAAO,KAAK,SAAwB;GAG1C,OACE,OAAO,KAAK,EAAiB;EAEjC;EAEA,OAAO;CACT;;;;;CAMA,sBAAoC;EAClC,MAAM,QAAQ,KAAK,cAAc;EACjC,MAAM,SAAS,MAAM,MAAM;GACzB,IAAI,KAAK,QAAQ,UAAU,CAAC,GAAG;IAC7B,KAAK,UAAU,IAAI,SAAS;IAC5B,KAAK,WAAW;IAEhB,MAAM,YAAY,KAAK,YAAY,cAAc,OAAO;IACxD,IAAI,WAAW;KACb,UAAU,MAAM,aAAa;KAC7B,UAAU,MAAM,cAAc;KAC9B,UAAU,MAAM,QAAQ;IAC1B;GACF,OAAO;IACL,KAAK,UAAU,OAAO,SAAS;IAC/B,KAAK,WAAW;IAEhB,MAAM,YAAY,KAAK,YAAY,cAAc,OAAO;IACxD,IAAI,WAAW;KACb,UAAU,MAAM,aAAa;KAC7B,UAAU,MAAM,cAAc;KAC9B,UAAU,MAAM,QAAQ;IAC1B;GACF;EACF,CAAC;EAGD,IAAI,KAAK,QAAQ,cAAc,cAAc,KAAK,QAAQ,cAAc,KAAA,GAEtE,MAD0B,KAAK,QAAQ,YAC1B,MAAM;CAEvB;CA4BA,aAAmB;EACjB,KAAK,QAAQ,yBAAyB,OAAO;CAC/C;CAEA,WAAmB,OAAsB,WAAyB;EAChE,IAAI,MAAM,WAAW,GACnB;EAGF,KAAK,QAAQ,yBAAyB,YAAY,IAAI,SAAS,UAAU;CAC3E;CAEA,WAAmB,OAAsB,OAAqB;EAC5D,IAAI,MAAM,WAAW,GACnB;EAIF,MAAM,eAAe,KAAK,IAAI,GAAG,KAAK,IAAI,OAAO,MAAM,SAAS,CAAC,CAAC;EAClE,KAAK,QAAQ,yBAAyB,YAAY;CACpD;CAEA,qBAA6B,OAA4B;EACvD,MAAM,eAAe,KAAK,QAAQ;EAClC,IAAI,iBAAiB,KAAA,GACnB;EAGF,MAAM,OAAO,MAAM;EACnB,IAAI,CAAC,MACH;EAGF,MAAM,UAAU,KAAK;EAErB,IAAI,YAAY,yBAEd;EAGF,IAAI,YAAY,wBAAwB;GACtC,MAAM,YAAY;GAClB,UAAU,UAAU,CAAC,UAAU;GAC/B,UAAU,cAAc,IAAI,YAAY,WAAW;IACjD,QAAQ;KAAE,SAAS,UAAU;KAAS,SAAS,UAAU;IAAQ;IACjE,SAAS;IACT,UAAU;GACZ,CAAC,CAAC;GACF;EACF;EAEA,IAAI,YAAY,wBAAwB;GACtC,KAAK,cAAc,IAAI,YAAY,gBAAgB;IACjD,QAAQ,EAAE,OAAQ,KAAa,MAAM;IACrC,SAAS;IACT,UAAU;GACZ,CAAC,CAAC;GACF;EACF;EAEA,IAAI,YAAY,kBAAkB;GAChC,MAAM,UAAW,KAAa;GAC9B,IAAI,SACF,KAAK,cAAc,IAAI,YAAY,WAAW;IAC5C,QAAQ,EAAE,QAAQ;IAClB,SAAS;IACT,UAAU;GACZ,CAAC,CAAC;GAEJ;EACF;EAEA,KAAsB,MAAM;CAC9B;AAqCF;YAlWG,SAAS;CAAE,MAAM;CAAQ,WAAW;AAAS,CAAC,CAAA,GAAA,cAAA,WAAA,UAAA,KAAA,CAAA;YAC9C,SAAS,EAAE,WAAW,MAAM,CAAC,CAAA,GAAA,cAAA,WAAA,YAAA,KAAA,CAAA;YAC7B,SAAS,EAAE,WAAW,MAAM,CAAC,CAAA,GAAA,cAAA,WAAA,mBAAA,KAAA,CAAA;YAC7B,MAAM,UAAU,CAAA,GAAA,cAAA,WAAA,YAAA,KAAA,CAAA;4BALlBA,kBAAc,qBAAqB,CAAA,GAAA,aAAA;;;;ACY7B,IAAA,cAAA,MAAM,oBAAoB,WAAW;;;;;;cACG;eACT;mBAGe;iBAExB;kBACC;yBACO;qBAOb,QAAQ,aAAY;wBACjB,KAAK,oBAAoB,KAAK,IAAI;+BA4G3B,MAAmB;GACjD,IAAK,EAAkB,aAAa,UAAU;IAC5C,KAAK,UAAU;IACf,SAAS,oBAAoB,SAAS,KAAK,cAAc;IACzD,KAAK,cAAc,IAAI,YAAY,sBAAsB;KAAE,SAAS;KAAM,UAAU;IAAK,CAAC,CAAC;GAC7F;EACF;yBA2C0B,MAA2B;GACnD,IAAI,CAAC,KAAK,SACR;GAEF,IAAI,EAAE,QAAQ,UAAU;IACtB,EAAE,eAAe;IACjB,EAAE,gBAAgB;IAClB,KAAK,WAAW;IAChB,KAAK,aAAa,MAAM;GAC1B,OAAO,IAAI,EAAE,QAAQ,OAAO;IAC1B,KAAK,WAAW;IAChB,KAAK,aAAa,MAAM;GAC1B;EACF;;;gBA7KwB;;CAKxB,oBAA0B;EACxB,MAAM,kBAAkB;EACxB,SAAS,iBAAiB,WAAW,KAAK,cAAc;EACxD,KAAK,iBAAiB,WAAW,KAAK,cAA+B;EACrE,KAAK,iBAAiB,gBAAgB,KAAK,kBAAmC;CAChF;CAEA,uBAA6B;EAC3B,MAAM,qBAAqB;EAC3B,SAAS,oBAAoB,WAAW,KAAK,cAAc;EAC3D,KAAK,oBAAoB,WAAW,KAAK,cAA+B;EACxE,KAAK,oBAAoB,gBAAgB,KAAK,kBAAmC;EACjF,SAAS,oBAAoB,SAAS,KAAK,cAAc;CAC3D;CAEA,eAAqB;EACnB,KAAK,MAAM,YAAY,iBAAiB,KAAK,WAAW;EACxD,KAAK,OAAO,iBAAiB,UAAU,KAAK,oBAAoB;EAEhE,KAAK,eAAe,WAAW;GAC7B,MAAM,OAAO,KAAK,YAAY,cAAc,mBAAmB;GAC/D,IAAI;QACe,KAAK,iBAAiB,EAAE,SAAS,KAAK,CAC5C,EAAE,SAAS,GAAG;KACvB,KAAK,WAAW;KAChB,KAAK,kBAAkB;IACzB;;GAGF,KAAK,gBAAgB;EACvB,CAAC;CACH;CAEA,QAAQ,mBAA+C;EACrD,IAAI,kBAAkB,IAAI,UAAU,KAAK,kBAAkB,IAAI,iBAAiB,GAC9E,KAAK,kBAAkB;CAE3B;CAEA,kBAAgC;EAM9B,MAAM,MAAM;GAJV,gBAAgB;IAAE,KAAK;IAAkB,MAAM;GAAe;GAC9D,cAAc;IAAE,KAAK;IAAkB,MAAM;GAAgB;GAC7D,eAAe;IAAE,KAAK;IAAe,MAAM;GAAgB;EAExC,EAAE,KAAK;EAC5B,KAAK,OAAO,MAAM,MAAM,IAAI;EAC5B,KAAK,OAAO,MAAM,OAAO,IAAI;EAC7B,KAAM,OAAO,MAAc,iBAAiB,KAAK;CACnD;CAEA,oBAAkC;EAEhC,MAAM,SADO,KAAK,YAAY,cAAc,mBAAmB,IAC3C,iBAAiB,EAAE,SAAS,KAAK,CAAC,KAAK,CAAC;EAC5D,KAAK,MAAM,MAAM,OAAO;GACtB,IAAI,cAAc,IAChB,GAAY,WAAW,KAAK;GAC9B,IAAI,qBAAqB,IACvB,GAAY,kBAAkB,KAAK;EACvC;CACF;CAEA,kBAA0B,GAAgB;EAExC,MAAM,WADO,EAAE,OACO,iBAAiB,EAAE,SAAS,KAAK,CAAC;EACxD,KAAK,WAAW,SAAS,SAAS;EAClC,KAAK,kBAAkB;CACzB;CAEA,yBAAiC,GAAgB;EAC/C,MAAM,OAAO,EAAE;EACf,KAAK,kBAAkB,KAAK,iBAAiB,EAAE,SAAS,KAAK,CAAC,EAAE,SAAS;CAC3E;CAEA,IAAI,SAAkB;EACpB,OAAO,KAAK;CACd;CAEA,WAAiB;EACf,KAAK,UAAU;CACjB;CAEA,YAAkB;EAChB,KAAK,WAAW;CAClB;CAEA,eAAqB;EACnB,KAAK,aAAa,MAAM;CAC1B;CAEA,YAA0B;EACxB,IAAI,KAAK,WAAW,CAAC,KAAK,QAAQ,SAChC;EACF,IAAI;GACF,KAAM,OAAe,YAAY,EAAE,QAAQ,KAAK,CAAC;GACjD,KAAK,UAAU;GACf,SAAS,iBAAiB,SAAS,KAAK,cAAc;GACtD,KAAK,cAAc,IAAI,YAAY,qBAAqB;IAAE,SAAS;IAAM,UAAU;GAAK,CAAC,CAAC;GAC1F,4BAA4B;IAC1B,KAAK,kBAAkB,GAAG,WAAW;GACvC,CAAC;EACH,SAAS,KAAK;GACZ,QAAQ,KAAK,uBAAuB,GAAG;EACzC;CACF;CAUA,aAA2B;EACzB,IAAI,CAAC,KAAK,SACR;EACF,IAAI,KAAK,QAAQ,SACf,IAAI;GACF,KAAM,OAAe,YAAY;EACnC,QAAQ,CAAe;EAEzB,KAAK,UAAU;EACf,SAAS,oBAAoB,SAAS,KAAK,cAAc;CAC3D;CAEA,oBAA4B,GAAgB;EAC1C,EAAE,gBAAgB;EAClB,IAAI,KAAK,SAAS;GAChB,KAAK,WAAW;GAChB,KAAK,aAAa,MAAM;EAC1B,OACE,KAAK,UAAU;CAEnB;CAEA,oBAA4B,GAAgB;EAC1C,IAAI,CAAC,KAAK,SAAS,EAAE,MAAc;OAC7B,KAAK,QAAQ,WAAW,KAAK,OAAO,aAAa,MAAM,GACzD,IAAI;IACF,KAAM,OAAe,YAAY;GACnC,QAAQ,CAER;;CAGN;CAEA,oBAA+E;EAI7E,SAHa,KAAK,YAAY,cAAc,mBAAmB,IACxC,iBAAiB,EAAE,SAAS,KAAK,CAAC,KAAK,CAAC,GACpC,MAAK,OAAM,GAAG,YAAY,qBACrC,KAAa;CAC/B;CAiBA,eAAuB,GAAsB;EAC3C,IAAI,KAAK,QAAQ,SACf,IAAI;GACF,KAAM,OAAe,YAAY;EACnC,QAAQ,CAER;EAEF,KAAK,cAAc,IAAI,YAAsC,gBAAgB;GAC3E,QAAQ,EAAE;GACV,SAAS;GACT,UAAU;EACZ,CAAC,CAAC;CACJ;CAEA,mBAA2B,GAAsB;EAC/C,IAAI,KAAK,QAAQ,SACf,IAAI;GACF,KAAM,OAAe,YAAY;EACnC,QAAQ,CAER;EAEF,KAAK,cAAc,IAAI,YAAsC,gBAAgB;GAC3E,QAAQ;IACN,SAAS,EAAE,OAAO;IAClB,OAAO,EAAE,OAAO;GAClB;GACA,SAAS;GACT,UAAU;EACZ,CAAC,CAAC;CACJ;CAEA,mBAA2B,GAAqB;EAC9C,IAAI,KAAK,SAAS,WAChB;EACF,EAAE,eAAe;EACjB,KAAK,OAAO,MAAM,MAAM,GAAG,EAAE,QAAQ;EACrC,KAAK,OAAO,MAAM,OAAO,GAAG,EAAE,QAAQ;EACtC,KAAK,OAAO,MAAM,WAAW;EAC7B,KAAM,OAAO,MAAc,iBAAiB;EAC5C,IAAI,KAAK,QAAQ,SACf,IAAI;GACF,KAAM,OAAe,YAAY;EACnC,QAAQ,CAER;CAEJ;;gBAEgB;GACd;GACA;GACA,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8DL;;CAEA,SAAS;EACP,MAAM,aAAa,KAAK,SAAS,cAAc,KAAK,YAAY,CAAC,KAAK;EACtE,OAAO,IAAI;;;iBAGE,KAAK,oBAAoB;uBACnB,KAAK,mBAAmB;;UAErC,aACE,IAAI,2CAA2C,KAAK,MAAM,aAC1D,KAAK;2CAC0B,KAAK,yBAAyB;;;;;kBAKvD,MAAa,EAAE,gBAAgB,EAAE;;0CAET,KAAK,kBAAkB;;;CAG/D;AACF;YAvUG,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,YAAA,WAAA,QAAA,KAAA,CAAA;YACzB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,YAAA,WAAA,SAAA,KAAA,CAAA;YACzB,SAAS,EAAE,WAAW,MAAM,CAAC,CAAA,GAAA,YAAA,WAAA,YAAA,KAAA,CAAA;YAC7B,SAAS,EAAE,WAAW,MAAM,CAAC,CAAA,GAAA,YAAA,WAAA,mBAAA,KAAA,CAAA;YAC7B,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,YAAA,WAAA,aAAA,KAAA,CAAA;YAEzB,MAAM,CAAA,GAAA,YAAA,WAAA,WAAA,KAAA,CAAA;YACN,MAAM,CAAA,GAAA,YAAA,WAAA,YAAA,KAAA,CAAA;YACN,MAAM,CAAA,GAAA,YAAA,WAAA,mBAAA,KAAA,CAAA;YAEN,MAAM,cAAc,CAAA,GAAA,YAAA,WAAA,eAAA,KAAA,CAAA;YACpB,MAAM,QAAQ,CAAA,GAAA,YAAA,WAAA,UAAA,KAAA,CAAA;yCAbhBC,kBAAc,mBAAmB,CAAA,GAAA,WAAA;;;ACH3B,IAAA,WAAA,MAAM,iBAAiB,WAAW;;;iBACD;qBAC+B;eACjC;kBACI;kBACuB;sBAK/B;uBAGO;;CAEvC,uBAA6B;EAC3B,MAAM,qBAAqB;EAC3B,IAAI,KAAK,eACP,aAAa,KAAK,aAAa;CAEnC;CAEA,oBAAkC;EAChC,MAAM,WAAW,KAAK,OAAO,iBAAiB,KAAK,CAAC;EACpD,KAAK,eAAe,SAAS,SAAS;CACxC;CAEA,oBAAkC;EAChC,IAAI,KAAK,YAAY,CAAC,KAAK,gBAAgB,CAAC,KAAK,gBAC/C;EACF,IAAI,KAAK,eACP,aAAa,KAAK,aAAa;EAEjC,KAAK,gBAAgB,OAAO,iBAAiB;GAC3C,KAAK,aAAa;EACpB,GAAG,GAAG;CACR;CAEA,oBAAkC;EAChC,IAAI,KAAK,eAAe;GACtB,aAAa,KAAK,aAAa;GAC/B,KAAK,gBAAgB;EACvB;EACA,KAAK,aAAa;CACpB;CAEA,eAA6B;EAC3B,IAAI,CAAC,KAAK,gBAAgB,SACxB;EACF,IAAI;GACF,KAAK,eAAe,YAAY;EAClC,SAAS,KAAK;GACZ,QAAQ,KAAK,uBAAuB,GAAG;EACzC;CACF;CAEA,eAA6B;EAC3B,IAAI,CAAC,KAAK,gBAAgB,SACxB;EACF,IAAI;GACF,KAAK,eAAe,YAAY;EAClC,SAAS,KAAK;GACZ,QAAQ,KAAK,uBAAuB,GAAG;EACzC;CACF;CAEA,cAA4B;EAC1B,IAAI,KAAK,UACP;EAEF,KAAK,cAAc,IAAI,YAAmC,WAAW;GACnE,QAAQ;IAAE,SAAS,KAAK;IAAS,MAAM,KAAK;GAAY;GACxD,SAAS;GACT,UAAU;EACZ,CAAC,CAAC;CACJ;CAEA,iBAAiC;EAC/B,IAAI,KAAK,OACP,OAAO,KAAK;EACd,IAAI,KAAK,YAAY,KAAK,SACxB,OAAO,KAAK,SAAS,IAAI,KAAK,OAAO,GAAG,SAAS;EAEnD,OAAO;CACT;CAEA,gBAAuC;EACrC,IAAI,KAAK,UACP,OAAO,KAAK;EACd,IAAI,KAAK,YAAY,KAAK,SACxB,OAAO,KAAK,SAAS,IAAI,KAAK,OAAO,GAAG,QAAQ;EAElD,OAAO;CACT;CAEA,WAAW,mBAA+C;EACxD,MAAM,WAAW,iBAAiB;EAClC,MAAM,eAAe,KAAK,cAAc;EACxC,IAAI,gBAAgB,CAAC,KAAK,UACxB,KAAK,aAAa,qBAAqB,EAAE;OACpC,IAAI,CAAC,gBAAgB,CAAC,KAAK,UAChC,KAAK,gBAAgB,mBAAmB;CAE5C;CAEA,QAAQ,mBAA+C;EACrD,MAAM,QAAQ,iBAAiB;CACjC;CAEA,eAAsC;EACpC,IAAI,CAAC,KAAK,mBAAmB,CAAC,KAAK,SACjC,OAAO;EAET,MAAM,WADY,KAAK,gBAAwB,cAAc,KAAK,CAAC,GAC1C,MAAM,MAAW,EAAE,cAAc,KAAK,OAAO;EACtE,IAAI,CAAC,SACH,OAAO;EACT,MAAM,OAAO,MAAM,KAAK,QAAQ,aAAa,CAAC,IAAI,OAC/C;GAAE,MAAM;GAAK,OAAO;GAAK,KAAK;GAAK,MAAM;EAAI,GAAG,MAAM,CAAC;EAC1D,MAAM,MAAM,QAAQ,KAAK,WAAW,IAAI,QAAQ,IAAI,YAAY,IAAI,QAAQ;EAC5E,OAAO,CAAC,GAAG,MAAM,GAAG,EAAE,KAAK,EAAE;CAC/B;;gBAEyB;GAAC;GAAgB;GAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgE/D;;CAED,SAAS;EACP,MAAM,WAAW,KAAK,aAAa;EACnC,MAAM,eAAe,KAAK,cAAc;EACxC,OAAO,IAAI;;sBAEO,KAAK,WAAW,aAAa,GAAG;iBACrC,KAAK,YAAY;sBACZ,KAAK,kBAAkB;sBACvB,KAAK,kBAAkB;oBACzB,KAAK,WAAW,KAAK,EAAE;;yBAElB,KAAK,eAAe,SAAS,QAAQ;yBACrC,KAAK,gBAAgB,QAAQ,eAAe,KAAK,MAAM;;kCAE9C,eAAe,IAAI,oBAAoB,aAAa,kBAAkB,KAAK;2CAClE,KAAK,eAAe,EAAE;UACvD,WAAW,IAAI,0BAA0B,SAAS,WAAW,KAAK;UAClE,KAAK,eAAe,IAAI,4EAA4E,KAAK;;0BAEzF,KAAK,kBAAkB;;CAE/C;AACF;YAjNG,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,SAAA,WAAA,WAAA,KAAA,CAAA;YACzB,SAAS;CAAE,MAAM;CAAQ,WAAW;AAAe,CAAC,CAAA,GAAA,SAAA,WAAA,eAAA,KAAA,CAAA;YACpD,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,SAAA,WAAA,SAAA,KAAA,CAAA;YACzB,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,GAAA,SAAA,WAAA,YAAA,KAAA,CAAA;YAC1B,SAAS;CAAE,MAAM;CAAQ,WAAW;AAAY,CAAC,CAAA,GAAA,SAAA,WAAA,YAAA,KAAA,CAAA;YACjD,SAAS,EAAE,WAAW,MAAM,CAAC,CAAA,GAAA,SAAA,WAAA,YAAA,KAAA,CAAA;YAC7B,SAAS,EAAE,WAAW,MAAM,CAAC,CAAA,GAAA,SAAA,WAAA,mBAAA,KAAA,CAAA;YAC7B,SAAS,EAAE,WAAW,MAAM,CAAC,CAAA,GAAA,SAAA,WAAA,kBAAA,KAAA,CAAA;YAE7B,MAAM,CAAA,GAAA,SAAA,WAAA,gBAAA,KAAA,CAAA;YACN,MAAM,MAAM,CAAA,GAAA,SAAA,WAAA,SAAA,KAAA,CAAA;uBAZdC,kBAAc,gBAAgB,CAAA,GAAA,QAAA"}
1
+ {"version":3,"file":"menu-item-NUKwJ4s5.js","names":["customElement","customElement","customElement"],"sources":["../src/menu/menu-container.ts","../src/menu/menu-trigger.ts","../src/menu/menu-item.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\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, { top: string; left: string }> = {\n 'bottom-start': { top: `anchor(bottom)`, left: `anchor(left)` },\n 'bottom-end': { top: `anchor(bottom)`, left: `anchor(right)` },\n 'right-start': { top: `anchor(top)`, left: `anchor(right)` },\n };\n const pos = placements[this.placement];\n this._popup.style.top = pos.top;\n this._popup.style.left = pos.left;\n (this._popup.style as any).positionAnchor = this._anchorName;\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 }\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(--space-s) var(--space-m);\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: 0;\n padding: 0;\n border: none;\n background: transparent;\n z-index: 100;\n position-try-fallbacks: flip-inline, flip-block, 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\">${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: rgba(0, 0, 0, 0.06);\n border: 1px solid var(--accent);\n color: inherit;\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"],"mappings":"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"}
package/dist/menu.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- import { i as MenuContainer, n as MenuTrigger, t as MenuItem } from "./menu-item-COx-Azgj.js";
2
- import { a as menuFromTree, c as MenuSeparator, d as MenuCheckItem, f as MenuBar, i as MenuFromTreeOptions, l as MenuSubTrigger, n as MenuRadioGroup, o as menuFromTreeToElements, r as MenuRadioItem, s as MenuHeader, u as MenuCommandController } from "./index-_RTQSKHi.js";
1
+ import { i as MenuContainer, n as MenuTrigger, t as MenuItem } from "./menu-item-DSyf9f_L.js";
2
+ import { a as menuFromTree, c as MenuSeparator, d as MenuCheckItem, f as MenuBar, i as MenuFromTreeOptions, l as MenuSubTrigger, n as MenuRadioGroup, o as menuFromTreeToElements, r as MenuRadioItem, s as MenuHeader, u as MenuCommandController } from "./index-DfEkTGvT.js";
3
3
  export { MenuBar, MenuCheckItem, MenuCommandController, MenuContainer, type MenuFromTreeOptions, MenuHeader, MenuItem, MenuRadioGroup, MenuRadioItem, MenuSeparator, MenuSubTrigger, MenuTrigger, menuFromTree, menuFromTreeToElements };
package/dist/menu.js CHANGED
@@ -1,3 +1,3 @@
1
- import { n as MenuTrigger, r as MenuContainer, t as MenuItem } from "./menu-item-BrIuORYD.js";
2
- import { a as menuFromTreeToElements, c as MenuSubTrigger, d as MenuBar, i as menuFromTree, l as MenuCommandController, n as MenuRadioGroup, o as MenuHeader, r as MenuRadioItem, s as MenuSeparator, u as MenuCheckItem } from "./menu-vjoiHZ13.js";
1
+ import { n as MenuTrigger, r as MenuContainer, t as MenuItem } from "./menu-item-NUKwJ4s5.js";
2
+ import { a as menuFromTreeToElements, c as MenuSubTrigger, d as MenuBar, i as menuFromTree, l as MenuCommandController, n as MenuRadioGroup, o as MenuHeader, r as MenuRadioItem, s as MenuSeparator, u as MenuCheckItem } from "./menu-g6yd7ddN.js";
3
3
  export { MenuBar, MenuCheckItem, MenuCommandController, MenuContainer, MenuHeader, MenuItem, MenuRadioGroup, MenuRadioItem, MenuSeparator, MenuSubTrigger, MenuTrigger, menuFromTree, menuFromTreeToElements };
package/dist/miller.d.ts CHANGED
@@ -1,7 +1,8 @@
1
- import { n as TraversableTree, t as TickledController } from "./tickled-controller-BjYCzGrU.js";
2
- import { C as TreeNode, S as TreeItem, a as TreeComponent, b as TreeFilterPredicate, c as TreeExpandEvent, d as TreeSearchHost, f as TreeSelectDetail, g as TreeDataModel, h as TreeTickleEvent, i as TreeCollapseEvent, l as TreeItemClickDetail, m as TreeTickleDetail, n as TreeActivateEvent, o as TreeComponentEventMap, p as TreeSelectEvent, r as TreeCollapseDetail, s as TreeExpandDetail, t as TreeActivateDetail, u as TreeItemClickEvent, v as LoadChildrenCallback, w as TreeSelectionFilter, y as TreeExclusivity } from "./tree-component-BaCSPWg1.js";
1
+ import { a as TreeItem, n as TreeExclusivity, o as TreeNode, r as TreeFilterPredicate, s as TreeSelectionFilter, t as LoadChildrenCallback } from "./types-DO3gt5vg.js";
2
+ import { a as TreeComponent, c as TreeExpandEvent, d as TreeSearchHost, f as TreeSelectDetail, g as TreeDataModel, h as TreeTickleEvent, i as TreeCollapseEvent, l as TreeItemClickDetail, m as TreeTickleDetail, n as TreeActivateEvent, o as TreeComponentEventMap, p as TreeSelectEvent, r as TreeCollapseDetail, s as TreeExpandDetail, t as TreeActivateDetail, u as TreeItemClickEvent } from "./tree-component-DCmmKZ4j.js";
3
+ import { t as TickledController } from "./tickled-controller-BF2Ea0DE.js";
3
4
  import { LitElement, PropertyValues, TemplateResult, nothing } from "lit";
4
-
5
+ import { TraversableTree } from "@ixfx/collections";
5
6
  //#region src/miller/types.d.ts
6
7
  type MillerSelectionMode = `implicit` | `standard` | `manual` | `checked` | `vscode`;
7
8
  type MillerConfig = {
@@ -9,7 +10,9 @@ type MillerConfig = {
9
10
  };
10
11
  /** Detail for the `header-click` event fired when a column header is clicked. */
11
12
  type MillerHeaderClickDetail = {
12
- /** Zero-based column index whose header was clicked. */depth: number; /** The header text (label of the column's parent node). */
13
+ /** Zero-based column index whose header was clicked. */
14
+ depth: number;
15
+ /** The header text (label of the column's parent node). */
13
16
  label: string;
14
17
  /**
15
18
  * Ancestry chain from the root node down to (and including) the node
@@ -259,7 +262,7 @@ declare global {
259
262
  interface HTMLElementTagNameMap {
260
263
  'ixfx-miller-list': MillerListElement;
261
264
  }
262
- } //# sourceMappingURL=miller-list.d.ts.map
265
+ }
263
266
  //#endregion
264
267
  //#region src/miller/miller-tree-controller.d.ts
265
268
  type MillerTreeControllerOptions<T> = {
@@ -1 +1 @@
1
- {"version":3,"file":"miller.d.ts","names":[],"sources":["../src/miller/types.ts","../src/miller/miller-base.ts","../src/miller/miller-list.ts","../src/miller/miller-tree-controller.ts"],"mappings":"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"}
1
+ {"version":3,"file":"miller.d.ts","names":[],"sources":["../src/miller/types.ts","../src/miller/miller-base.ts","../src/miller/miller-list.ts","../src/miller/miller-tree-controller.ts"],"mappings":";;;;;;KAyBY;KAEA;EACV,cAAc;;;KAIJ;;EAEV;;EAEA;;;;;;;;EAQA,MAAM,MAZI;;;KAgBA;EACV,MADU;EAEV;;;KAIU;EACV,MADU;EAEV;EACA,YAAY;;;KAIF;EACV;EACA;EACA,MAAM,MAHI;EAIV,YAAY;;KAGF,yBAAyB,YAAY;KACrC,0BAA0B,YAAY;KACtC,4BAA4B,YAAY;KACxC,8BAA8B,YAAY;;;;;;;;;;KAW1C;EACV;EACA;EACA;EACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cCMW,0BAA0B,sBAAsB,eAAe;;EAE1E,MAAM;EAGN,OAAO;EAGP;;;;;;EAQA,iBAAiB;EAKjB,iBAAiB;EAGjB,aAAa;;;;;;EAQb,cAAc;EAGd,iBAAiB;YAGP,UAAU;YAIV;YAGA,kBAAgB,YAAA;YAGhB,eAAe;YAIf,gBAAc,IAAA;EA2BxB,SAAO;EA+BE,QAAQ,cAAc;EA8DtB;EAQT,aAAa;EAQb,UAAU,QAAQ;;MASd,gBAAgB;;MAKhB,aAAa,MAAM;;MAQnB,gBAAgB;MAIhB,aAAa,MAAM;;MAWnB,iBAAiB,YAAY;;EAOjC,OAAO,MAAM;;EAYb,SAAS,MAAM;;;;EAgBf;;;;;EAeA,YAAY,MAAM,UAAY;;;;;EAmB9B,eAAe;;;;EAcf,WAAW;;;;EAsDX,eAAe,YAAY,MAAM;EASjC,YAAY;IAAgB,MAAM;IAAY;;YAkCpC,oBAAoB,OAAO,YAAc,gBAAgB,wBAAwB;YAMjF,iBAAiB,MAAM,UAAY,eAAe,QAAQ;;;;YAO1D,qBAAqB,OAAO,YAAY,MAAM,UAAY;;;;YAQ1D,oBAAoB,MAAM,UAAY,eAAe,QAAQ;;;;YAW7D,sBAAsB,MAAM,UAAY,eAAe,OAAO;;;;YAW9D,wBAAwB,OAAO,YAAY;YAU3C,YAAY,MAAM,UAAY;YAY9B,QAAQ,MAAM,UAAY;;;;EAOpC,aAAa,aAAa,gBAAgB;;;;YA2nBhC,0BAA0B,wBAAwB;YAoBzC,UAAM;YAgCf,iBAAiB;YAQjB,WAAW,MAAM,UAAY;;;;;YAQ7B,wBAAwB,MAAM,UAAY;;;;YAY1C;SAIM,sBAAM;;QAiHhB;YACI;IACR,oBAAoB;;;UAIP,kCAAkC;EACjD,cAAc;EACd,UAAU;EACV,YAAY;EACZ,UAAU;EACV,UAAU;EACV,YAAY;EACZ,iBAAiB,YAAY;EAC7B,mBAAmB,YAAY;EAC/B,gBAAgB,YAAY;EAC5B,qBAAqB,YAAY;;UAGlB;EACf,oBAAoB,gBAAgB,2BAClC,MAAM,GACN,WAAW,MAAM,mBAAmB,OAAO,0BAA0B,aACrE,oBAAoB,sCAEpB,cACA,UAAU,oCACV,oBAAoB;EAEtB,uBAAuB,gBAAgB,2BACrC,MAAM,GACN,WAAW,MAAM,mBAAmB,OAAO,0BAA0B,aACrE,oBAAoB,mCAEpB,cACA,UAAU,oCACV,oBAAoB;;;;;;;;;;;;;;;;;;;;cCx2CX,0BAA0B;;YAClB,oBAAoB,OAAO,YAAc,gBAAgB;SA0D5D,sBAAM;;QAqFhB;YACI;IACR,oBAAoB;;;;;KCnMZ,4BAA4B;;;;;;;EAOtC,cAAc,OAAO,GAAG,MAAM,gBAAgB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;cA2B1C,qBAAqB;;EAa9B,YAAA,MAAM,gBAAgB,IACtB,SAAS,mBACT,SAAS,4BAA4B;;;;;EAavC;;EAoBA;;;;;;;;;;EAeA,gBAAgB,YAAY,OAAO"}
package/dist/miller.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import { n as tickledStyles, r as TickledController, t as tickledItemStyles } from "./tickled-styles-fNDdqf6l.js";
2
2
  import { t as themeFallbacks } from "./fallbacks-pNMOMx38.js";
3
- import { n as safeCustomElement, t as __decorate } from "./decorate-DdjvVHS-.js";
3
+ import { n as safeCustomElement, t as __decorate } from "./decorate-VRK8rslU.js";
4
4
  import "./interaction-D6efrBLo.js";
5
- import { t as collectDataResult } from "./data-provider-DgI909FP.js";
5
+ import { t as collectDataResult } from "./data-provider-35TyWclX.js";
6
6
  import { LitElement, css, html, nothing } from "lit";
7
7
  import { property, state } from "lit/decorators.js";
8
8
  //#region src/miller/miller-base.ts
@@ -163,19 +163,20 @@ let MillerBaseElement = class MillerBaseElement extends LitElement {
163
163
  const tickled = this.#getTickledNodeAndDepth();
164
164
  if (!tickled) return;
165
165
  const { node, depth, index } = tickled;
166
- if (this.interactionMode === `standard` || this.interactionMode === `vscode`) if (event.shiftKey && this.#anchor?.depth === depth) {
167
- const from = Math.min(this.#anchor.index, index);
168
- const to = Math.max(this.#anchor.index, index);
169
- this._selectedKeys = new Set(col.slice(from, to + 1).map((n) => n.item.key));
170
- } else {
171
- this._selectedKeys.add(node.item.key);
172
- this.#anchor = {
173
- key: node.item.key,
174
- depth,
175
- index
176
- };
177
- }
178
- else this._selectedByDepth.set(depth, node);
166
+ if (this.interactionMode === `standard` || this.interactionMode === `vscode`) {
167
+ if (event.shiftKey && this.#anchor?.depth === depth) {
168
+ const from = Math.min(this.#anchor.index, index);
169
+ const to = Math.max(this.#anchor.index, index);
170
+ this._selectedKeys = new Set(col.slice(from, to + 1).map((n) => n.item.key));
171
+ } else {
172
+ this._selectedKeys.add(node.item.key);
173
+ this.#anchor = {
174
+ key: node.item.key,
175
+ depth,
176
+ index
177
+ };
178
+ }
179
+ } else this._selectedByDepth.set(depth, node);
179
180
  this.dispatchEvent(new CustomEvent(`activate`, {
180
181
  detail: {
181
182
  node,
@@ -201,7 +202,6 @@ let MillerBaseElement = class MillerBaseElement extends LitElement {
201
202
  }
202
203
  this.requestUpdate();
203
204
  }
204
- break;
205
205
  }
206
206
  };
207
207
  this.#onResizeStart = (event, depth) => {
@@ -330,7 +330,7 @@ let MillerBaseElement = class MillerBaseElement extends LitElement {
330
330
  set selectedNode(node) {
331
331
  this.#lastSelectedNode = node;
332
332
  if (node) {
333
- if (this.interactionMode === `implicit` || this.interactionMode === `standard`) this._selectedKeys = new Set([node.item.key]);
333
+ if (this.interactionMode === `implicit` || this.interactionMode === `standard`) this._selectedKeys = /* @__PURE__ */ new Set([node.item.key]);
334
334
  }
335
335
  this.requestUpdate();
336
336
  }
@@ -427,7 +427,7 @@ let MillerBaseElement = class MillerBaseElement extends LitElement {
427
427
  if (lastNode) this.tickled.setTickled(this.#buildTickledId(lastNode, lastDepth));
428
428
  if (this.interactionMode !== `implicit` && this.interactionMode !== `manual`) {
429
429
  const leafKey = keys.at(-1);
430
- if (leafKey) this._selectedKeys = new Set([leafKey]);
430
+ if (leafKey) this._selectedKeys = /* @__PURE__ */ new Set([leafKey]);
431
431
  }
432
432
  this.requestUpdate();
433
433
  this.#scrollNavigatedItemIntoView();
@@ -632,16 +632,14 @@ let MillerBaseElement = class MillerBaseElement extends LitElement {
632
632
  this.#handleStandardClick(node, depth, event);
633
633
  break;
634
634
  case `manual`: break;
635
- case `checked`:
636
- this.#expandNode(node, depth);
637
- break;
635
+ case `checked`: this.#expandNode(node, depth);
638
636
  }
639
637
  }
640
638
  #handleImplicitClick(node, depth) {
641
639
  const previous = new Set(this._selectedNodes);
642
640
  this._selectedByDepth.set(depth, node);
643
641
  this.#lastSelectedNode = node;
644
- this._selectedKeys = new Set([node.item.key]);
642
+ this._selectedKeys = /* @__PURE__ */ new Set([node.item.key]);
645
643
  this._selectedNodes.clear();
646
644
  this._selectedNodes.add(node);
647
645
  this.#expandNode(node, depth);
@@ -678,8 +676,8 @@ let MillerBaseElement = class MillerBaseElement extends LitElement {
678
676
  return;
679
677
  }
680
678
  const previous = new Set(this._selectedNodes);
681
- this._selectedKeys = new Set([node.item.key]);
682
- this._selectedNodes = new Set([node]);
679
+ this._selectedKeys = /* @__PURE__ */ new Set([node.item.key]);
680
+ this._selectedNodes = /* @__PURE__ */ new Set([node]);
683
681
  this.#anchor = index >= 0 ? {
684
682
  key: node.item.key,
685
683
  depth,