@ixfx/components 0.2.3 → 0.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (291) hide show
  1. package/LICENSE +1 -1
  2. package/bundle/chunk-pbuEa-1d.js +13 -0
  3. package/bundle/index.d.ts +4702 -569
  4. package/bundle/index.d.ts.map +1 -1
  5. package/bundle/index.js +34929 -2800
  6. package/bundle/index.js.map +1 -1
  7. package/bundle/style.css +133 -0
  8. package/dist/ac-text.d.ts +97 -0
  9. package/dist/ac-text.d.ts.map +1 -0
  10. package/dist/ac-text.js +484 -0
  11. package/dist/ac-text.js.map +1 -0
  12. package/dist/button-DgKUzE5o.js +121 -0
  13. package/dist/button-DgKUzE5o.js.map +1 -0
  14. package/dist/button.d.ts +21 -0
  15. package/dist/button.d.ts.map +1 -0
  16. package/dist/button.js +3 -0
  17. package/dist/checkbox.d.ts +34 -0
  18. package/dist/checkbox.d.ts.map +1 -0
  19. package/dist/checkbox.js +251 -0
  20. package/dist/checkbox.js.map +1 -0
  21. package/dist/chunk-pbuEa-1d.js +13 -0
  22. package/dist/colour-C3MQIjFJ-BJV-QC-3.js +4138 -0
  23. package/dist/colour-C3MQIjFJ-BJV-QC-3.js.map +1 -0
  24. package/dist/colour-picker-Bw-AZoWx.js +922 -0
  25. package/dist/colour-picker-Bw-AZoWx.js.map +1 -0
  26. package/dist/colour-picker.d.ts +2 -0
  27. package/dist/colour-picker.js +2 -0
  28. package/dist/crumbs.d.ts +92 -0
  29. package/dist/crumbs.d.ts.map +1 -0
  30. package/dist/crumbs.js +789 -0
  31. package/dist/crumbs.js.map +1 -0
  32. package/dist/data-display.d.ts +24 -12
  33. package/dist/data-display.d.ts.map +1 -1
  34. package/dist/data-display.js +96 -105
  35. package/dist/data-display.js.map +1 -1
  36. package/dist/decorate-BZbkqIhA.js +9 -0
  37. package/dist/defaults-FEZaGiYZ.js +38 -0
  38. package/dist/defaults-FEZaGiYZ.js.map +1 -0
  39. package/dist/dist-By5URG0Y.js +1290 -0
  40. package/dist/dist-By5URG0Y.js.map +1 -0
  41. package/dist/dist-D7kJgnSE.js +1039 -0
  42. package/dist/dist-D7kJgnSE.js.map +1 -0
  43. package/dist/editable-label.d.ts +71 -0
  44. package/dist/editable-label.d.ts.map +1 -0
  45. package/dist/editable-label.js +279 -0
  46. package/dist/editable-label.js.map +1 -0
  47. package/dist/hex-editor-Gib1Grg2.d.ts +131 -0
  48. package/dist/hex-editor-Gib1Grg2.d.ts.map +1 -0
  49. package/dist/hex-editor-Wd6ZtZA2.js +1147 -0
  50. package/dist/hex-editor-Wd6ZtZA2.js.map +1 -0
  51. package/dist/hex.d.ts +2 -0
  52. package/dist/hex.js +2 -0
  53. package/dist/highlight-CAjwQ4GE.js +50 -0
  54. package/dist/highlight-CAjwQ4GE.js.map +1 -0
  55. package/dist/icon-BR5aTIiP.js +100 -0
  56. package/dist/icon-BR5aTIiP.js.map +1 -0
  57. package/dist/icon-DQKdfR7U.d.ts +36 -0
  58. package/dist/icon-DQKdfR7U.d.ts.map +1 -0
  59. package/dist/icons.d.ts +3 -0
  60. package/dist/icons.js +9 -0
  61. package/dist/icons.js.map +1 -0
  62. package/dist/incr-search-BjCNClnC.js +311 -0
  63. package/dist/incr-search-BjCNClnC.js.map +1 -0
  64. package/dist/incr-search.d.ts +2 -0
  65. package/dist/incr-search.js +3 -0
  66. package/dist/index-B1hNR7Z9.d.ts +36 -0
  67. package/dist/index-B1hNR7Z9.d.ts.map +1 -0
  68. package/dist/index-C5dK8RZa.d.ts +23 -0
  69. package/dist/index-C5dK8RZa.d.ts.map +1 -0
  70. package/dist/index-C9iBN908.d.ts +160 -0
  71. package/dist/index-C9iBN908.d.ts.map +1 -0
  72. package/dist/index-CPVcTTXo.d.ts +396 -0
  73. package/dist/index-CPVcTTXo.d.ts.map +1 -0
  74. package/dist/index-CQxanqXF.d.ts +183 -0
  75. package/dist/index-CQxanqXF.d.ts.map +1 -0
  76. package/dist/index-CpbBI3n7.d.ts +1239 -0
  77. package/dist/index-CpbBI3n7.d.ts.map +1 -0
  78. package/dist/index.d.ts +422 -13
  79. package/dist/index.d.ts.map +1 -1
  80. package/dist/index.js +5729 -14
  81. package/dist/index.js.map +1 -1
  82. package/dist/interaction-CQDQJf2Q.js +1 -0
  83. package/dist/keyboard-De_vOHLg.js +20 -0
  84. package/dist/keyboard-De_vOHLg.js.map +1 -0
  85. package/dist/labelled-input-base-DS6-6C0r.js +155 -0
  86. package/dist/labelled-input-base-DS6-6C0r.js.map +1 -0
  87. package/dist/labelled-input-base-DnRh4reU.d.ts +43 -0
  88. package/dist/labelled-input-base-DnRh4reU.d.ts.map +1 -0
  89. package/dist/labelled-radial-input.d.ts +34 -0
  90. package/dist/labelled-radial-input.d.ts.map +1 -0
  91. package/dist/labelled-radial-input.js +188 -0
  92. package/dist/labelled-radial-input.js.map +1 -0
  93. package/dist/labelled-range-input.d.ts +2 -0
  94. package/dist/labelled-range-input.js +132 -0
  95. package/dist/labelled-range-input.js.map +1 -0
  96. package/dist/led.d.ts +25 -0
  97. package/dist/led.d.ts.map +1 -0
  98. package/dist/led.js +92 -0
  99. package/dist/led.js.map +1 -0
  100. package/dist/menu-BV6UFx_z.js +813 -0
  101. package/dist/menu-BV6UFx_z.js.map +1 -0
  102. package/dist/menu-item-Cikacp4F.d.ts +128 -0
  103. package/dist/menu-item-Cikacp4F.d.ts.map +1 -0
  104. package/dist/menu-item-DEzL_Yjk.js +766 -0
  105. package/dist/menu-item-DEzL_Yjk.js.map +1 -0
  106. package/dist/menu.d.ts +3 -0
  107. package/dist/menu.js +3 -0
  108. package/dist/miller.d.ts +324 -0
  109. package/dist/miller.d.ts.map +1 -0
  110. package/dist/miller.js +1343 -0
  111. package/dist/miller.js.map +1 -0
  112. package/dist/narrowed-text.d.ts +72 -0
  113. package/dist/narrowed-text.d.ts.map +1 -0
  114. package/dist/narrowed-text.js +571 -0
  115. package/dist/narrowed-text.js.map +1 -0
  116. package/dist/panel.d.ts +43 -0
  117. package/dist/panel.d.ts.map +1 -0
  118. package/dist/panel.js +408 -0
  119. package/dist/panel.js.map +1 -0
  120. package/dist/plots.d.ts +2 -0
  121. package/dist/plots.js +2 -0
  122. package/dist/polar-pad.d.ts +67 -0
  123. package/dist/polar-pad.d.ts.map +1 -0
  124. package/dist/polar-pad.js +537 -0
  125. package/dist/polar-pad.js.map +1 -0
  126. package/dist/popup-Ddx9LCzY.js +24 -0
  127. package/dist/popup-Ddx9LCzY.js.map +1 -0
  128. package/dist/prominence-CreDBdCs.js +98 -0
  129. package/dist/prominence-CreDBdCs.js.map +1 -0
  130. package/dist/radial-input-CNJ8asY2.js +849 -0
  131. package/dist/radial-input-CNJ8asY2.js.map +1 -0
  132. package/dist/radial-input-xSTd4kEz.d.ts +70 -0
  133. package/dist/radial-input-xSTd4kEz.d.ts.map +1 -0
  134. package/dist/radial-input.d.ts +2 -0
  135. package/dist/radial-input.js +2 -0
  136. package/dist/range-input.d.ts +43 -0
  137. package/dist/range-input.d.ts.map +1 -0
  138. package/dist/range-input.js +459 -0
  139. package/dist/range-input.js.map +1 -0
  140. package/dist/range.d.ts +28 -0
  141. package/dist/range.d.ts.map +1 -0
  142. package/dist/range.js +136 -0
  143. package/dist/range.js.map +1 -0
  144. package/dist/registry-CZEB1YI9.js +21 -0
  145. package/dist/registry-CZEB1YI9.js.map +1 -0
  146. package/dist/selecthorizontal.d.ts +13 -8
  147. package/dist/selecthorizontal.d.ts.map +1 -1
  148. package/dist/selecthorizontal.js +21 -25
  149. package/dist/selecthorizontal.js.map +1 -1
  150. package/dist/snap-container.d.ts +50 -0
  151. package/dist/snap-container.d.ts.map +1 -0
  152. package/dist/snap-container.js +297 -0
  153. package/dist/snap-container.js.map +1 -0
  154. package/dist/split-layout.d.ts +56 -0
  155. package/dist/split-layout.d.ts.map +1 -0
  156. package/dist/split-layout.js +545 -0
  157. package/dist/split-layout.js.map +1 -0
  158. package/dist/style.css +133 -0
  159. package/dist/swipe.d.ts +48 -0
  160. package/dist/swipe.d.ts.map +1 -0
  161. package/dist/swipe.js +204 -0
  162. package/dist/swipe.js.map +1 -0
  163. package/dist/tab-list-CFF7uSYH.d.ts +66 -0
  164. package/dist/tab-list-CFF7uSYH.d.ts.map +1 -0
  165. package/dist/tabs.d.ts +2 -0
  166. package/dist/tabs.js +203 -0
  167. package/dist/tabs.js.map +1 -0
  168. package/dist/tickled-controller-Cq1Va0rR.d.ts +218 -0
  169. package/dist/tickled-controller-Cq1Va0rR.d.ts.map +1 -0
  170. package/dist/tickled-styles-Bg3QbcrD.js +327 -0
  171. package/dist/tickled-styles-Bg3QbcrD.js.map +1 -0
  172. package/dist/timeline-DBWJsSjd.js +1748 -0
  173. package/dist/timeline-DBWJsSjd.js.map +1 -0
  174. package/dist/timeline.d.ts +2 -0
  175. package/dist/timeline.js +2 -0
  176. package/dist/tooltip-DMxmBNky.js +104 -0
  177. package/dist/tooltip-DMxmBNky.js.map +1 -0
  178. package/dist/tooltip-kfUBWYVB.d.ts +26 -0
  179. package/dist/tooltip-kfUBWYVB.d.ts.map +1 -0
  180. package/dist/tree-component-CQpoPo4s.d.ts +326 -0
  181. package/dist/tree-component-CQpoPo4s.d.ts.map +1 -0
  182. package/dist/tree-data-model-DGvRVOFY.js +190 -0
  183. package/dist/tree-data-model-DGvRVOFY.js.map +1 -0
  184. package/dist/tree.d.ts +100 -0
  185. package/dist/tree.d.ts.map +1 -0
  186. package/dist/tree.js +1144 -0
  187. package/dist/tree.js.map +1 -0
  188. package/dist/types-BKaqnpwx.d.ts +8 -0
  189. package/dist/types-BKaqnpwx.d.ts.map +1 -0
  190. package/dist/xy-axis-BANbgrI5.js +6243 -0
  191. package/dist/xy-axis-BANbgrI5.js.map +1 -0
  192. package/dist/xy-axis-CIFok7MF.d.ts +141 -0
  193. package/dist/xy-axis-CIFok7MF.d.ts.map +1 -0
  194. package/dist/xy-pad.d.ts +81 -0
  195. package/dist/xy-pad.d.ts.map +1 -0
  196. package/dist/xy-pad.js +435 -0
  197. package/dist/xy-pad.js.map +1 -0
  198. package/package.json +48 -39
  199. package/README.md +0 -14
  200. package/dist/charts/frequency-histogram-plot.d.ts +0 -33
  201. package/dist/charts/frequency-histogram-plot.d.ts.map +0 -1
  202. package/dist/charts/frequency-histogram-plot.js +0 -54
  203. package/dist/charts/frequency-histogram-plot.js.map +0 -1
  204. package/dist/charts/histogram-vis.d.ts +0 -57
  205. package/dist/charts/histogram-vis.d.ts.map +0 -1
  206. package/dist/charts/histogram-vis.js +0 -222
  207. package/dist/charts/histogram-vis.js.map +0 -1
  208. package/dist/charts/plot.d.ts +0 -199
  209. package/dist/charts/plot.d.ts.map +0 -1
  210. package/dist/charts/plot.js +0 -914
  211. package/dist/charts/plot.js.map +0 -1
  212. package/dist/crumb-nav.d.ts +0 -41
  213. package/dist/crumb-nav.d.ts.map +0 -1
  214. package/dist/crumb-nav.js +0 -198
  215. package/dist/crumb-nav.js.map +0 -1
  216. package/dist/crumb-navigation.d.ts +0 -30
  217. package/dist/crumb-navigation.d.ts.map +0 -1
  218. package/dist/crumb-navigation.js +0 -307
  219. package/dist/crumb-navigation.js.map +0 -1
  220. package/dist/dial.d.ts +0 -89
  221. package/dist/dial.d.ts.map +0 -1
  222. package/dist/dial.js +0 -506
  223. package/dist/dial.js.map +0 -1
  224. package/dist/my-element.d.ts +0 -14
  225. package/dist/my-element.d.ts.map +0 -1
  226. package/dist/my-element.js +0 -44
  227. package/dist/my-element.js.map +0 -1
  228. package/dist/split-layout/split-layout.d.ts +0 -35
  229. package/dist/split-layout/split-layout.d.ts.map +0 -1
  230. package/dist/split-layout/split-layout.js +0 -220
  231. package/dist/split-layout/split-layout.js.map +0 -1
  232. package/dist/svg-edit-label.d.ts +0 -2
  233. package/dist/svg-edit-label.d.ts.map +0 -1
  234. package/dist/svg-edit-label.js +0 -110
  235. package/dist/svg-edit-label.js.map +0 -1
  236. package/dist/tabs/tab-layout-item.d.ts +0 -10
  237. package/dist/tabs/tab-layout-item.d.ts.map +0 -1
  238. package/dist/tabs/tab-layout-item.js +0 -20
  239. package/dist/tabs/tab-layout-item.js.map +0 -1
  240. package/dist/tabs/tab-layout.d.ts +0 -10
  241. package/dist/tabs/tab-layout.d.ts.map +0 -1
  242. package/dist/tabs/tab-layout.js +0 -25
  243. package/dist/tabs/tab-layout.js.map +0 -1
  244. package/dist/tabs/tab-list-item.d.ts +0 -18
  245. package/dist/tabs/tab-list-item.d.ts.map +0 -1
  246. package/dist/tabs/tab-list-item.js +0 -63
  247. package/dist/tabs/tab-list-item.js.map +0 -1
  248. package/dist/tabs/tab-list.d.ts +0 -21
  249. package/dist/tabs/tab-list.d.ts.map +0 -1
  250. package/dist/tabs/tab-list.js +0 -148
  251. package/dist/tabs/tab-list.js.map +0 -1
  252. package/dist/tabs/tab-panel.d.ts +0 -11
  253. package/dist/tabs/tab-panel.d.ts.map +0 -1
  254. package/dist/tabs/tab-panel.js +0 -30
  255. package/dist/tabs/tab-panel.js.map +0 -1
  256. package/dist/tabs/tab-panels.d.ts +0 -30
  257. package/dist/tabs/tab-panels.d.ts.map +0 -1
  258. package/dist/tabs/tab-panels.js +0 -80
  259. package/dist/tabs/tab-panels.js.map +0 -1
  260. package/dist/util/circle-arc.d.ts +0 -34
  261. package/dist/util/circle-arc.d.ts.map +0 -1
  262. package/dist/util/circle-arc.js +0 -77
  263. package/dist/util/circle-arc.js.map +0 -1
  264. package/dist/util/compare.d.ts +0 -53
  265. package/dist/util/compare.d.ts.map +0 -1
  266. package/dist/util/compare.js +0 -91
  267. package/dist/util/compare.js.map +0 -1
  268. package/dist/util/content-editable.d.ts +0 -2
  269. package/dist/util/content-editable.d.ts.map +0 -1
  270. package/dist/util/content-editable.js +0 -13
  271. package/dist/util/content-editable.js.map +0 -1
  272. package/dist/util/drag-controller.d.ts +0 -13
  273. package/dist/util/drag-controller.d.ts.map +0 -1
  274. package/dist/util/drag-controller.js +0 -21
  275. package/dist/util/drag-controller.js.map +0 -1
  276. package/dist/util/key-value.d.ts +0 -5
  277. package/dist/util/key-value.d.ts.map +0 -1
  278. package/dist/util/key-value.js +0 -30
  279. package/dist/util/key-value.js.map +0 -1
  280. package/dist/util/primitive-types.d.ts +0 -6
  281. package/dist/util/primitive-types.d.ts.map +0 -1
  282. package/dist/util/primitive-types.js +0 -2
  283. package/dist/util/primitive-types.js.map +0 -1
  284. package/dist/util/svg-editable-text.d.ts +0 -22
  285. package/dist/util/svg-editable-text.d.ts.map +0 -1
  286. package/dist/util/svg-editable-text.js +0 -121
  287. package/dist/util/svg-editable-text.js.map +0 -1
  288. package/dist/util/time.d.ts +0 -2
  289. package/dist/util/time.d.ts.map +0 -1
  290. package/dist/util/time.js +0 -2
  291. package/dist/util/time.js.map +0 -1
@@ -0,0 +1,766 @@
1
+ import { n as tickledStyles, r as TickledController, t as tickledItemStyles } from "./tickled-styles-Bg3QbcrD.js";
2
+ import { t as __decorate } from "./decorate-BZbkqIhA.js";
3
+ import "./icon-BR5aTIiP.js";
4
+ import { t as popupSurfaceStyles } from "./popup-Ddx9LCzY.js";
5
+ import "./interaction-CQDQJf2Q.js";
6
+ import { LitElement, css, html } from "lit";
7
+ import { customElement, property, query, state } from "lit/decorators.js";
8
+ //#region src/menu/menu-container.ts
9
+ let MenuContainer = class MenuContainer extends LitElement {
10
+ constructor(..._args) {
11
+ super(..._args);
12
+ this.tickled = new TickledController(this, {
13
+ getItems: () => {
14
+ return this._getMenuItems().map((item, i) => ({
15
+ id: i,
16
+ enabled: !item.hasAttribute("disabled")
17
+ }));
18
+ },
19
+ onTickle: (index) => {
20
+ const items = this._getMenuItems();
21
+ if (index !== void 0) {
22
+ const item = items[index];
23
+ item.tabIndex = 0;
24
+ item.focus({ preventScroll: true });
25
+ }
26
+ },
27
+ onStateChange: () => {
28
+ this._syncTickledClasses();
29
+ }
30
+ });
31
+ this._handleMouseOver = (e) => {
32
+ const items = this._getMenuItems();
33
+ const path = e.composedPath();
34
+ const hoveredIndex = items.findIndex((item) => path.includes(item));
35
+ if (hoveredIndex !== -1) {
36
+ const item = items[hoveredIndex];
37
+ const itemPathIndex = path.indexOf(item);
38
+ if (!path.slice(0, itemPathIndex).some((node) => node instanceof Element && node.tagName === `IXFX-MENU-CONTAINER`)) this.tickled.handlePointerEnter(hoveredIndex);
39
+ e.stopPropagation();
40
+ }
41
+ };
42
+ this._handleKeydown = (e) => {
43
+ const items = this._getMenuItems();
44
+ if (items.length === 0) return;
45
+ switch (e.key) {
46
+ case `ArrowDown`:
47
+ e.preventDefault();
48
+ e.stopPropagation();
49
+ this._focusNext(items, 1);
50
+ break;
51
+ case `ArrowUp`:
52
+ e.preventDefault();
53
+ e.stopPropagation();
54
+ this._focusNext(items, -1);
55
+ break;
56
+ case `Home`:
57
+ e.preventDefault();
58
+ e.stopPropagation();
59
+ this._focusItem(items, 0);
60
+ break;
61
+ case `End`:
62
+ e.preventDefault();
63
+ e.stopPropagation();
64
+ this._focusItem(items, items.length - 1);
65
+ break;
66
+ case `Enter`:
67
+ case ` `:
68
+ e.preventDefault();
69
+ e.stopPropagation();
70
+ this._activateFocusedItem(items);
71
+ break;
72
+ }
73
+ };
74
+ }
75
+ static {
76
+ this.styles = [
77
+ popupSurfaceStyles,
78
+ tickledStyles,
79
+ css`
80
+ :host {
81
+ display: block;
82
+ }
83
+
84
+ .popover {
85
+ padding: var(--space-xs) 0;
86
+ min-width: 160px;
87
+ }
88
+
89
+ :host {
90
+ opacity: 1;
91
+ transform: translateY(0) scale(1);
92
+ transition: opacity 0.12s ease-out, transform 0.12s ease-out,
93
+ display 0.12s allow-discrete, overlay 0.12s allow-discrete;
94
+ }
95
+
96
+ @starting-style :host {
97
+ opacity: 0;
98
+ transform: translateY(-4px) scale(0.97);
99
+ }
100
+
101
+ ::slotted(menu-separator) {
102
+ display: block;
103
+ margin: var(--space-xs) 0;
104
+ }
105
+ `
106
+ ];
107
+ }
108
+ _updateIconSections() {
109
+ const slot = this.shadowRoot?.querySelector(`slot`);
110
+ if (!slot) return;
111
+ const assigned = slot.assignedElements({ flatten: true });
112
+ const sections = [];
113
+ let section = [];
114
+ for (const el of assigned) if (el.tagName === `IXFX-MENU-SEPARATOR` || el.tagName === `IXFX-MENU-HEADER`) {
115
+ if (section.length > 0) {
116
+ sections.push(section);
117
+ section = [];
118
+ }
119
+ } else section.push(el);
120
+ if (section.length > 0) sections.push(section);
121
+ this._propagateContext();
122
+ for (const sec of sections) {
123
+ const hasIcon = sec.some((el) => {
124
+ if (el.tagName === `IXFX-MENU-RADIO-GROUP`) return [...el.children].some((ri) => ri.hasAttribute(`icon-name`));
125
+ return el.hasAttribute(`icon-name`);
126
+ });
127
+ for (const el of sec) if (el.tagName === `IXFX-MENU-RADIO-GROUP`) for (const ri of el.children) if (hasIcon) ri.setAttribute(`data-icon-section`, ``);
128
+ else ri.removeAttribute(`data-icon-section`);
129
+ else if (hasIcon) el.setAttribute(`data-icon-section`, ``);
130
+ else el.removeAttribute(`data-icon-section`);
131
+ }
132
+ this.performUpdate();
133
+ }
134
+ _propagateContext() {
135
+ const slot = this.shadowRoot?.querySelector(`slot`);
136
+ if (!slot) return;
137
+ for (const el of slot.assignedElements({ flatten: true })) {
138
+ if (`registry` in el) el.registry = this.registry;
139
+ if (`keyboardManager` in el) el.keyboardManager = this.keyboardManager;
140
+ }
141
+ }
142
+ updated(changedProperties) {
143
+ if (changedProperties.has(`registry`) || changedProperties.has(`keyboardManager`)) this._propagateContext();
144
+ }
145
+ /**
146
+ * Sync data-input-mode to :host so CSS variables cascade to slotted items
147
+ */
148
+ willUpdate(changed) {
149
+ super.willUpdate(changed);
150
+ this.setAttribute("data-input-mode", this.tickled.inputMode);
151
+ }
152
+ render() {
153
+ return html`
154
+ <div
155
+ class="popover popup-surface"
156
+ role="menu"
157
+ @keydown=${this._handleKeydown}
158
+ @mouseover=${this._handleMouseOver}
159
+ >
160
+ <slot @slotchange=${this._updateIconSections}></slot>
161
+ </div>
162
+ `;
163
+ }
164
+ _getMenuItems() {
165
+ const slot = this.shadowRoot?.querySelector(`slot`);
166
+ if (!slot) return [];
167
+ const skipTags = [`IXFX-MENU-SEPARATOR`, `IXFX-MENU-HEADER`];
168
+ const result = [];
169
+ for (const el of slot.assignedElements({ flatten: true })) {
170
+ if (skipTags.includes(el.tagName)) continue;
171
+ if (el.hasAttribute(`disabled`)) continue;
172
+ const role = el.getAttribute(`role`);
173
+ if (role === `none` || role === `presentation`) continue;
174
+ if (el.tagName === `IXFX-MENU-RADIO-GROUP`) {
175
+ const groupSlot = el.shadowRoot?.querySelector(`slot`);
176
+ for (const radioItem of groupSlot?.assignedElements({ flatten: true }) ?? []) if (!radioItem.hasAttribute(`disabled`)) result.push(radioItem);
177
+ } else result.push(el);
178
+ }
179
+ return result;
180
+ }
181
+ /**
182
+ * Sync .tickled class on slotted items to match controller state
183
+ * This is called via onStateChange whenever the tickled state changes
184
+ */
185
+ _syncTickledClasses() {
186
+ const items = this._getMenuItems();
187
+ items.forEach((item, i) => {
188
+ if (this.tickled.isTickled(i)) {
189
+ item.classList.add(`tickled`);
190
+ item.tabIndex = 0;
191
+ const innerItem = item.shadowRoot?.querySelector(`.item`);
192
+ if (innerItem) {
193
+ innerItem.style.background = `rgba(0, 0, 0, 0.06)`;
194
+ innerItem.style.borderColor = `var(--accent)`;
195
+ innerItem.style.color = `inherit`;
196
+ }
197
+ } else {
198
+ item.classList.remove(`tickled`);
199
+ item.tabIndex = -1;
200
+ const innerItem = item.shadowRoot?.querySelector(`.item`);
201
+ if (innerItem) {
202
+ innerItem.style.background = ``;
203
+ innerItem.style.borderColor = ``;
204
+ innerItem.style.color = ``;
205
+ }
206
+ }
207
+ });
208
+ if (this.tickled.inputMode === "keyboard" && this.tickled.tickledId !== void 0) items[this.tickled.tickledId]?.focus();
209
+ }
210
+ focusFirst() {
211
+ this.tickled.handleKeyboardNavigation("first");
212
+ }
213
+ _focusNext(items, direction) {
214
+ if (items.length === 0) return;
215
+ this.tickled.handleKeyboardNavigation(direction > 0 ? "next" : "previous");
216
+ }
217
+ _focusItem(items, index) {
218
+ if (items.length === 0) return;
219
+ const clampedIndex = Math.max(0, Math.min(index, items.length - 1));
220
+ this.tickled.handleKeyboardNavigation(clampedIndex);
221
+ }
222
+ _activateFocusedItem(items) {
223
+ const tickledIndex = this.tickled.tickledId;
224
+ if (tickledIndex === void 0) return;
225
+ const item = items[tickledIndex];
226
+ if (!item) return;
227
+ const tagName = item.tagName;
228
+ if (tagName === `IXFX-MENU-SUB-TRIGGER`) return;
229
+ if (tagName === `IXFX-MENU-CHECK-ITEM`) {
230
+ const checkItem = item;
231
+ checkItem.checked = !checkItem.checked;
232
+ checkItem.dispatchEvent(new CustomEvent(`command`, {
233
+ detail: {
234
+ command: checkItem.command,
235
+ checked: checkItem.checked
236
+ },
237
+ bubbles: true,
238
+ composed: true
239
+ }));
240
+ return;
241
+ }
242
+ if (tagName === `IXFX-MENU-RADIO-ITEM`) {
243
+ item.dispatchEvent(new CustomEvent(`radio-select`, {
244
+ detail: { value: item.value },
245
+ bubbles: true,
246
+ composed: true
247
+ }));
248
+ return;
249
+ }
250
+ if (tagName === `IXFX-MENU-ITEM`) {
251
+ const command = item.command;
252
+ if (command) item.dispatchEvent(new CustomEvent(`command`, {
253
+ detail: { command },
254
+ bubbles: true,
255
+ composed: true
256
+ }));
257
+ return;
258
+ }
259
+ item.click();
260
+ }
261
+ };
262
+ __decorate([property({
263
+ type: String,
264
+ attribute: `anchor`
265
+ })], MenuContainer.prototype, "anchor", void 0);
266
+ __decorate([property({ attribute: false })], MenuContainer.prototype, "registry", void 0);
267
+ __decorate([property({ attribute: false })], MenuContainer.prototype, "keyboardManager", void 0);
268
+ __decorate([query(`.popover`)], MenuContainer.prototype, "_popover", void 0);
269
+ MenuContainer = __decorate([customElement(`ixfx-menu-container`)], MenuContainer);
270
+ //#endregion
271
+ //#region src/menu/menu-trigger.ts
272
+ var _MenuTrigger;
273
+ let MenuTrigger = class MenuTrigger extends LitElement {
274
+ static {
275
+ _MenuTrigger = this;
276
+ }
277
+ constructor(..._args) {
278
+ super(..._args);
279
+ this.mode = `trigger`;
280
+ this.label = `⋮`;
281
+ this.placement = `bottom-start`;
282
+ this._isOpen = false;
283
+ this._hasMenu = false;
284
+ this._hasTriggerSlot = false;
285
+ this._anchorName = `--mt-${_MenuTrigger._count++}`;
286
+ this._clickListener = this._handleClickOutside.bind(this);
287
+ this._handlePopoverToggle = (e) => {
288
+ if (e.newState === `closed`) {
289
+ this._isOpen = false;
290
+ document.removeEventListener(`click`, this._clickListener);
291
+ this.dispatchEvent(new CustomEvent(`menu-trigger-close`, {
292
+ bubbles: true,
293
+ composed: true
294
+ }));
295
+ }
296
+ };
297
+ this._handleKeydown = (e) => {
298
+ if (!this._isOpen) return;
299
+ if (e.key === `Escape`) {
300
+ e.preventDefault();
301
+ e.stopPropagation();
302
+ this._closeMenu();
303
+ this._triggerBtn?.focus();
304
+ } else if (e.key === `Tab`) {
305
+ this._closeMenu();
306
+ this._triggerBtn?.focus();
307
+ }
308
+ };
309
+ }
310
+ static {
311
+ this._count = 0;
312
+ }
313
+ connectedCallback() {
314
+ super.connectedCallback();
315
+ document.addEventListener(`keydown`, this._handleKeydown);
316
+ this.addEventListener(`command`, this._handleCommand);
317
+ this.addEventListener(`radio-change`, this._handleRadioChange);
318
+ }
319
+ disconnectedCallback() {
320
+ super.disconnectedCallback();
321
+ document.removeEventListener(`keydown`, this._handleKeydown);
322
+ this.removeEventListener(`command`, this._handleCommand);
323
+ this.removeEventListener(`radio-change`, this._handleRadioChange);
324
+ document.removeEventListener(`click`, this._clickListener);
325
+ }
326
+ firstUpdated() {
327
+ this.style.setProperty(`--anchor-name`, this._anchorName);
328
+ this._popup.addEventListener(`toggle`, this._handlePopoverToggle);
329
+ this.updateComplete.then(() => {
330
+ const slot = this.shadowRoot?.querySelector(`slot[name="menu"]`);
331
+ if (slot) {
332
+ if (slot.assignedElements({ flatten: true }).length > 0) {
333
+ this._hasMenu = true;
334
+ this._propagateContext();
335
+ }
336
+ }
337
+ this._updatePosition();
338
+ });
339
+ }
340
+ updated(changedProperties) {
341
+ if (changedProperties.has(`registry`) || changedProperties.has(`keyboardManager`)) this._propagateContext();
342
+ }
343
+ _updatePosition() {
344
+ const pos = {
345
+ "bottom-start": {
346
+ top: `anchor(bottom)`,
347
+ left: `anchor(left)`
348
+ },
349
+ "bottom-end": {
350
+ top: `anchor(bottom)`,
351
+ left: `anchor(right)`
352
+ },
353
+ "right-start": {
354
+ top: `anchor(top)`,
355
+ left: `anchor(right)`
356
+ }
357
+ }[this.placement];
358
+ this._popup.style.top = pos.top;
359
+ this._popup.style.left = pos.left;
360
+ this._popup.style.positionAnchor = this._anchorName;
361
+ }
362
+ _propagateContext() {
363
+ const items = (this.shadowRoot?.querySelector(`slot[name="menu"]`))?.assignedElements({ flatten: true }) ?? [];
364
+ for (const el of items) {
365
+ if (`registry` in el) el.registry = this.registry;
366
+ if (`keyboardManager` in el) el.keyboardManager = this.keyboardManager;
367
+ }
368
+ }
369
+ _handleSlotChange(e) {
370
+ const assigned = e.target.assignedElements({ flatten: true });
371
+ this._hasMenu = assigned.length > 0;
372
+ this._propagateContext();
373
+ }
374
+ _handleTriggerSlotChange(e) {
375
+ const slot = e.target;
376
+ this._hasTriggerSlot = slot.assignedElements({ flatten: true }).length > 0;
377
+ }
378
+ get isOpen() {
379
+ return this._isOpen;
380
+ }
381
+ openMenu() {
382
+ this._openMenu();
383
+ }
384
+ closeMenu() {
385
+ this._closeMenu();
386
+ }
387
+ focusTrigger() {
388
+ this._triggerBtn?.focus();
389
+ }
390
+ _openMenu() {
391
+ if (this._isOpen || !this._popup?.popover) return;
392
+ try {
393
+ this._popup.showPopover({ source: this });
394
+ this._isOpen = true;
395
+ document.addEventListener(`click`, this._clickListener);
396
+ this.dispatchEvent(new CustomEvent(`menu-trigger-open`, {
397
+ bubbles: true,
398
+ composed: true
399
+ }));
400
+ requestAnimationFrame(() => {
401
+ this._getMenuContainer()?.focusFirst();
402
+ });
403
+ } catch (err) {
404
+ console.warn(`showPopover failed:`, err);
405
+ }
406
+ }
407
+ _closeMenu() {
408
+ if (!this._isOpen) return;
409
+ if (this._popup?.popover) try {
410
+ this._popup.hidePopover();
411
+ } catch {}
412
+ this._isOpen = false;
413
+ document.removeEventListener(`click`, this._clickListener);
414
+ }
415
+ _handleTriggerClick(e) {
416
+ e.stopPropagation();
417
+ if (this._isOpen) {
418
+ this._closeMenu();
419
+ this._triggerBtn?.focus();
420
+ } else this._openMenu();
421
+ }
422
+ _handleClickOutside(e) {
423
+ if (!this.contains(e.target)) {
424
+ if (this._popup?.popover && this._popup.hasAttribute(`open`)) try {
425
+ this._popup.hidePopover();
426
+ } catch {}
427
+ }
428
+ }
429
+ _getMenuContainer() {
430
+ return ((this.shadowRoot?.querySelector(`slot[name="menu"]`))?.assignedElements({ flatten: true }) ?? []).find((el) => el.tagName === `IXFX-MENU-CONTAINER`) ?? null;
431
+ }
432
+ _handleCommand(e) {
433
+ if (this._popup?.popover) try {
434
+ this._popup.hidePopover();
435
+ } catch {}
436
+ this.dispatchEvent(new CustomEvent(`menu-command`, {
437
+ detail: e.detail,
438
+ bubbles: true,
439
+ composed: true
440
+ }));
441
+ }
442
+ _handleRadioChange(e) {
443
+ if (this._popup?.popover) try {
444
+ this._popup.hidePopover();
445
+ } catch {}
446
+ this.dispatchEvent(new CustomEvent(`menu-command`, {
447
+ detail: {
448
+ command: e.detail.name,
449
+ value: e.detail.value
450
+ },
451
+ bubbles: true,
452
+ composed: true
453
+ }));
454
+ }
455
+ _handleContextMenu(e) {
456
+ if (this.mode !== `context`) return;
457
+ e.preventDefault();
458
+ this._popup.style.top = `${e.clientY}px`;
459
+ this._popup.style.left = `${e.clientX}px`;
460
+ this._popup.style.position = `fixed`;
461
+ this._popup.style.positionAnchor = `none`;
462
+ if (this._popup?.popover) try {
463
+ this._popup.showPopover();
464
+ } catch {}
465
+ }
466
+ static {
467
+ this.styles = [popupSurfaceStyles, css`
468
+ :host {
469
+ display: inline-block;
470
+ position: relative;
471
+ }
472
+
473
+ .trigger-area {
474
+ anchor-name: var(--anchor-name);
475
+ display: inline-flex;
476
+ align-items: stretch;
477
+ }
478
+
479
+ .trigger-btn {
480
+ background: none;
481
+ border: none;
482
+ color: var(--surface-3-text);
483
+ cursor: pointer;
484
+ padding: var(--space-s) var(--space-m);
485
+ font-size: var(--text-m);
486
+ font-weight: 600;
487
+ border-radius: var(--radius-s);
488
+ opacity: 0.6;
489
+ transition: opacity var(--transition), background var(--transition);
490
+ }
491
+
492
+ .trigger-btn:hover {
493
+ background: var(--_trigger-hover-bg, var(--surface-4));
494
+ color: var(--surface-3-text);
495
+ opacity: var(--_trigger-hover-opacity, 1);
496
+ }
497
+
498
+ .trigger-btn:focus-visible {
499
+ background: var(--surface-4);
500
+ color: var(--surface-3-text);
501
+ outline: none;
502
+ opacity: 1;
503
+ }
504
+
505
+ .popup {
506
+ position: fixed;
507
+ position-anchor: var(--anchor-name);
508
+ inset: auto;
509
+ margin: 0;
510
+ padding: 0;
511
+ border: none;
512
+ background: transparent;
513
+ z-index: 100;
514
+ position-try-fallbacks: flip-inline, flip-block, flip-block flip-inline;
515
+ }
516
+
517
+ .popup[popover] {
518
+ opacity: 1;
519
+ transform: translateY(0) scale(1);
520
+ transition: opacity 0.12s ease-out, transform 0.12s ease-out,
521
+ display 0.12s allow-discrete, overlay 0.12s allow-discrete;
522
+ }
523
+
524
+ @starting-style .popup {
525
+ opacity: 0;
526
+ transform: translateY(-4px) scale(0.97);
527
+ }
528
+ `];
529
+ }
530
+ render() {
531
+ const showButton = this.mode !== `dropdown` && this._hasMenu && !this._hasTriggerSlot;
532
+ return html`
533
+ <div
534
+ class="trigger-area"
535
+ @click=${this._handleTriggerClick}
536
+ @contextmenu=${this._handleContextMenu}
537
+ >
538
+ ${showButton ? html`<button class="trigger-btn" part="base">${this.label}</button>` : null}
539
+ <slot name="trigger" @slotchange=${this._handleTriggerSlotChange}></slot>
540
+ </div>
541
+ <div
542
+ class="popup popup-surface"
543
+ popover="auto"
544
+ @click=${(e) => e.stopPropagation()}
545
+ >
546
+ <slot name="menu" @slotchange=${this._handleSlotChange}></slot>
547
+ </div>
548
+ `;
549
+ }
550
+ };
551
+ __decorate([property({ type: String })], MenuTrigger.prototype, "mode", void 0);
552
+ __decorate([property({ type: String })], MenuTrigger.prototype, "label", void 0);
553
+ __decorate([property({ attribute: false })], MenuTrigger.prototype, "registry", void 0);
554
+ __decorate([property({ attribute: false })], MenuTrigger.prototype, "keyboardManager", void 0);
555
+ __decorate([property({ type: String })], MenuTrigger.prototype, "placement", void 0);
556
+ __decorate([state()], MenuTrigger.prototype, "_isOpen", void 0);
557
+ __decorate([state()], MenuTrigger.prototype, "_hasMenu", void 0);
558
+ __decorate([state()], MenuTrigger.prototype, "_hasTriggerSlot", void 0);
559
+ __decorate([query(`.trigger-btn`)], MenuTrigger.prototype, "_triggerBtn", void 0);
560
+ __decorate([query(`.popup`)], MenuTrigger.prototype, "_popup", void 0);
561
+ MenuTrigger = _MenuTrigger = __decorate([customElement(`ixfx-menu-trigger`)], MenuTrigger);
562
+ //#endregion
563
+ //#region src/menu/menu-item.ts
564
+ let MenuItem = class MenuItem extends LitElement {
565
+ constructor(..._args) {
566
+ super(..._args);
567
+ this.command = ``;
568
+ this.commandArgs = ``;
569
+ this.label = ``;
570
+ this.disabled = false;
571
+ this.iconName = ``;
572
+ this._hasChildren = false;
573
+ this._hoverTimeout = null;
574
+ }
575
+ disconnectedCallback() {
576
+ super.disconnectedCallback();
577
+ if (this._hoverTimeout) clearTimeout(this._hoverTimeout);
578
+ }
579
+ _handleSlotChange() {
580
+ const assigned = this._slot?.assignedElements() ?? [];
581
+ this._hasChildren = assigned.length > 0;
582
+ }
583
+ _handleMouseEnter() {
584
+ if (this.disabled || !this._hasChildren || !this.submenuPopover) return;
585
+ if (this._hoverTimeout) clearTimeout(this._hoverTimeout);
586
+ this._hoverTimeout = window.setTimeout(() => {
587
+ this._showSubmenu();
588
+ }, 150);
589
+ }
590
+ _handleMouseLeave() {
591
+ if (this._hoverTimeout) {
592
+ clearTimeout(this._hoverTimeout);
593
+ this._hoverTimeout = null;
594
+ }
595
+ this._hideSubmenu();
596
+ }
597
+ _showSubmenu() {
598
+ if (!this.submenuPopover?.popover) return;
599
+ try {
600
+ this.submenuPopover.showPopover();
601
+ } catch (err) {
602
+ console.warn(`showPopover failed:`, err);
603
+ }
604
+ }
605
+ _hideSubmenu() {
606
+ if (!this.submenuPopover?.popover) return;
607
+ try {
608
+ this.submenuPopover.hidePopover();
609
+ } catch (err) {
610
+ console.warn(`hidePopover failed:`, err);
611
+ }
612
+ }
613
+ handleClick() {
614
+ if (this.disabled) return;
615
+ this.dispatchEvent(new CustomEvent(`command`, {
616
+ detail: {
617
+ command: this.command,
618
+ args: this.commandArgs
619
+ },
620
+ bubbles: true,
621
+ composed: true
622
+ }));
623
+ }
624
+ _resolvedLabel() {
625
+ if (this.label) return this.label;
626
+ if (this.registry && this.command) return this.registry.get(this.command)?.label ?? ``;
627
+ return ``;
628
+ }
629
+ _resolvedIcon() {
630
+ if (this.iconName) return this.iconName;
631
+ if (this.registry && this.command) return this.registry.get(this.command)?.icon ?? null;
632
+ return null;
633
+ }
634
+ willUpdate(changedProperties) {
635
+ super.willUpdate(changedProperties);
636
+ const resolvedIcon = this._resolvedIcon();
637
+ if (resolvedIcon && !this.iconName) this.setAttribute(`data-icon-section`, ``);
638
+ else if (!resolvedIcon && !this.iconName) this.removeAttribute(`data-icon-section`);
639
+ }
640
+ updated(changedProperties) {
641
+ super.updated(changedProperties);
642
+ }
643
+ _getShortcut() {
644
+ if (!this.keyboardManager || !this.command) return null;
645
+ const binding = (this.keyboardManager.getBindings?.() ?? []).find((b) => b.commandId === this.command);
646
+ if (!binding) return null;
647
+ const mods = Array.from(binding.modifiers ?? [], (m) => ({
648
+ ctrl: `⌃`,
649
+ shift: `⇧`,
650
+ alt: `⌥`,
651
+ meta: `⌘`
652
+ })[m] ?? m);
653
+ const key = binding.key?.length === 1 ? binding.key.toUpperCase() : binding.key;
654
+ return [...mods, key].join(``);
655
+ }
656
+ static {
657
+ this.styles = [tickledItemStyles, css`
658
+ :host {
659
+ display: block;
660
+ }
661
+
662
+ .item {
663
+ display: flex !important;
664
+ align-items: center;
665
+ padding: 6px var(--space-m);
666
+ font-size: var(--text-m);
667
+ background: var(--item-bg, transparent);
668
+ border: var(--item-border, 1px solid transparent);
669
+ color: var(--item-text, inherit);
670
+ }
671
+
672
+ :host(.tickled) .item {
673
+ background: rgba(0, 0, 0, 0.06);
674
+ border: 1px solid var(--accent);
675
+ color: inherit;
676
+ }
677
+
678
+ :host(:focus) {
679
+ outline: none;
680
+ }
681
+
682
+ .item.disabled {
683
+ opacity: var(--disabled-opacity);
684
+ cursor: default;
685
+ }
686
+
687
+ .item.disabled:hover {
688
+ background: transparent;
689
+ }
690
+
691
+ .icon-slot {
692
+ width: 0;
693
+ overflow: hidden;
694
+ flex-shrink: 0;
695
+ display: inline-flex;
696
+ align-items: center;
697
+ justify-content: center;
698
+ }
699
+
700
+ :host([icon-name]) .icon-slot,
701
+ :host([data-icon-section]) .icon-slot {
702
+ width: 1em;
703
+ height: 1em;
704
+ margin-right: var(--space-s);
705
+ }
706
+
707
+ .label {
708
+ flex: 1;
709
+ }
710
+
711
+ .shortcut {
712
+ margin-left: auto;
713
+ color: var(--surface-muted-text);
714
+ font-size: var(--text-s);
715
+ }
716
+
717
+ .arrow {
718
+ color: var(--surface-muted-text);
719
+ margin-left: var(--space-m);
720
+ }
721
+ `];
722
+ }
723
+ render() {
724
+ const shortcut = this._getShortcut();
725
+ const resolvedIcon = this._resolvedIcon();
726
+ return html`
727
+ <div
728
+ class="item ${this.disabled ? `disabled` : ``}"
729
+ @click=${this.handleClick}
730
+ @mouseenter=${this._handleMouseEnter}
731
+ @mouseleave=${this._handleMouseLeave}
732
+ tabindex="${this.disabled ? -1 : 0}"
733
+ role="menuitem"
734
+ aria-haspopup="${this._hasChildren ? `true` : `false`}"
735
+ aria-expanded="${this.submenuPopover?.matches(`:popover-open`) ?? false}"
736
+ >
737
+ <span class="icon-slot">${resolvedIcon ? html`<ixfx-icon name="${resolvedIcon}"></ixfx-icon>` : null}</span>
738
+ <span class="label"><slot></slot>${this._resolvedLabel()}</span>
739
+ ${shortcut ? html`<span class="shortcut">${shortcut}</span>` : null}
740
+ ${this._hasChildren ? html`<span class="arrow"><ixfx-icon name="chevron-right"></ixfx-icon></span>` : null}
741
+ </div>
742
+ <slot @slotchange=${this._handleSlotChange}></slot>
743
+ `;
744
+ }
745
+ };
746
+ __decorate([property({ type: String })], MenuItem.prototype, "command", void 0);
747
+ __decorate([property({
748
+ type: String,
749
+ attribute: `command-args`
750
+ })], MenuItem.prototype, "commandArgs", void 0);
751
+ __decorate([property({ type: String })], MenuItem.prototype, "label", void 0);
752
+ __decorate([property({ type: Boolean })], MenuItem.prototype, "disabled", void 0);
753
+ __decorate([property({
754
+ type: String,
755
+ attribute: `icon-name`
756
+ })], MenuItem.prototype, "iconName", void 0);
757
+ __decorate([property({ attribute: false })], MenuItem.prototype, "registry", void 0);
758
+ __decorate([property({ attribute: false })], MenuItem.prototype, "keyboardManager", void 0);
759
+ __decorate([property({ attribute: false })], MenuItem.prototype, "submenuPopover", void 0);
760
+ __decorate([state()], MenuItem.prototype, "_hasChildren", void 0);
761
+ __decorate([query(`slot`)], MenuItem.prototype, "_slot", void 0);
762
+ MenuItem = __decorate([customElement(`ixfx-menu-item`)], MenuItem);
763
+ //#endregion
764
+ export { MenuTrigger as n, MenuContainer as r, MenuItem as t };
765
+
766
+ //# sourceMappingURL=menu-item-DEzL_Yjk.js.map