@aquera/nile-elements 1.7.9 → 1.8.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 (90) hide show
  1. package/README.md +3 -0
  2. package/dist/index.cjs.js +1 -1
  3. package/dist/index.esm.js +1 -1
  4. package/dist/index.js +697 -502
  5. package/dist/nile-context-menu/index.cjs.js +2 -0
  6. package/dist/nile-context-menu/index.cjs.js.map +1 -0
  7. package/dist/nile-context-menu/index.esm.js +1 -0
  8. package/dist/nile-context-menu/nile-context-menu.cjs.js +2 -0
  9. package/dist/nile-context-menu/nile-context-menu.cjs.js.map +1 -0
  10. package/dist/nile-context-menu/nile-context-menu.css.cjs.js +2 -0
  11. package/dist/nile-context-menu/nile-context-menu.css.cjs.js.map +1 -0
  12. package/dist/nile-context-menu/nile-context-menu.css.esm.js +51 -0
  13. package/dist/nile-context-menu/nile-context-menu.esm.js +25 -0
  14. package/dist/nile-context-menu-group/index.cjs.js +2 -0
  15. package/dist/nile-context-menu-group/index.cjs.js.map +1 -0
  16. package/dist/nile-context-menu-group/index.esm.js +1 -0
  17. package/dist/nile-context-menu-group/nile-context-menu-group.cjs.js +2 -0
  18. package/dist/nile-context-menu-group/nile-context-menu-group.cjs.js.map +1 -0
  19. package/dist/nile-context-menu-group/nile-context-menu-group.css.cjs.js +2 -0
  20. package/dist/nile-context-menu-group/nile-context-menu-group.css.cjs.js.map +1 -0
  21. package/dist/nile-context-menu-group/nile-context-menu-group.css.esm.js +20 -0
  22. package/dist/nile-context-menu-group/nile-context-menu-group.esm.js +11 -0
  23. package/dist/nile-context-menu-item/index.cjs.js +2 -0
  24. package/dist/nile-context-menu-item/index.cjs.js.map +1 -0
  25. package/dist/nile-context-menu-item/index.esm.js +1 -0
  26. package/dist/nile-context-menu-item/nile-context-menu-item.cjs.js +2 -0
  27. package/dist/nile-context-menu-item/nile-context-menu-item.cjs.js.map +1 -0
  28. package/dist/nile-context-menu-item/nile-context-menu-item.css.cjs.js +2 -0
  29. package/dist/nile-context-menu-item/nile-context-menu-item.css.cjs.js.map +1 -0
  30. package/dist/nile-context-menu-item/nile-context-menu-item.css.esm.js +72 -0
  31. package/dist/nile-context-menu-item/nile-context-menu-item.esm.js +20 -0
  32. package/dist/nile-context-submenu/index.cjs.js +2 -0
  33. package/dist/nile-context-submenu/index.cjs.js.map +1 -0
  34. package/dist/nile-context-submenu/index.esm.js +1 -0
  35. package/dist/nile-context-submenu/nile-context-submenu.cjs.js +2 -0
  36. package/dist/nile-context-submenu/nile-context-submenu.cjs.js.map +1 -0
  37. package/dist/nile-context-submenu/nile-context-submenu.esm.js +3 -0
  38. package/dist/src/index.d.ts +3 -0
  39. package/dist/src/index.js +3 -0
  40. package/dist/src/index.js.map +1 -1
  41. package/dist/src/nile-context-menu/index.d.ts +3 -0
  42. package/dist/src/nile-context-menu/index.js +4 -0
  43. package/dist/src/nile-context-menu/index.js.map +1 -0
  44. package/dist/src/nile-context-menu/nile-context-menu.css.d.ts +10 -0
  45. package/dist/src/nile-context-menu/nile-context-menu.css.js +127 -0
  46. package/dist/src/nile-context-menu/nile-context-menu.css.js.map +1 -0
  47. package/dist/src/nile-context-menu/nile-context-menu.d.ts +123 -0
  48. package/dist/src/nile-context-menu/nile-context-menu.js +625 -0
  49. package/dist/src/nile-context-menu/nile-context-menu.js.map +1 -0
  50. package/dist/src/nile-context-menu-group/index.d.ts +1 -0
  51. package/dist/src/nile-context-menu-group/index.js +2 -0
  52. package/dist/src/nile-context-menu-group/index.js.map +1 -0
  53. package/dist/src/nile-context-menu-group/nile-context-menu-group.css.d.ts +9 -0
  54. package/dist/src/nile-context-menu-group/nile-context-menu-group.css.js +29 -0
  55. package/dist/src/nile-context-menu-group/nile-context-menu-group.css.js.map +1 -0
  56. package/dist/src/nile-context-menu-group/nile-context-menu-group.d.ts +28 -0
  57. package/dist/src/nile-context-menu-group/nile-context-menu-group.js +55 -0
  58. package/dist/src/nile-context-menu-group/nile-context-menu-group.js.map +1 -0
  59. package/dist/src/nile-context-menu-item/index.d.ts +1 -0
  60. package/dist/src/nile-context-menu-item/index.js +2 -0
  61. package/dist/src/nile-context-menu-item/index.js.map +1 -0
  62. package/dist/src/nile-context-menu-item/nile-context-menu-item.css.d.ts +9 -0
  63. package/dist/src/nile-context-menu-item/nile-context-menu-item.css.js +81 -0
  64. package/dist/src/nile-context-menu-item/nile-context-menu-item.css.js.map +1 -0
  65. package/dist/src/nile-context-menu-item/nile-context-menu-item.d.ts +45 -0
  66. package/dist/src/nile-context-menu-item/nile-context-menu-item.js +96 -0
  67. package/dist/src/nile-context-menu-item/nile-context-menu-item.js.map +1 -0
  68. package/dist/src/nile-context-submenu/index.d.ts +1 -0
  69. package/dist/src/nile-context-submenu/index.js +2 -0
  70. package/dist/src/nile-context-submenu/index.js.map +1 -0
  71. package/dist/src/nile-context-submenu/nile-context-submenu.d.ts +60 -0
  72. package/dist/src/nile-context-submenu/nile-context-submenu.js +324 -0
  73. package/dist/src/nile-context-submenu/nile-context-submenu.js.map +1 -0
  74. package/dist/src/version.js +1 -1
  75. package/dist/src/version.js.map +1 -1
  76. package/dist/tsconfig.tsbuildinfo +1 -1
  77. package/package.json +1 -1
  78. package/src/index.ts +3 -0
  79. package/src/nile-context-menu/index.ts +12 -0
  80. package/src/nile-context-menu/nile-context-menu.css.ts +130 -0
  81. package/src/nile-context-menu/nile-context-menu.ts +698 -0
  82. package/src/nile-context-menu-group/index.ts +1 -0
  83. package/src/nile-context-menu-group/nile-context-menu-group.css.ts +31 -0
  84. package/src/nile-context-menu-group/nile-context-menu-group.ts +55 -0
  85. package/src/nile-context-menu-item/index.ts +5 -0
  86. package/src/nile-context-menu-item/nile-context-menu-item.css.ts +83 -0
  87. package/src/nile-context-menu-item/nile-context-menu-item.ts +112 -0
  88. package/src/nile-context-submenu/index.ts +1 -0
  89. package/src/nile-context-submenu/nile-context-submenu.ts +322 -0
  90. package/vscode-html-custom-data.json +82 -4
@@ -0,0 +1,324 @@
1
+ /**
2
+ * Copyright Aquera Inc 2026
3
+ *
4
+ * This source code is licensed under the BSD-3-Clause license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+ var NileContextSubmenu_1;
8
+ import { __decorate } from "tslib";
9
+ import { html, css } from 'lit';
10
+ import { customElement, property, state } from 'lit/decorators.js';
11
+ import NileElement from '../internal/nile-element';
12
+ import '../nile-floating-panel';
13
+ const ITEM_TAG = 'nile-context-menu-item';
14
+ const SUBMENU_TAG = 'nile-context-submenu';
15
+ const HOVER_OPEN_DELAY = 100;
16
+ const HOVER_CLOSE_DELAY = 300;
17
+ let submenuIdSeq = 0;
18
+ /**
19
+ * Nested submenu inside a `nile-context-menu-item`.
20
+ * @tag nile-context-submenu
21
+ */
22
+ let NileContextSubmenu = NileContextSubmenu_1 = class NileContextSubmenu extends NileElement {
23
+ constructor() {
24
+ super(...arguments);
25
+ this.zIndex = 9999;
26
+ this._open = false;
27
+ this._parentItem = null;
28
+ this._proxyId = `nile-context-submenu-anchor-${++submenuIdSeq}`;
29
+ this._menuContainerRef = null;
30
+ this._setupDone = false;
31
+ this._onParentEnter = () => {
32
+ if (this._parentItem?.disabled)
33
+ return;
34
+ this._clearTimers();
35
+ if (this._open)
36
+ return;
37
+ this._openTimer = window.setTimeout(() => this.openSubmenu(), HOVER_OPEN_DELAY);
38
+ };
39
+ this._onParentLeave = () => {
40
+ if (this._openTimer != null) {
41
+ clearTimeout(this._openTimer);
42
+ this._openTimer = undefined;
43
+ }
44
+ if (this._open) {
45
+ this._closeTimer = window.setTimeout(() => this.closeSubmenu(), HOVER_CLOSE_DELAY);
46
+ }
47
+ };
48
+ this._onParentClick = (e) => {
49
+ e.stopPropagation();
50
+ if (this._parentItem?.disabled)
51
+ return;
52
+ this._clearTimers();
53
+ if (this._open)
54
+ this.closeSubmenu();
55
+ else
56
+ this.openSubmenu();
57
+ };
58
+ this._onPanelEnter = () => {
59
+ this._clearTimers();
60
+ };
61
+ this._onPanelLeave = () => {
62
+ if (this._open) {
63
+ this._closeTimer = window.setTimeout(() => {
64
+ const hasOpenDescendant = NileContextSubmenu_1.openStack.some(sub => sub !== this && this._menuContainerRef?.contains(sub));
65
+ if (hasOpenDescendant)
66
+ return;
67
+ this.closeSubmenu();
68
+ }, HOVER_CLOSE_DELAY);
69
+ }
70
+ };
71
+ this._onMenuMouseOver = (e) => {
72
+ const item = e.composedPath().find(n => n instanceof HTMLElement && n.tagName.toLowerCase() === ITEM_TAG);
73
+ if (!item || item.disabled)
74
+ return;
75
+ item.focus();
76
+ };
77
+ this._onNestedSelect = (e) => {
78
+ if (e.target === this)
79
+ return;
80
+ if (e.detail?.type !== 'click')
81
+ return;
82
+ this.emit('nile-change', e.detail);
83
+ };
84
+ this._onMenuClick = (e) => {
85
+ const item = e.composedPath().find(n => n instanceof HTMLElement && n.tagName.toLowerCase() === ITEM_TAG);
86
+ if (!item || item.disabled)
87
+ return;
88
+ if (item.querySelector(`:scope > ${SUBMENU_TAG}`))
89
+ return;
90
+ const detail = {
91
+ id: item.id,
92
+ value: item.value,
93
+ name: (item.textContent ?? '').trim(),
94
+ target: null,
95
+ originalEvent: e,
96
+ };
97
+ try {
98
+ item.onSelect?.(detail);
99
+ }
100
+ catch (err) {
101
+ console.error('[nile-context-submenu] onSelect callback threw:', err);
102
+ }
103
+ this.emit('nile-change', { type: 'click', ...detail });
104
+ };
105
+ }
106
+ static get styles() {
107
+ return [
108
+ css `
109
+ :host { display: contents; }
110
+ `,
111
+ ];
112
+ }
113
+ connectedCallback() {
114
+ super.connectedCallback();
115
+ let p = this.parentElement;
116
+ while (p && p.tagName.toLowerCase() !== ITEM_TAG)
117
+ p = p.parentElement;
118
+ this._parentItem = p;
119
+ this._ensureProxy();
120
+ if (this._parentItem) {
121
+ this._parentItem.setSubmenuExpanded?.(false);
122
+ this._parentItem.addEventListener('mouseenter', this._onParentEnter);
123
+ this._parentItem.addEventListener('mouseleave', this._onParentLeave);
124
+ this._parentItem.addEventListener('click', this._onParentClick, true);
125
+ }
126
+ this._ensureBodyPanel();
127
+ }
128
+ _ensureProxy() {
129
+ if (this._proxyEl)
130
+ return;
131
+ const el = document.createElement('div');
132
+ el.id = this._proxyId;
133
+ el.setAttribute('aria-hidden', 'true');
134
+ el.style.cssText =
135
+ 'position: fixed; top: 0; left: 0; width: 0; height: 0; pointer-events: none;';
136
+ document.body.appendChild(el);
137
+ this._proxyEl = el;
138
+ }
139
+ _syncProxyToParent() {
140
+ if (!this._proxyEl || !this._parentItem)
141
+ return;
142
+ const rect = this._parentItem.getBoundingClientRect();
143
+ this._proxyEl.style.left = `${rect.left}px`;
144
+ this._proxyEl.style.top = `${rect.top}px`;
145
+ this._proxyEl.style.width = `${rect.width}px`;
146
+ this._proxyEl.style.height = `${rect.height}px`;
147
+ }
148
+ disconnectedCallback() {
149
+ super.disconnectedCallback();
150
+ if (this._parentItem) {
151
+ this._parentItem.removeEventListener('mouseenter', this._onParentEnter);
152
+ this._parentItem.removeEventListener('mouseleave', this._onParentLeave);
153
+ this._parentItem.removeEventListener('click', this._onParentClick, true);
154
+ }
155
+ this._clearTimers();
156
+ if (this._open)
157
+ this.closeSubmenu();
158
+ this._teardownBodyArtifacts();
159
+ NileContextSubmenu_1.openStack = NileContextSubmenu_1.openStack.filter(s => s !== this);
160
+ }
161
+ _teardownBodyArtifacts() {
162
+ const menu = this._menuContainerRef;
163
+ if (menu) {
164
+ menu.removeEventListener('click', this._onMenuClick);
165
+ menu.removeEventListener('mouseover', this._onMenuMouseOver);
166
+ menu.removeEventListener('mouseenter', this._onPanelEnter);
167
+ menu.removeEventListener('mouseleave', this._onPanelLeave);
168
+ menu.removeEventListener('nile-change', this._onNestedSelect);
169
+ while (menu.firstChild)
170
+ this.appendChild(menu.firstChild);
171
+ }
172
+ this._floatingPanelEl?.remove();
173
+ this._floatingPanelEl = undefined;
174
+ this._menuContainerRef = null;
175
+ this._setupDone = false;
176
+ this._proxyEl?.remove();
177
+ this._proxyEl = undefined;
178
+ }
179
+ _ensureBodyPanel() {
180
+ if (this._setupDone)
181
+ return;
182
+ const fp = document.createElement('nile-floating-panel');
183
+ fp.setAttribute('for', this._proxyId);
184
+ fp.setAttribute('trigger', 'manual');
185
+ fp.setAttribute('placement', 'right-start');
186
+ fp.panelClass = 'nile-context-menu-panel';
187
+ fp.zIndex = this.zIndex;
188
+ fp.interactive = true;
189
+ fp.hideOnClick = false;
190
+ fp.closeOnEscape = false;
191
+ fp.arrow = 'none';
192
+ fp.distance = 0;
193
+ const menu = document.createElement('div');
194
+ menu.className = 'nile-context-menu__menu';
195
+ menu.setAttribute('role', 'menu');
196
+ fp.appendChild(menu);
197
+ document.body.appendChild(fp);
198
+ this._floatingPanelEl = fp;
199
+ this._menuContainerRef = menu;
200
+ menu.addEventListener('click', this._onMenuClick);
201
+ menu.addEventListener('mouseover', this._onMenuMouseOver);
202
+ menu.addEventListener('mouseenter', this._onPanelEnter);
203
+ menu.addEventListener('mouseleave', this._onPanelLeave);
204
+ menu.addEventListener('nile-change', this._onNestedSelect);
205
+ this._relocateLightChildren();
206
+ this._setupDone = true;
207
+ }
208
+ firstUpdated() {
209
+ this._relocateLightChildren();
210
+ }
211
+ _relocateLightChildren() {
212
+ if (!this._menuContainerRef)
213
+ return;
214
+ for (const kid of Array.from(this.children)) {
215
+ this._menuContainerRef.appendChild(kid);
216
+ }
217
+ }
218
+ _clearTimers() {
219
+ if (this._openTimer != null) {
220
+ clearTimeout(this._openTimer);
221
+ this._openTimer = undefined;
222
+ }
223
+ if (this._closeTimer != null) {
224
+ clearTimeout(this._closeTimer);
225
+ this._closeTimer = undefined;
226
+ }
227
+ }
228
+ openSubmenu() {
229
+ if (this._open)
230
+ return;
231
+ if (this._parentItem?.disabled)
232
+ return;
233
+ this._closeSiblingSubmenus();
234
+ this._ensureProxy();
235
+ this._ensureBodyPanel();
236
+ this._syncProxyToParent();
237
+ this._open = true;
238
+ if (this._floatingPanelEl)
239
+ this._floatingPanelEl.open = true;
240
+ NileContextSubmenu_1.openStack.push(this);
241
+ this._parentItem?.setSubmenuExpanded?.(true);
242
+ }
243
+ closeSubmenu() {
244
+ if (!this._open)
245
+ return;
246
+ for (const sub of [...NileContextSubmenu_1.openStack]) {
247
+ if (sub !== this && this._menuContainerRef?.contains(sub)) {
248
+ sub.closeSubmenu();
249
+ }
250
+ }
251
+ this._open = false;
252
+ if (this._floatingPanelEl)
253
+ this._floatingPanelEl.open = false;
254
+ NileContextSubmenu_1.openStack = NileContextSubmenu_1.openStack.filter(s => s !== this);
255
+ this._clearTimers();
256
+ this._parentItem?.setSubmenuExpanded?.(false);
257
+ }
258
+ get isOpen() {
259
+ return this._open;
260
+ }
261
+ static findByContainer(container) {
262
+ for (const sub of NileContextSubmenu_1.openStack) {
263
+ if (sub._menuContainerRef === container)
264
+ return sub;
265
+ }
266
+ return null;
267
+ }
268
+ get parentItem() {
269
+ return this._parentItem;
270
+ }
271
+ focusFirstItem() {
272
+ if (!this._menuContainerRef)
273
+ return;
274
+ const items = Array.from(this._menuContainerRef.querySelectorAll(ITEM_TAG));
275
+ for (const item of items) {
276
+ let cur = item.parentElement;
277
+ let inDeeperSub = false;
278
+ while (cur && cur !== this._menuContainerRef) {
279
+ if (cur.tagName.toLowerCase() === SUBMENU_TAG) {
280
+ inDeeperSub = true;
281
+ break;
282
+ }
283
+ cur = cur.parentElement;
284
+ }
285
+ if (inDeeperSub)
286
+ continue;
287
+ if (!item.disabled) {
288
+ item.focus();
289
+ return;
290
+ }
291
+ }
292
+ }
293
+ _closeSiblingSubmenus() {
294
+ const myLevel = this._parentLevel();
295
+ for (const sub of [...NileContextSubmenu_1.openStack]) {
296
+ if (sub === this)
297
+ continue;
298
+ if (sub._parentLevel() === myLevel)
299
+ sub.closeSubmenu();
300
+ }
301
+ }
302
+ _parentLevel() {
303
+ const item = this._parentItem;
304
+ if (!item)
305
+ return null;
306
+ return item.parentElement?.closest('.nile-context-menu__menu') ?? null;
307
+ }
308
+ render() {
309
+ return html ``;
310
+ }
311
+ };
312
+ NileContextSubmenu.openStack = [];
313
+ __decorate([
314
+ property({ attribute: true, type: Number, reflect: true })
315
+ ], NileContextSubmenu.prototype, "zIndex", void 0);
316
+ __decorate([
317
+ state()
318
+ ], NileContextSubmenu.prototype, "_open", void 0);
319
+ NileContextSubmenu = NileContextSubmenu_1 = __decorate([
320
+ customElement('nile-context-submenu')
321
+ ], NileContextSubmenu);
322
+ export { NileContextSubmenu };
323
+ export default NileContextSubmenu;
324
+ //# sourceMappingURL=nile-context-submenu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nile-context-submenu.js","sourceRoot":"","sources":["../../../src/nile-context-submenu/nile-context-submenu.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright Aquera Inc 2026\n *\n * This source code is licensed under the BSD-3-Clause license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { html, CSSResultArray, TemplateResult, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport NileElement from '../internal/nile-element';\nimport type { NileContextMenuItem } from '../nile-context-menu-item';\nimport '../nile-floating-panel';\nimport type { NileFloatingPanel } from '../nile-floating-panel';\n\nconst ITEM_TAG = 'nile-context-menu-item';\nconst SUBMENU_TAG = 'nile-context-submenu';\nconst HOVER_OPEN_DELAY = 100;\nconst HOVER_CLOSE_DELAY = 300;\n\nlet submenuIdSeq = 0;\n\n/**\n * Nested submenu inside a `nile-context-menu-item`.\n * @tag nile-context-submenu\n */\n@customElement('nile-context-submenu')\nexport class NileContextSubmenu extends NileElement {\n public static get styles(): CSSResultArray {\n return [\n css`\n :host { display: contents; }\n `,\n ];\n }\n\n @property({ attribute: true, type: Number, reflect: true }) zIndex = 9999;\n\n @state() private _open = false;\n\n public static openStack: NileContextSubmenu[] = [];\n\n private _parentItem: NileContextMenuItem | null = null;\n private _proxyId = `nile-context-submenu-anchor-${++submenuIdSeq}`;\n private _proxyEl?: HTMLDivElement;\n private _floatingPanelEl?: NileFloatingPanel;\n private _menuContainerRef: HTMLDivElement | null = null;\n private _openTimer?: number;\n private _closeTimer?: number;\n private _setupDone = false;\n\n public override connectedCallback(): void {\n super.connectedCallback();\n let p: Element | null = this.parentElement;\n while (p && p.tagName.toLowerCase() !== ITEM_TAG) p = p.parentElement;\n this._parentItem = p as NileContextMenuItem | null;\n this._ensureProxy();\n if (this._parentItem) {\n this._parentItem.setSubmenuExpanded?.(false);\n this._parentItem.addEventListener('mouseenter', this._onParentEnter);\n this._parentItem.addEventListener('mouseleave', this._onParentLeave);\n this._parentItem.addEventListener('click', this._onParentClick, true);\n }\n this._ensureBodyPanel();\n }\n\n private _ensureProxy(): void {\n if (this._proxyEl) return;\n const el = document.createElement('div');\n el.id = this._proxyId;\n el.setAttribute('aria-hidden', 'true');\n el.style.cssText =\n 'position: fixed; top: 0; left: 0; width: 0; height: 0; pointer-events: none;';\n document.body.appendChild(el);\n this._proxyEl = el;\n }\n\n private _syncProxyToParent(): void {\n if (!this._proxyEl || !this._parentItem) return;\n const rect = this._parentItem.getBoundingClientRect();\n this._proxyEl.style.left = `${rect.left}px`;\n this._proxyEl.style.top = `${rect.top}px`;\n this._proxyEl.style.width = `${rect.width}px`;\n this._proxyEl.style.height = `${rect.height}px`;\n }\n\n public override disconnectedCallback(): void {\n super.disconnectedCallback();\n if (this._parentItem) {\n this._parentItem.removeEventListener('mouseenter', this._onParentEnter);\n this._parentItem.removeEventListener('mouseleave', this._onParentLeave);\n this._parentItem.removeEventListener('click', this._onParentClick, true);\n }\n this._clearTimers();\n if (this._open) this.closeSubmenu();\n this._teardownBodyArtifacts();\n NileContextSubmenu.openStack = NileContextSubmenu.openStack.filter(s => s !== this);\n }\n\n private _teardownBodyArtifacts(): void {\n const menu = this._menuContainerRef;\n if (menu) {\n menu.removeEventListener('click', this._onMenuClick);\n menu.removeEventListener('mouseover', this._onMenuMouseOver);\n menu.removeEventListener('mouseenter', this._onPanelEnter);\n menu.removeEventListener('mouseleave', this._onPanelLeave);\n menu.removeEventListener('nile-change', this._onNestedSelect as EventListener);\n while (menu.firstChild) this.appendChild(menu.firstChild);\n }\n this._floatingPanelEl?.remove();\n this._floatingPanelEl = undefined;\n this._menuContainerRef = null;\n this._setupDone = false;\n this._proxyEl?.remove();\n this._proxyEl = undefined;\n }\n\n private _ensureBodyPanel(): void {\n if (this._setupDone) return;\n const fp = document.createElement('nile-floating-panel') as NileFloatingPanel;\n fp.setAttribute('for', this._proxyId);\n fp.setAttribute('trigger', 'manual');\n fp.setAttribute('placement', 'right-start');\n fp.panelClass = 'nile-context-menu-panel';\n fp.zIndex = this.zIndex;\n fp.interactive = true;\n fp.hideOnClick = false;\n fp.closeOnEscape = false;\n (fp as unknown as { arrow: 'none' }).arrow = 'none';\n fp.distance = 0;\n\n const menu = document.createElement('div');\n menu.className = 'nile-context-menu__menu';\n menu.setAttribute('role', 'menu');\n fp.appendChild(menu);\n\n document.body.appendChild(fp);\n this._floatingPanelEl = fp;\n this._menuContainerRef = menu;\n\n menu.addEventListener('click', this._onMenuClick);\n menu.addEventListener('mouseover', this._onMenuMouseOver);\n menu.addEventListener('mouseenter', this._onPanelEnter);\n menu.addEventListener('mouseleave', this._onPanelLeave);\n menu.addEventListener('nile-change', this._onNestedSelect as EventListener);\n\n this._relocateLightChildren();\n this._setupDone = true;\n }\n\n protected override firstUpdated(): void {\n this._relocateLightChildren();\n }\n\n private _relocateLightChildren(): void {\n if (!this._menuContainerRef) return;\n for (const kid of Array.from(this.children)) {\n this._menuContainerRef.appendChild(kid);\n }\n }\n\n private _clearTimers(): void {\n if (this._openTimer != null) { clearTimeout(this._openTimer); this._openTimer = undefined; }\n if (this._closeTimer != null) { clearTimeout(this._closeTimer); this._closeTimer = undefined; }\n }\n\n private _onParentEnter = (): void => {\n if (this._parentItem?.disabled) return;\n this._clearTimers();\n if (this._open) return;\n this._openTimer = window.setTimeout(() => this.openSubmenu(), HOVER_OPEN_DELAY);\n };\n\n private _onParentLeave = (): void => {\n if (this._openTimer != null) { clearTimeout(this._openTimer); this._openTimer = undefined; }\n if (this._open) {\n this._closeTimer = window.setTimeout(() => this.closeSubmenu(), HOVER_CLOSE_DELAY);\n }\n };\n\n private _onParentClick = (e: MouseEvent): void => {\n e.stopPropagation();\n if (this._parentItem?.disabled) return;\n this._clearTimers();\n if (this._open) this.closeSubmenu();\n else this.openSubmenu();\n };\n\n private _onPanelEnter = (): void => {\n this._clearTimers();\n };\n\n private _onPanelLeave = (): void => {\n if (this._open) {\n this._closeTimer = window.setTimeout(() => {\n const hasOpenDescendant = NileContextSubmenu.openStack.some(\n sub => sub !== this && this._menuContainerRef?.contains(sub),\n );\n if (hasOpenDescendant) return;\n this.closeSubmenu();\n }, HOVER_CLOSE_DELAY);\n }\n };\n\n public openSubmenu(): void {\n if (this._open) return;\n if (this._parentItem?.disabled) return;\n this._closeSiblingSubmenus();\n this._ensureProxy();\n this._ensureBodyPanel();\n this._syncProxyToParent();\n this._open = true;\n if (this._floatingPanelEl) this._floatingPanelEl.open = true;\n NileContextSubmenu.openStack.push(this);\n this._parentItem?.setSubmenuExpanded?.(true);\n }\n\n public closeSubmenu(): void {\n if (!this._open) return;\n for (const sub of [...NileContextSubmenu.openStack]) {\n if (sub !== this && this._menuContainerRef?.contains(sub)) {\n sub.closeSubmenu();\n }\n }\n this._open = false;\n if (this._floatingPanelEl) this._floatingPanelEl.open = false;\n NileContextSubmenu.openStack = NileContextSubmenu.openStack.filter(s => s !== this);\n this._clearTimers();\n this._parentItem?.setSubmenuExpanded?.(false);\n }\n\n public get isOpen(): boolean {\n return this._open;\n }\n\n public static findByContainer(container: Element): NileContextSubmenu | null {\n for (const sub of NileContextSubmenu.openStack) {\n if (sub._menuContainerRef === container) return sub;\n }\n return null;\n }\n\n public get parentItem(): NileContextMenuItem | null {\n return this._parentItem;\n }\n public focusFirstItem(): void {\n if (!this._menuContainerRef) return;\n const items = Array.from(\n this._menuContainerRef.querySelectorAll(ITEM_TAG)\n ) as NileContextMenuItem[];\n for (const item of items) {\n let cur: Element | null = item.parentElement;\n let inDeeperSub = false;\n while (cur && cur !== this._menuContainerRef) {\n if (cur.tagName.toLowerCase() === SUBMENU_TAG) { inDeeperSub = true; break; }\n cur = cur.parentElement;\n }\n if (inDeeperSub) continue;\n if (!item.disabled) { item.focus(); return; }\n }\n }\n\n private _closeSiblingSubmenus(): void {\n const myLevel = this._parentLevel();\n for (const sub of [...NileContextSubmenu.openStack]) {\n if (sub === this) continue;\n if (sub._parentLevel() === myLevel) sub.closeSubmenu();\n }\n }\n\n private _parentLevel(): Element | null {\n const item = this._parentItem;\n if (!item) return null;\n return item.parentElement?.closest('.nile-context-menu__menu') ?? null;\n }\n\n private _onMenuMouseOver = (e: MouseEvent): void => {\n const item = e.composedPath().find(\n n => n instanceof HTMLElement && n.tagName.toLowerCase() === ITEM_TAG\n ) as NileContextMenuItem | undefined;\n if (!item || item.disabled) return;\n item.focus();\n };\n\n private _onNestedSelect = (e: CustomEvent): void => {\n if (e.target === this) return;\n if (e.detail?.type !== 'click') return;\n this.emit('nile-change', e.detail);\n };\n\n private _onMenuClick = (e: MouseEvent): void => {\n const item = e.composedPath().find(\n n => n instanceof HTMLElement && n.tagName.toLowerCase() === ITEM_TAG\n ) as NileContextMenuItem | undefined;\n if (!item || item.disabled) return;\n if (item.querySelector(`:scope > ${SUBMENU_TAG}`)) return;\n const detail = {\n id: item.id,\n value: item.value,\n name: (item.textContent ?? '').trim(),\n target: null,\n originalEvent: e,\n };\n try {\n (item as unknown as { onSelect?: (d: typeof detail) => void }).onSelect?.(detail);\n } catch (err) {\n console.error('[nile-context-submenu] onSelect callback threw:', err);\n }\n this.emit('nile-change', { type: 'click', ...detail });\n };\n\n public render(): TemplateResult {\n return html``;\n }\n}\n\nexport default NileContextSubmenu;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nile-context-submenu': NileContextSubmenu;\n }\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  // Version utility - placeholders will be replaced during build
2
- export const NILE_ELEMENTS_VERSION = '1.7.9';
2
+ export const NILE_ELEMENTS_VERSION = '1.8.0';
3
3
  export const NILE_VERSION = '1.2.6';
4
4
  // Set global versions for runtime access
5
5
  if (typeof window !== 'undefined') {
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,MAAM,CAAC,MAAM,qBAAqB,GAAG,2BAA2B,CAAC;AACjE,MAAM,CAAC,MAAM,YAAY,GAAG,kBAAkB,CAAC;AAE/C,yCAAyC;AACzC,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;IACjC,MAAc,CAAC,mBAAmB,GAAG,qBAAqB,CAAC;IAC3D,MAAc,CAAC,WAAW,GAAG,YAAY,CAAC;IAC3C,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,CAAC;AACzE,CAAC","sourcesContent":["// Version utility - placeholders will be replaced during build\nexport const NILE_ELEMENTS_VERSION = '1.7.9';\nexport const NILE_VERSION = '1.2.6';\n\n// Set global versions for runtime access\nif (typeof window !== 'undefined') {\n (window as any).nileElementsVersion = NILE_ELEMENTS_VERSION;\n (window as any).nileVersion = NILE_VERSION;\n window.process = window.process || { env: { NODE_ENV: 'production' } };\n}\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,MAAM,CAAC,MAAM,qBAAqB,GAAG,2BAA2B,CAAC;AACjE,MAAM,CAAC,MAAM,YAAY,GAAG,kBAAkB,CAAC;AAE/C,yCAAyC;AACzC,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;IACjC,MAAc,CAAC,mBAAmB,GAAG,qBAAqB,CAAC;IAC3D,MAAc,CAAC,WAAW,GAAG,YAAY,CAAC;IAC3C,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,CAAC;AACzE,CAAC","sourcesContent":["// Version utility - placeholders will be replaced during build\nexport const NILE_ELEMENTS_VERSION = '1.8.0';\nexport const NILE_VERSION = '1.2.6';\n\n// Set global versions for runtime access\nif (typeof window !== 'undefined') {\n (window as any).nileElementsVersion = NILE_ELEMENTS_VERSION;\n (window as any).nileVersion = NILE_VERSION;\n window.process = window.process || { env: { NODE_ENV: 'production' } };\n}\n"]}