@ixfx/components 0.5.19 → 0.6.0

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