@aquera/nile-elements 1.8.0 → 1.8.2

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 (80) hide show
  1. package/README.md +6 -0
  2. package/dist/index-6faafdf4.cjs.js +2 -0
  3. package/dist/index-6faafdf4.cjs.js.map +1 -0
  4. package/dist/index-9931b440.esm.js +1 -0
  5. package/dist/index.cjs.js +1 -1
  6. package/dist/index.esm.js +1 -1
  7. package/dist/index.js +375 -226
  8. package/dist/nile-combobox/index.cjs.js +1 -1
  9. package/dist/nile-combobox/index.esm.js +1 -1
  10. package/dist/nile-combobox/nile-combobox.cjs.js +1 -1
  11. package/dist/nile-combobox/nile-combobox.esm.js +1 -1
  12. package/dist/nile-context-menu/nile-context-menu.cjs.js +1 -1
  13. package/dist/nile-context-menu/nile-context-menu.cjs.js.map +1 -1
  14. package/dist/nile-context-menu/nile-context-menu.esm.js +2 -2
  15. package/dist/nile-context-menu-item/nile-context-menu-item.cjs.js +1 -1
  16. package/dist/nile-context-menu-item/nile-context-menu-item.cjs.js.map +1 -1
  17. package/dist/nile-context-menu-item/nile-context-menu-item.esm.js +3 -3
  18. package/dist/nile-context-submenu/nile-context-submenu.cjs.js +1 -1
  19. package/dist/nile-context-submenu/nile-context-submenu.cjs.js.map +1 -1
  20. package/dist/nile-context-submenu/nile-context-submenu.esm.js +2 -2
  21. package/dist/nile-detail/index.cjs.js +1 -1
  22. package/dist/nile-detail/index.esm.js +1 -1
  23. package/dist/nile-detail/nile-detail.cjs.js +1 -1
  24. package/dist/nile-detail/nile-detail.esm.js +1 -1
  25. package/dist/nile-floating-panel/nile-floating-panel.cjs.js +1 -1
  26. package/dist/nile-floating-panel/nile-floating-panel.cjs.js.map +1 -1
  27. package/dist/nile-floating-panel/nile-floating-panel.esm.js +1 -1
  28. package/dist/nile-slider/nile-slider.cjs.js +1 -1
  29. package/dist/nile-slider/nile-slider.cjs.js.map +1 -1
  30. package/dist/nile-slider/nile-slider.css.cjs.js +1 -1
  31. package/dist/nile-slider/nile-slider.css.cjs.js.map +1 -1
  32. package/dist/nile-slider/nile-slider.css.esm.js +162 -41
  33. package/dist/nile-slider/nile-slider.esm.js +5 -3
  34. package/dist/nile-slider/nile-slider.template.cjs.js +1 -1
  35. package/dist/nile-slider/nile-slider.template.cjs.js.map +1 -1
  36. package/dist/nile-slider/nile-slider.template.esm.js +49 -23
  37. package/dist/nile-slider/utils/nile-slider.utils.cjs.js +1 -1
  38. package/dist/nile-slider/utils/nile-slider.utils.cjs.js.map +1 -1
  39. package/dist/nile-slider/utils/nile-slider.utils.esm.js +1 -1
  40. package/dist/src/nile-context-menu/nile-context-menu.d.ts +10 -1
  41. package/dist/src/nile-context-menu/nile-context-menu.js +85 -5
  42. package/dist/src/nile-context-menu/nile-context-menu.js.map +1 -1
  43. package/dist/src/nile-context-menu-item/nile-context-menu-item.d.ts +1 -0
  44. package/dist/src/nile-context-menu-item/nile-context-menu-item.js +5 -1
  45. package/dist/src/nile-context-menu-item/nile-context-menu-item.js.map +1 -1
  46. package/dist/src/nile-context-submenu/nile-context-submenu.d.ts +9 -0
  47. package/dist/src/nile-context-submenu/nile-context-submenu.js +100 -16
  48. package/dist/src/nile-context-submenu/nile-context-submenu.js.map +1 -1
  49. package/dist/src/nile-floating-panel/nile-floating-panel.d.ts +2 -0
  50. package/dist/src/nile-floating-panel/nile-floating-panel.js +4 -0
  51. package/dist/src/nile-floating-panel/nile-floating-panel.js.map +1 -1
  52. package/dist/src/nile-slider/nile-slider.css.js +160 -39
  53. package/dist/src/nile-slider/nile-slider.css.js.map +1 -1
  54. package/dist/src/nile-slider/nile-slider.d.ts +5 -1
  55. package/dist/src/nile-slider/nile-slider.js +23 -1
  56. package/dist/src/nile-slider/nile-slider.js.map +1 -1
  57. package/dist/src/nile-slider/nile-slider.template.d.ts +2 -0
  58. package/dist/src/nile-slider/nile-slider.template.js +38 -1
  59. package/dist/src/nile-slider/nile-slider.template.js.map +1 -1
  60. package/dist/src/nile-slider/types/nile-slider.types.d.ts +1 -0
  61. package/dist/src/nile-slider/types/nile-slider.types.js.map +1 -1
  62. package/dist/src/nile-slider/utils/nile-slider.utils.js +4 -0
  63. package/dist/src/nile-slider/utils/nile-slider.utils.js.map +1 -1
  64. package/dist/src/version.js +1 -1
  65. package/dist/src/version.js.map +1 -1
  66. package/dist/tsconfig.tsbuildinfo +1 -1
  67. package/package.json +1 -1
  68. package/src/nile-context-menu/nile-context-menu.ts +86 -8
  69. package/src/nile-context-menu-item/nile-context-menu-item.ts +3 -1
  70. package/src/nile-context-submenu/nile-context-submenu.ts +97 -12
  71. package/src/nile-floating-panel/nile-floating-panel.ts +5 -0
  72. package/src/nile-slider/nile-slider.css.ts +160 -39
  73. package/src/nile-slider/nile-slider.template.ts +45 -2
  74. package/src/nile-slider/nile-slider.ts +11 -3
  75. package/src/nile-slider/types/nile-slider.types.ts +2 -0
  76. package/src/nile-slider/utils/nile-slider.utils.ts +2 -0
  77. package/vscode-html-custom-data.json +51 -12
  78. package/dist/index-644974d4.esm.js +0 -1
  79. package/dist/index-dd2af8ec.cjs.js +0 -2
  80. package/dist/index-dd2af8ec.cjs.js.map +0 -1
@@ -36,14 +36,23 @@ let NileContextMenu = NileContextMenu_1 = class NileContextMenu extends NileElem
36
36
  this.trigger = 'right';
37
37
  this.skipOn = '';
38
38
  this.zIndex = 9999;
39
+ this.open = false;
39
40
  this.items = [];
40
41
  this._items = [];
41
42
  this._open = false;
43
+ this._pinned = false;
42
44
  this._openContext = null;
43
45
  this._targetEl = null;
44
46
  this._previouslyFocused = null;
45
47
  this._proxyId = `nile-context-menu-anchor-${++proxyIdSeq}`;
46
48
  this._wasDataMode = false;
49
+ /** Re-anchor a pinned menu to its target after layout changes. */
50
+ this._onPinnedReposition = () => {
51
+ if (!this._open || !this._pinned || !this._targetEl)
52
+ return;
53
+ const rect = this._targetEl.getBoundingClientRect();
54
+ this._positionProxyAt(rect.left, rect.bottom);
55
+ };
47
56
  this._menuContainerRef = null;
48
57
  this._onKeydown = (e) => {
49
58
  if (!this._open)
@@ -84,7 +93,9 @@ let NileContextMenu = NileContextMenu_1 = class NileContextMenu extends NileElem
84
93
  if (!sub)
85
94
  return;
86
95
  e.preventDefault();
87
- sub.closeSubmenu?.();
96
+ // Pinned submenus (parent item has `open`) stay open; just move focus.
97
+ if (!sub.parentItem?.open)
98
+ sub.closeSubmenu?.();
88
99
  sub.parentItem?.focus();
89
100
  return;
90
101
  }
@@ -114,6 +125,10 @@ let NileContextMenu = NileContextMenu_1 = class NileContextMenu extends NileElem
114
125
  this._onScroll = (e) => {
115
126
  if (!this._open)
116
127
  return;
128
+ if (this._pinned) {
129
+ this._onPinnedReposition();
130
+ return;
131
+ }
117
132
  const path = e.composedPath();
118
133
  // Scroll inside the root menu container?
119
134
  if (this._menuContainerRef && path.includes(this._menuContainerRef))
@@ -147,6 +162,7 @@ let NileContextMenu = NileContextMenu_1 = class NileContextMenu extends NileElem
147
162
  };
148
163
  this._onPanelShown = (e) => {
149
164
  e.stopPropagation();
165
+ this._openPinnedSubmenus();
150
166
  };
151
167
  this._onMenuMouseOver = (e) => {
152
168
  const item = e
@@ -186,6 +202,15 @@ let NileContextMenu = NileContextMenu_1 = class NileContextMenu extends NileElem
186
202
  this._relocateLightChildren();
187
203
  });
188
204
  this._lightObserver.observe(this, { childList: true });
205
+ // Restore a declaratively-opened menu after a disconnect/reconnect.
206
+ if (this.open && !this._open) {
207
+ this.updateComplete.then(() => {
208
+ if (this.isConnected && this.open && !this._open) {
209
+ this._pinned = true;
210
+ this._openAtTarget();
211
+ }
212
+ });
213
+ }
189
214
  }
190
215
  updated(changed) {
191
216
  super.updated(changed);
@@ -209,6 +234,24 @@ let NileContextMenu = NileContextMenu_1 = class NileContextMenu extends NileElem
209
234
  this._wasDataMode = false;
210
235
  }
211
236
  }
237
+ if (changed.has('open')) {
238
+ if (this.open && !this._open) {
239
+ this._pinned = true;
240
+ this._openAtTarget();
241
+ }
242
+ else if (!this.open && this._open) {
243
+ this.close('programmatic');
244
+ }
245
+ }
246
+ }
247
+ /** Open anchored to the `for` target (used when the `open` property is set). */
248
+ _openAtTarget() {
249
+ const rect = this._targetEl?.getBoundingClientRect();
250
+ this.openAt({
251
+ x: rect ? rect.left : 0,
252
+ y: rect ? rect.bottom : 0,
253
+ target: this._targetEl ?? undefined,
254
+ });
212
255
  }
213
256
  _resolveTarget() {
214
257
  const value = this.for?.trim();
@@ -251,7 +294,7 @@ let NileContextMenu = NileContextMenu_1 = class NileContextMenu extends NileElem
251
294
  me.preventDefault();
252
295
  if (this._open)
253
296
  return;
254
- this.open({
297
+ this.openAt({
255
298
  x: me.clientX,
256
299
  y: me.clientY,
257
300
  target: me.target ?? undefined,
@@ -272,7 +315,7 @@ let NileContextMenu = NileContextMenu_1 = class NileContextMenu extends NileElem
272
315
  const handler = (e) => {
273
316
  const me = e;
274
317
  me.preventDefault();
275
- this.open({
318
+ this.openAt({
276
319
  x: me.clientX,
277
320
  y: me.clientY,
278
321
  target,
@@ -285,7 +328,7 @@ let NileContextMenu = NileContextMenu_1 = class NileContextMenu extends NileElem
285
328
  if (wantsClick) {
286
329
  const handler = (e) => {
287
330
  const me = e;
288
- this.open({
331
+ this.openAt({
289
332
  x: me.clientX,
290
333
  y: me.clientY,
291
334
  target,
@@ -315,6 +358,7 @@ let NileContextMenu = NileContextMenu_1 = class NileContextMenu extends NileElem
315
358
  document.removeEventListener('pointerdown', this._onOutsidePointer, true);
316
359
  document.removeEventListener('keydown', this._onKeydown, true);
317
360
  window.removeEventListener('scroll', this._onScroll, true);
361
+ window.removeEventListener('resize', this._onPinnedReposition);
318
362
  this._proxyEl?.remove();
319
363
  this._proxyEl = undefined;
320
364
  }
@@ -355,8 +399,21 @@ let NileContextMenu = NileContextMenu_1 = class NileContextMenu extends NileElem
355
399
  _positionProxyAt(x, y) {
356
400
  if (!this._proxyEl)
357
401
  return;
402
+ if (this._pinned && this._targetEl) {
403
+ // menu attaches below it pinned menus (or flips cleanly above it)
404
+ const rect = this._targetEl.getBoundingClientRect();
405
+ this._proxyEl.style.position = 'absolute';
406
+ this._proxyEl.style.left = `${rect.left + window.scrollX}px`;
407
+ this._proxyEl.style.top = `${rect.top + window.scrollY}px`;
408
+ this._proxyEl.style.width = `${rect.width}px`;
409
+ this._proxyEl.style.height = `${rect.height}px`;
410
+ return;
411
+ }
412
+ this._proxyEl.style.position = 'fixed';
358
413
  this._proxyEl.style.left = `${x}px`;
359
414
  this._proxyEl.style.top = `${y}px`;
415
+ this._proxyEl.style.width = '0';
416
+ this._proxyEl.style.height = '0';
360
417
  }
361
418
  _relocateLightChildren() {
362
419
  if (!this._menuContainerRef)
@@ -399,6 +456,8 @@ let NileContextMenu = NileContextMenu_1 = class NileContextMenu extends NileElem
399
456
  item.value = data.value ?? data.id ?? '';
400
457
  if (data.disabled)
401
458
  item.disabled = true;
459
+ if (data.open)
460
+ item.open = true;
402
461
  if (data.icon) {
403
462
  const glyph = document.createElement('nile-glyph');
404
463
  glyph.setAttribute('slot', 'icon');
@@ -448,7 +507,7 @@ let NileContextMenu = NileContextMenu_1 = class NileContextMenu extends NileElem
448
507
  get isOpen() {
449
508
  return this._open;
450
509
  }
451
- open(options) {
510
+ openAt(options) {
452
511
  if (this._open)
453
512
  return;
454
513
  for (const other of NileContextMenu_1._openInstances) {
@@ -465,12 +524,16 @@ let NileContextMenu = NileContextMenu_1 = class NileContextMenu extends NileElem
465
524
  this._ensureProxy();
466
525
  this._positionProxyAt(options.x, options.y);
467
526
  this._open = true;
527
+ this.open = true;
468
528
  NileContextMenu_1._openInstances.add(this);
469
529
  document.addEventListener('pointerdown', this._onOutsidePointer, true);
470
530
  document.addEventListener('keydown', this._onKeydown, true);
531
+ if (this._pinned)
532
+ window.addEventListener('resize', this._onPinnedReposition);
471
533
  requestAnimationFrame(() => {
472
534
  if (this._open)
473
535
  window.addEventListener('scroll', this._onScroll, true);
536
+ requestAnimationFrame(() => this._openPinnedSubmenus());
474
537
  });
475
538
  this.emit('nile-change', { type: 'open', ...this._openContext });
476
539
  }
@@ -478,6 +541,8 @@ let NileContextMenu = NileContextMenu_1 = class NileContextMenu extends NileElem
478
541
  if (!this._open)
479
542
  return;
480
543
  this._open = false;
544
+ this.open = false;
545
+ this._pinned = false;
481
546
  this._openContext = null;
482
547
  NileContextMenu_1._openInstances.delete(this);
483
548
  const subs = this._menuContainerRef?.querySelectorAll(SUBMENU_TAG);
@@ -485,6 +550,7 @@ let NileContextMenu = NileContextMenu_1 = class NileContextMenu extends NileElem
485
550
  document.removeEventListener('pointerdown', this._onOutsidePointer, true);
486
551
  document.removeEventListener('keydown', this._onKeydown, true);
487
552
  window.removeEventListener('scroll', this._onScroll, true);
553
+ window.removeEventListener('resize', this._onPinnedReposition);
488
554
  const active = document.activeElement;
489
555
  const focusInMenu = active === this ||
490
556
  this._items.some(item => item === active || item.shadowRoot?.contains(active));
@@ -547,6 +613,17 @@ let NileContextMenu = NileContextMenu_1 = class NileContextMenu extends NileElem
547
613
  _stop(e) {
548
614
  e.stopPropagation();
549
615
  }
616
+ /** Open the submenu of every top-level item carrying the `open` attribute. */
617
+ _openPinnedSubmenus() {
618
+ if (!this._open || !this._menuContainerRef)
619
+ return;
620
+ for (const item of this._items) {
621
+ if (!item.open || item.disabled)
622
+ continue;
623
+ const sub = item.querySelector(`:scope > ${SUBMENU_TAG}`);
624
+ sub?.openSubmenu?.();
625
+ }
626
+ }
550
627
  _selectItem(item) {
551
628
  const detail = {
552
629
  id: item.id,
@@ -605,6 +682,9 @@ __decorate([
605
682
  __decorate([
606
683
  property({ attribute: true, type: Number, reflect: true })
607
684
  ], NileContextMenu.prototype, "zIndex", void 0);
685
+ __decorate([
686
+ property({ attribute: true, type: Boolean, reflect: true })
687
+ ], NileContextMenu.prototype, "open", void 0);
608
688
  __decorate([
609
689
  property({ attribute: false })
610
690
  ], NileContextMenu.prototype, "items", void 0);
@@ -1 +1 @@
1
- {"version":3,"file":"nile-context-menu.js","sourceRoot":"","sources":["../../../src/nile-context-menu/nile-context-menu.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 } from 'lit';\nimport type { PropertyValues } from 'lit';\nimport { customElement, property, query, state } from 'lit/decorators.js';\nimport { styles } from './nile-context-menu.css';\nimport NileElement from '../internal/nile-element';\nimport type { NileContextMenuItem } from '../nile-context-menu-item';\nimport type { NileContextMenuGroup } from '../nile-context-menu-group';\nimport '../nile-floating-panel';\nimport '../nile-context-menu-group';\nimport '../nile-context-menu-item';\nimport '../nile-context-submenu';\n\n// Data-driven menu entry\nexport interface NileContextMenuItemData {\n type: 'item';\n id: string;\n label: string;\n value?: string;\n disabled?: boolean;\n icon?: string;\n iconSet?: string;\n iconSize?: string;\n iconMethod?: 'fill' | 'stroke' | string;\n iconColor?: string;\n submenu?: NileContextMenuData[];\n}\n\nexport interface NileContextMenuGroupData {\n type: 'group';\n name?: string;\n data: NileContextMenuItemData[];\n}\n\nexport type NileContextMenuData = NileContextMenuGroupData;\n\nconst ITEM_TAG = 'nile-context-menu-item';\nconst SUBMENU_TAG = 'nile-context-submenu';\nconst MENU_CONTAINER_CLASS = 'nile-context-menu__menu';\nconst OBSERVED_ITEM_ATTRS = ['value', 'disabled'];\n\nexport type NileContextMenuTrigger = 'right' | 'left' | 'both' | 'manual' | 'global';\n\nexport interface NileContextMenuOpenOptions {\n x: number;\n y: number;\n target?: Element;\n originalEvent?: Event;\n}\n\nexport type NileContextMenuCloseReason =\n | 'select'\n | 'outside-click'\n | 'escape'\n | 'programmatic';\n\ninterface NileContextMenuOpenContext {\n x: number;\n y: number;\n target: Element | null;\n originalEvent: Event | null;\n}\n\nlet proxyIdSeq = 0;\n\n/**\n * Nile context-menu component.\n *\n * @tag nile-context-menu\n *\n * @slot Default menu content.\n *\n * @event nile-change Fired on menu lifecycle and selection. `detail.type` is one of\n * `'open'`, `'click'`, or `'close'`; remaining fields depend on the type.\n */\n@customElement('nile-context-menu')\nexport class NileContextMenu extends NileElement {\n public static get styles(): CSSResultArray {\n return [styles];\n }\n\n \n @property({ attribute: true, type: String, reflect: true }) for = '';\n \n @property({ attribute: true, type: String, reflect: true }) trigger: NileContextMenuTrigger = 'right';\n \n @property({ attribute: true, type: String, reflect: true }) skipOn = '';\n \n @property({ attribute: true, type: Number, reflect: true }) zIndex = 9999;\n \n @property({ attribute: false }) public items: NileContextMenuData[] = [];\n \n private get _isDataMode(): boolean {\n return Array.isArray(this.items) && this.items.length > 0;\n }\n @query('nile-floating-panel') private _floatingPanel?: HTMLElement;\n \n @state() private _items: NileContextMenuItem[] = [];\n \n @state() private _open = false;\n \n protected _openContext: NileContextMenuOpenContext | null = null;\n \n protected _targetEl: Element | null = null;\n \n private _previouslyFocused: HTMLElement | null = null;\n \n private static _openInstances = new Set<NileContextMenu>();\n \n private _detachTriggers?: () => void;\n private _lightObserver?: MutationObserver;\n private _menuObserver?: MutationObserver;\n \n private _proxyEl?: HTMLDivElement;\n private readonly _proxyId = `nile-context-menu-anchor-${++proxyIdSeq}`;\n \n private _wasDataMode = false;\n\n public override connectedCallback(): void {\n super.connectedCallback();\n this._ensureProxy();\n this._resolveTarget();\n this._attachTriggers();\n this._lightObserver = new MutationObserver(() => {\n if (this._isDataMode) return;\n this._relocateLightChildren();\n });\n this._lightObserver.observe(this, { childList: true });\n }\n\n protected override updated(changed: PropertyValues): void {\n super.updated(changed);\n if ((changed.has('for') || changed.has('trigger') || changed.has('skipOn')) && this._open) {\n this.close('programmatic');\n }\n if (changed.has('for')) {\n this._resolveTarget();\n this._attachTriggers();\n } else if (changed.has('trigger') || changed.has('skipOn')) {\n this._attachTriggers();\n }\n if (changed.has('items') && this._menuContainerRef) {\n if (this._isDataMode) {\n this._renderDataItems();\n this._wasDataMode = true;\n } else if (this._wasDataMode) {\n this._renderDataItems();\n this._wasDataMode = false;\n }\n }\n }\n\n private _resolveTarget(): void {\n const value = this.for?.trim();\n if (!value) {\n this._targetEl = null;\n return;\n }\n const root = (this.getRootNode() as Document | ShadowRoot) ?? document;\n if (/^[#.\\[:]/.test(value)) {\n this._targetEl = (root as ParentNode).querySelector(value);\n } else if ('getElementById' in root) {\n this._targetEl = (root as Document | ShadowRoot).getElementById(value);\n } else {\n this._targetEl = document.getElementById(value);\n }\n }\n\n public get targetElement(): Element | null {\n return this._targetEl;\n }\n\n private _attachTriggers(): void {\n this._detachTriggers?.();\n this._detachTriggers = undefined;\n\n const trigger = this.trigger;\n if (trigger === 'manual') return;\n\n const cleanups: Array<() => void> = [];\n\n if (trigger === 'global') {\n const skipSelector = this.skipOn?.trim() ?? '';\n const isInteractive = (el: Element | null): boolean => {\n if (!el || !skipSelector) return false;\n return !!el.closest(skipSelector);\n };\n const handler = (e: Event) => {\n const me = e as MouseEvent;\n if (isInteractive(me.target as Element | null)) return;\n me.preventDefault();\n if (this._open) return;\n this.open({\n x: me.clientX,\n y: me.clientY,\n target: (me.target as Element | null) ?? undefined,\n originalEvent: me,\n });\n };\n window.addEventListener('contextmenu', handler, true);\n cleanups.push(() => window.removeEventListener('contextmenu', handler, true));\n this._detachTriggers = () => cleanups.forEach(fn => fn());\n return;\n }\n\n const target = this._targetEl;\n if (!target) return;\n\n const wantsContext = trigger === 'right' || trigger === 'both';\n const wantsClick = trigger === 'left' || trigger === 'both';\n\n if (wantsContext) {\n const handler = (e: Event) => {\n const me = e as MouseEvent;\n me.preventDefault();\n this.open({\n x: me.clientX,\n y: me.clientY,\n target,\n originalEvent: me,\n });\n };\n target.addEventListener('contextmenu', handler);\n cleanups.push(() => target.removeEventListener('contextmenu', handler));\n }\n\n if (wantsClick) {\n const handler = (e: Event) => {\n const me = e as MouseEvent;\n this.open({\n x: me.clientX,\n y: me.clientY,\n target,\n originalEvent: me,\n });\n };\n target.addEventListener('click', handler);\n cleanups.push(() => target.removeEventListener('click', handler));\n }\n\n if (cleanups.length === 0) return;\n this._detachTriggers = () => cleanups.forEach(fn => fn());\n }\n\n public override disconnectedCallback(): void {\n super.disconnectedCallback();\n NileContextMenu._openInstances.delete(this);\n this._open = false;\n this._detachTriggers?.();\n this._detachTriggers = undefined;\n this._lightObserver?.disconnect();\n this._lightObserver = undefined;\n this._menuObserver?.disconnect();\n this._menuObserver = undefined;\n this._menuContainerRef?.removeEventListener('click', this._onMenuClick);\n this._menuContainerRef?.removeEventListener('mouseover', this._onMenuMouseOver);\n this._menuContainerRef?.removeEventListener(\n 'nile-change',\n this._onDescendantSelect as EventListener,\n );\n document.removeEventListener('pointerdown', this._onOutsidePointer, true);\n document.removeEventListener('keydown', this._onKeydown, true);\n window.removeEventListener('scroll', this._onScroll, true);\n this._proxyEl?.remove();\n this._proxyEl = undefined;\n }\n\n private _menuContainerRef: HTMLDivElement | null = null;\n\n protected override firstUpdated(): void {\n this._menuContainerRef = this.renderRoot.querySelector('.nile-context-menu__menu') as HTMLDivElement | null;\n if (this._isDataMode) {\n this._renderDataItems();\n this._wasDataMode = true;\n } else {\n this._relocateLightChildren();\n }\n if (this._menuContainerRef) {\n this._menuObserver = new MutationObserver(() => this._parseChildren());\n this._menuObserver.observe(this._menuContainerRef, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: OBSERVED_ITEM_ATTRS,\n });\n this._menuContainerRef.addEventListener('click', this._onMenuClick);\n this._menuContainerRef.addEventListener('mouseover', this._onMenuMouseOver);\n this._menuContainerRef.addEventListener(\n 'nile-change',\n this._onDescendantSelect as EventListener,\n );\n }\n this._parseChildren();\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 _positionProxyAt(x: number, y: number): void {\n if (!this._proxyEl) return;\n this._proxyEl.style.left = `${x}px`;\n this._proxyEl.style.top = `${y}px`;\n }\n\n private _relocateLightChildren(): void {\n if (!this._menuContainerRef) return;\n const kids = Array.from(this.children);\n if (kids.length === 0) return;\n for (const kid of kids) {\n this._menuContainerRef.appendChild(kid);\n }\n }\n\n private _renderDataItems(): void {\n const container = this._menuContainerRef;\n if (!container) return;\n while (container.firstChild) container.removeChild(container.firstChild);\n for (const entry of this.items) {\n const node = this._createDataNode(entry);\n if (node) container.appendChild(node);\n }\n }\n\n private _createDataNode(entry: NileContextMenuData): HTMLElement | null {\n if (entry.type === 'group') {\n const group = document.createElement('nile-context-menu-group') as NileContextMenuGroup;\n if (entry.name) group.label = entry.name;\n for (const item of entry.data ?? []) {\n group.appendChild(this._createItemNode(item));\n }\n return group;\n }\n return null;\n }\n\n private _createItemNode(data: NileContextMenuItemData): NileContextMenuItem {\n const item = document.createElement('nile-context-menu-item') as NileContextMenuItem;\n if (data.id) item.id = data.id;\n item.value = data.value ?? data.id ?? '';\n if (data.disabled) item.disabled = true;\n if (data.icon) {\n const glyph = document.createElement('nile-glyph');\n glyph.setAttribute('slot', 'icon');\n glyph.setAttribute('name', data.icon);\n if (data.iconSet) glyph.setAttribute('set', data.iconSet);\n if (data.iconSize) glyph.setAttribute('size', data.iconSize);\n if (data.iconMethod) glyph.setAttribute('method', data.iconMethod);\n if (data.iconColor) glyph.setAttribute('color', data.iconColor);\n item.appendChild(glyph);\n }\n item.appendChild(document.createTextNode(data.label));\n if (data.submenu && data.submenu.length > 0) {\n const submenu = document.createElement('nile-context-submenu');\n for (const entry of data.submenu) {\n const node = this._createDataNode(entry);\n if (node) submenu.appendChild(node);\n }\n item.appendChild(submenu);\n }\n return item;\n }\n\n private _parseChildren(): void {\n const root: Element = this._menuContainerRef ?? this;\n const all = Array.from(root.querySelectorAll(ITEM_TAG)) as NileContextMenuItem[];\n this._items = all.filter(item => !this._isInsideDescendantSubmenu(item, root));\n }\n\n private _isInsideDescendantSubmenu(item: Element, container: Element): boolean {\n let cur: Element | null = item.parentElement;\n while (cur && cur !== container) {\n if (cur.tagName.toLowerCase() === SUBMENU_TAG) return true;\n cur = cur.parentElement;\n }\n return false;\n }\n\n public get menuItems(): readonly NileContextMenuItem[] {\n return this._items;\n }\n\n public getItemByValue(value: string): NileContextMenuItem | undefined {\n return this._items.find(item => item.value === value);\n }\n\n public get isOpen(): boolean {\n return this._open;\n }\n\n public open(options: NileContextMenuOpenOptions): void {\n if (this._open) return;\n for (const other of NileContextMenu._openInstances) {\n if (other !== this) other.close('programmatic');\n }\n this._previouslyFocused = document.activeElement as HTMLElement | null;\n this._openContext = {\n x: options.x,\n y: options.y,\n target: options.target ?? null,\n originalEvent: options.originalEvent ?? null,\n };\n this._ensureProxy();\n this._positionProxyAt(options.x, options.y);\n this._open = true;\n NileContextMenu._openInstances.add(this);\n document.addEventListener('pointerdown', this._onOutsidePointer, true);\n document.addEventListener('keydown', this._onKeydown, true);\n requestAnimationFrame(() => {\n if (this._open) window.addEventListener('scroll', this._onScroll, true);\n });\n this.emit('nile-change', { type: 'open', ...this._openContext });\n }\n\n public close(reason: NileContextMenuCloseReason = 'programmatic'): void {\n if (!this._open) return;\n this._open = false;\n this._openContext = null;\n NileContextMenu._openInstances.delete(this);\n const subs = this._menuContainerRef?.querySelectorAll(SUBMENU_TAG);\n subs?.forEach(s => (s as unknown as { closeSubmenu?: () => void }).closeSubmenu?.());\n document.removeEventListener('pointerdown', this._onOutsidePointer, true);\n document.removeEventListener('keydown', this._onKeydown, true);\n window.removeEventListener('scroll', this._onScroll, true);\n const active = document.activeElement;\n const focusInMenu =\n active === this ||\n this._items.some(item => item === active || item.shadowRoot?.contains(active as Node));\n if (focusInMenu) {\n this._previouslyFocused?.focus?.();\n }\n this._previouslyFocused = null;\n this.emit('nile-change', { type: 'close', reason });\n }\n\n private _enabledItems(): NileContextMenuItem[] {\n return this._items.filter(item => !item.disabled);\n }\n\n private _getFocusedItem(): NileContextMenuItem | null {\n const active = document.activeElement;\n for (const item of this._items) {\n if (item === active || item.shadowRoot?.contains(active as Node)) return item;\n }\n return null;\n }\n\n private _getFocusedItemAnyLevel(): {\n item: NileContextMenuItem | null;\n container: Element | null;\n } {\n let node: Element | null = document.activeElement as Element | null;\n while (node && node.tagName?.toLowerCase() !== ITEM_TAG) {\n const root = node.getRootNode();\n node = root instanceof ShadowRoot ? root.host : node.parentElement;\n }\n if (!node) return { item: null, container: null };\n const container = node.closest(`.${MENU_CONTAINER_CLASS}`);\n return { item: node as NileContextMenuItem, container };\n }\n\n private _enabledItemsIn(container: Element): NileContextMenuItem[] {\n const all = Array.from(container.querySelectorAll(ITEM_TAG)) as NileContextMenuItem[];\n return all.filter(item => {\n if (item.disabled) return false;\n return !this._isInsideDescendantSubmenu(item, container);\n });\n }\n\n private _focusFirstEnabled(): void {\n const enabled = this._enabledItems();\n enabled[0]?.focus();\n }\n\n private _moveFocus(delta: number): void {\n const { item: focused, container } = this._getFocusedItemAnyLevel();\n const root: Element = container ?? this._menuContainerRef ?? this;\n const enabled = this._enabledItemsIn(root);\n if (enabled.length === 0) return;\n const current = focused ? enabled.indexOf(focused) : -1;\n const next = current + delta;\n const wrapped = ((next % enabled.length) + enabled.length) % enabled.length;\n enabled[wrapped].focus();\n }\n\n private _onKeydown = (e: KeyboardEvent): void => {\n if (!this._open) return;\n switch (e.key) {\n case 'Escape':\n e.preventDefault();\n this.close('escape');\n return;\n case 'Tab':\n this.close('programmatic');\n return;\n case 'ArrowDown':\n e.preventDefault();\n this._moveFocus(1);\n return;\n case 'ArrowUp':\n e.preventDefault();\n this._moveFocus(-1);\n return;\n case 'ArrowRight': {\n const { item } = this._getFocusedItemAnyLevel();\n const sub = item?.querySelector(`:scope > ${SUBMENU_TAG}`) as\n | (HTMLElement & { openSubmenu?: () => void })\n | null;\n if (!sub) return;\n e.preventDefault();\n sub.openSubmenu?.();\n requestAnimationFrame(() => {\n (sub as unknown as { focusFirstItem?: () => void }).focusFirstItem?.();\n });\n return;\n }\n case 'ArrowLeft': {\n const { item, container } = this._getFocusedItemAnyLevel();\n if (!item || !container) return;\n const sub = this._findSubmenuOwning(container);\n if (!sub) return;\n e.preventDefault();\n sub.closeSubmenu?.();\n sub.parentItem?.focus();\n return;\n }\n case 'Enter':\n case ' ': {\n e.preventDefault();\n const { item } = this._getFocusedItemAnyLevel();\n if (!item || item.disabled) return;\n const sub = item.querySelector(`:scope > ${SUBMENU_TAG}`) as\n | (HTMLElement & { openSubmenu?: () => void })\n | null;\n if (sub) {\n sub.openSubmenu?.();\n requestAnimationFrame(() => {\n const panel = sub.shadowRoot?.querySelector(`.${MENU_CONTAINER_CLASS}`);\n const first = panel\n ? (this._enabledItemsIn(panel)[0] as NileContextMenuItem | undefined)\n : undefined;\n first?.focus();\n });\n return;\n }\n this._selectItem(item);\n return;\n }\n }\n };\n\n private _findSubmenuOwning(container: Element):\n | (HTMLElement & { closeSubmenu?: () => void; parentItem?: NileContextMenuItem | null })\n | null {\n type SubCtor = {\n findByContainer?: (c: Element) => HTMLElement & {\n closeSubmenu?: () => void;\n parentItem?: NileContextMenuItem | null;\n } | null;\n };\n const customElements = window.customElements;\n const ctor = customElements.get(SUBMENU_TAG) as unknown as SubCtor | undefined;\n return ctor?.findByContainer?.(container) ?? null;\n }\n\n private _onScroll = (e: Event): void => {\n if (!this._open) return;\n const path = e.composedPath();\n // Scroll inside the root menu container?\n if (this._menuContainerRef && path.includes(this._menuContainerRef)) return;\n // Scroll inside any descendant submenu's portaled panel?\n for (const node of path) {\n if (node instanceof HTMLElement && node.classList?.contains(MENU_CONTAINER_CLASS)) {\n return;\n }\n }\n this.close('programmatic');\n };\n\n private _onOutsidePointer = (e: Event): void => {\n if (!this._open) return;\n const path = e.composedPath();\n if (this._menuContainerRef && path.includes(this._menuContainerRef)) return;\n for (const node of path) {\n if (\n node instanceof HTMLElement &&\n node.classList?.contains(MENU_CONTAINER_CLASS)\n ) {\n return;\n }\n }\n this.close('outside-click');\n };\n\n private _onDescendantSelect = (e: CustomEvent): void => {\n if (e.detail?.type !== 'click') return;\n this.close('select');\n };\n private _stop(e: Event): void {\n e.stopPropagation();\n }\n\n private _onPanelShown = (e: Event): void => {\n e.stopPropagation();\n };\n\n private _onMenuMouseOver = (e: MouseEvent): void => {\n const item = e\n .composedPath()\n .find(\n node =>\n node instanceof HTMLElement &&\n node.tagName.toLowerCase() === ITEM_TAG\n ) as NileContextMenuItem | undefined;\n if (!item || item.disabled) return;\n item.focus();\n };\n\n private _onMenuClick = (e: MouseEvent): void => {\n const item = e\n .composedPath()\n .find(\n node =>\n node instanceof HTMLElement &&\n node.tagName.toLowerCase() === ITEM_TAG\n ) as NileContextMenuItem | undefined;\n\n if (!item || item.disabled) return;\n if (item.querySelector(`:scope > ${SUBMENU_TAG}`)) return;\n this._selectItem(item);\n };\n\n private _selectItem(item: NileContextMenuItem): void {\n const detail = {\n id: item.id,\n value: item.value,\n name: (item.textContent ?? '').trim(),\n target: this._openContext?.target ?? null,\n originalEvent: this._openContext?.originalEvent ?? null,\n };\n try {\n item.onSelect?.(detail);\n } catch (err) {\n console.error('[nile-context-menu] onSelect callback threw:', err);\n }\n this.emit('nile-change', { type: 'click', ...detail });\n this.close('select');\n }\n\n public render(): TemplateResult {\n return html`\n <nile-floating-panel\n for=${this._proxyId}\n trigger=\"manual\"\n placement=\"bottom-start\"\n panelClass=\"nile-context-menu-panel\"\n .zIndex=${this.zIndex}\n ?open=${this._open}\n .interactive=${true}\n .hideOnClick=${false}\n .closeOnEscape=${false}\n .arrow=${'none'}\n .distance=${0}\n @nile-init=${this._stop}\n @nile-destroy=${this._stop}\n @nile-show=${this._stop}\n @nile-hide=${this._stop}\n @nile-after-show=${this._onPanelShown}\n @nile-after-hide=${this._stop}\n @nile-toggle=${this._stop}\n @nile-visibility-change=${this._stop}\n >\n <div class=\"nile-context-menu__menu\" role=\"menu\"></div>\n </nile-floating-panel>\n `;\n }\n}\n\nexport default NileContextMenu;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nile-context-menu': NileContextMenu;\n }\n}\n"]}
1
+ {"version":3,"file":"nile-context-menu.js","sourceRoot":"","sources":["../../../src/nile-context-menu/nile-context-menu.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 } from 'lit';\nimport type { PropertyValues } from 'lit';\nimport { customElement, property, query, state } from 'lit/decorators.js';\nimport { styles } from './nile-context-menu.css';\nimport NileElement from '../internal/nile-element';\nimport type { NileContextMenuItem } from '../nile-context-menu-item';\nimport type { NileContextMenuGroup } from '../nile-context-menu-group';\nimport '../nile-floating-panel';\nimport '../nile-context-menu-group';\nimport '../nile-context-menu-item';\nimport '../nile-context-submenu';\n\n// Data-driven menu entry\nexport interface NileContextMenuItemData {\n type: 'item';\n id: string;\n label: string;\n value?: string;\n disabled?: boolean;\n icon?: string;\n iconSet?: string;\n iconSize?: string;\n iconMethod?: 'fill' | 'stroke' | string;\n iconColor?: string;\n submenu?: NileContextMenuData[];\n open?: boolean;\n}\n\nexport interface NileContextMenuGroupData {\n type: 'group';\n name?: string;\n data: NileContextMenuItemData[];\n}\n\nexport type NileContextMenuData = NileContextMenuGroupData;\n\nconst ITEM_TAG = 'nile-context-menu-item';\nconst SUBMENU_TAG = 'nile-context-submenu';\nconst MENU_CONTAINER_CLASS = 'nile-context-menu__menu';\nconst OBSERVED_ITEM_ATTRS = ['value', 'disabled'];\n\nexport type NileContextMenuTrigger = 'right' | 'left' | 'both' | 'manual' | 'global';\n\nexport interface NileContextMenuOpenOptions {\n x: number;\n y: number;\n target?: Element;\n originalEvent?: Event;\n}\n\nexport type NileContextMenuCloseReason =\n | 'select'\n | 'outside-click'\n | 'escape'\n | 'programmatic';\n\ninterface NileContextMenuOpenContext {\n x: number;\n y: number;\n target: Element | null;\n originalEvent: Event | null;\n}\n\nlet proxyIdSeq = 0;\n\n/**\n * Nile context-menu component.\n *\n * @tag nile-context-menu\n *\n * @slot Default menu content.\n *\n * @event nile-change Fired on menu lifecycle and selection. `detail.type` is one of\n * `'open'`, `'click'`, or `'close'`; remaining fields depend on the type.\n */\n@customElement('nile-context-menu')\nexport class NileContextMenu extends NileElement {\n public static get styles(): CSSResultArray {\n return [styles];\n }\n\n \n @property({ attribute: true, type: String, reflect: true }) for = '';\n \n @property({ attribute: true, type: String, reflect: true }) trigger: NileContextMenuTrigger = 'right';\n \n @property({ attribute: true, type: String, reflect: true }) skipOn = '';\n \n @property({ attribute: true, type: Number, reflect: true }) zIndex = 9999;\n\n @property({ attribute: true, type: Boolean, reflect: true }) open = false;\n\n @property({ attribute: false }) public items: NileContextMenuData[] = [];\n \n private get _isDataMode(): boolean {\n return Array.isArray(this.items) && this.items.length > 0;\n }\n @query('nile-floating-panel') private _floatingPanel?: HTMLElement;\n \n @state() private _items: NileContextMenuItem[] = [];\n\n @state() private _open = false;\n\n private _pinned = false;\n\n protected _openContext: NileContextMenuOpenContext | null = null;\n \n protected _targetEl: Element | null = null;\n \n private _previouslyFocused: HTMLElement | null = null;\n \n private static _openInstances = new Set<NileContextMenu>();\n \n private _detachTriggers?: () => void;\n private _lightObserver?: MutationObserver;\n private _menuObserver?: MutationObserver;\n \n private _proxyEl?: HTMLDivElement;\n private readonly _proxyId = `nile-context-menu-anchor-${++proxyIdSeq}`;\n \n private _wasDataMode = false;\n\n public override connectedCallback(): void {\n super.connectedCallback();\n this._ensureProxy();\n this._resolveTarget();\n this._attachTriggers();\n this._lightObserver = new MutationObserver(() => {\n if (this._isDataMode) return;\n this._relocateLightChildren();\n });\n this._lightObserver.observe(this, { childList: true });\n // Restore a declaratively-opened menu after a disconnect/reconnect.\n if (this.open && !this._open) {\n this.updateComplete.then(() => {\n if (this.isConnected && this.open && !this._open) {\n this._pinned = true;\n this._openAtTarget();\n }\n });\n }\n }\n\n protected override updated(changed: PropertyValues): void {\n super.updated(changed);\n if ((changed.has('for') || changed.has('trigger') || changed.has('skipOn')) && this._open) {\n this.close('programmatic');\n }\n if (changed.has('for')) {\n this._resolveTarget();\n this._attachTriggers();\n } else if (changed.has('trigger') || changed.has('skipOn')) {\n this._attachTriggers();\n }\n if (changed.has('items') && this._menuContainerRef) {\n if (this._isDataMode) {\n this._renderDataItems();\n this._wasDataMode = true;\n } else if (this._wasDataMode) {\n this._renderDataItems();\n this._wasDataMode = false;\n }\n }\n if (changed.has('open')) {\n if (this.open && !this._open) {\n this._pinned = true;\n this._openAtTarget();\n } else if (!this.open && this._open) {\n this.close('programmatic');\n }\n }\n }\n\n /** Open anchored to the `for` target (used when the `open` property is set). */\n private _openAtTarget(): void {\n const rect = this._targetEl?.getBoundingClientRect();\n this.openAt({\n x: rect ? rect.left : 0,\n y: rect ? rect.bottom : 0,\n target: this._targetEl ?? undefined,\n });\n }\n\n /** Re-anchor a pinned menu to its target after layout changes. */\n private _onPinnedReposition = (): void => {\n if (!this._open || !this._pinned || !this._targetEl) return;\n const rect = this._targetEl.getBoundingClientRect();\n this._positionProxyAt(rect.left, rect.bottom);\n };\n\n private _resolveTarget(): void {\n const value = this.for?.trim();\n if (!value) {\n this._targetEl = null;\n return;\n }\n const root = (this.getRootNode() as Document | ShadowRoot) ?? document;\n if (/^[#.\\[:]/.test(value)) {\n this._targetEl = (root as ParentNode).querySelector(value);\n } else if ('getElementById' in root) {\n this._targetEl = (root as Document | ShadowRoot).getElementById(value);\n } else {\n this._targetEl = document.getElementById(value);\n }\n }\n\n public get targetElement(): Element | null {\n return this._targetEl;\n }\n\n private _attachTriggers(): void {\n this._detachTriggers?.();\n this._detachTriggers = undefined;\n\n const trigger = this.trigger;\n if (trigger === 'manual') return;\n\n const cleanups: Array<() => void> = [];\n\n if (trigger === 'global') {\n const skipSelector = this.skipOn?.trim() ?? '';\n const isInteractive = (el: Element | null): boolean => {\n if (!el || !skipSelector) return false;\n return !!el.closest(skipSelector);\n };\n const handler = (e: Event) => {\n const me = e as MouseEvent;\n if (isInteractive(me.target as Element | null)) return;\n me.preventDefault();\n if (this._open) return;\n this.openAt({\n x: me.clientX,\n y: me.clientY,\n target: (me.target as Element | null) ?? undefined,\n originalEvent: me,\n });\n };\n window.addEventListener('contextmenu', handler, true);\n cleanups.push(() => window.removeEventListener('contextmenu', handler, true));\n this._detachTriggers = () => cleanups.forEach(fn => fn());\n return;\n }\n\n const target = this._targetEl;\n if (!target) return;\n\n const wantsContext = trigger === 'right' || trigger === 'both';\n const wantsClick = trigger === 'left' || trigger === 'both';\n\n if (wantsContext) {\n const handler = (e: Event) => {\n const me = e as MouseEvent;\n me.preventDefault();\n this.openAt({\n x: me.clientX,\n y: me.clientY,\n target,\n originalEvent: me,\n });\n };\n target.addEventListener('contextmenu', handler);\n cleanups.push(() => target.removeEventListener('contextmenu', handler));\n }\n\n if (wantsClick) {\n const handler = (e: Event) => {\n const me = e as MouseEvent;\n this.openAt({\n x: me.clientX,\n y: me.clientY,\n target,\n originalEvent: me,\n });\n };\n target.addEventListener('click', handler);\n cleanups.push(() => target.removeEventListener('click', handler));\n }\n\n if (cleanups.length === 0) return;\n this._detachTriggers = () => cleanups.forEach(fn => fn());\n }\n\n public override disconnectedCallback(): void {\n super.disconnectedCallback();\n NileContextMenu._openInstances.delete(this);\n this._open = false;\n this._detachTriggers?.();\n this._detachTriggers = undefined;\n this._lightObserver?.disconnect();\n this._lightObserver = undefined;\n this._menuObserver?.disconnect();\n this._menuObserver = undefined;\n this._menuContainerRef?.removeEventListener('click', this._onMenuClick);\n this._menuContainerRef?.removeEventListener('mouseover', this._onMenuMouseOver);\n this._menuContainerRef?.removeEventListener(\n 'nile-change',\n this._onDescendantSelect as EventListener,\n );\n document.removeEventListener('pointerdown', this._onOutsidePointer, true);\n document.removeEventListener('keydown', this._onKeydown, true);\n window.removeEventListener('scroll', this._onScroll, true);\n window.removeEventListener('resize', this._onPinnedReposition);\n this._proxyEl?.remove();\n this._proxyEl = undefined;\n }\n\n private _menuContainerRef: HTMLDivElement | null = null;\n\n protected override firstUpdated(): void {\n this._menuContainerRef = this.renderRoot.querySelector('.nile-context-menu__menu') as HTMLDivElement | null;\n if (this._isDataMode) {\n this._renderDataItems();\n this._wasDataMode = true;\n } else {\n this._relocateLightChildren();\n }\n if (this._menuContainerRef) {\n this._menuObserver = new MutationObserver(() => this._parseChildren());\n this._menuObserver.observe(this._menuContainerRef, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: OBSERVED_ITEM_ATTRS,\n });\n this._menuContainerRef.addEventListener('click', this._onMenuClick);\n this._menuContainerRef.addEventListener('mouseover', this._onMenuMouseOver);\n this._menuContainerRef.addEventListener(\n 'nile-change',\n this._onDescendantSelect as EventListener,\n );\n }\n this._parseChildren();\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 _positionProxyAt(x: number, y: number): void {\n if (!this._proxyEl) return;\n if (this._pinned && this._targetEl) {\n // menu attaches below it pinned menus (or flips cleanly above it)\n const rect = this._targetEl.getBoundingClientRect();\n this._proxyEl.style.position = 'absolute';\n this._proxyEl.style.left = `${rect.left + window.scrollX}px`;\n this._proxyEl.style.top = `${rect.top + window.scrollY}px`;\n this._proxyEl.style.width = `${rect.width}px`;\n this._proxyEl.style.height = `${rect.height}px`;\n return;\n }\n this._proxyEl.style.position = 'fixed';\n this._proxyEl.style.left = `${x}px`;\n this._proxyEl.style.top = `${y}px`;\n this._proxyEl.style.width = '0';\n this._proxyEl.style.height = '0';\n }\n\n private _relocateLightChildren(): void {\n if (!this._menuContainerRef) return;\n const kids = Array.from(this.children);\n if (kids.length === 0) return;\n for (const kid of kids) {\n this._menuContainerRef.appendChild(kid);\n }\n }\n\n private _renderDataItems(): void {\n const container = this._menuContainerRef;\n if (!container) return;\n while (container.firstChild) container.removeChild(container.firstChild);\n for (const entry of this.items) {\n const node = this._createDataNode(entry);\n if (node) container.appendChild(node);\n }\n }\n\n private _createDataNode(entry: NileContextMenuData): HTMLElement | null {\n if (entry.type === 'group') {\n const group = document.createElement('nile-context-menu-group') as NileContextMenuGroup;\n if (entry.name) group.label = entry.name;\n for (const item of entry.data ?? []) {\n group.appendChild(this._createItemNode(item));\n }\n return group;\n }\n return null;\n }\n\n private _createItemNode(data: NileContextMenuItemData): NileContextMenuItem {\n const item = document.createElement('nile-context-menu-item') as NileContextMenuItem;\n if (data.id) item.id = data.id;\n item.value = data.value ?? data.id ?? '';\n if (data.disabled) item.disabled = true;\n if (data.open) item.open = true;\n if (data.icon) {\n const glyph = document.createElement('nile-glyph');\n glyph.setAttribute('slot', 'icon');\n glyph.setAttribute('name', data.icon);\n if (data.iconSet) glyph.setAttribute('set', data.iconSet);\n if (data.iconSize) glyph.setAttribute('size', data.iconSize);\n if (data.iconMethod) glyph.setAttribute('method', data.iconMethod);\n if (data.iconColor) glyph.setAttribute('color', data.iconColor);\n item.appendChild(glyph);\n }\n item.appendChild(document.createTextNode(data.label));\n if (data.submenu && data.submenu.length > 0) {\n const submenu = document.createElement('nile-context-submenu');\n for (const entry of data.submenu) {\n const node = this._createDataNode(entry);\n if (node) submenu.appendChild(node);\n }\n item.appendChild(submenu);\n }\n return item;\n }\n\n private _parseChildren(): void {\n const root: Element = this._menuContainerRef ?? this;\n const all = Array.from(root.querySelectorAll(ITEM_TAG)) as NileContextMenuItem[];\n this._items = all.filter(item => !this._isInsideDescendantSubmenu(item, root));\n }\n\n private _isInsideDescendantSubmenu(item: Element, container: Element): boolean {\n let cur: Element | null = item.parentElement;\n while (cur && cur !== container) {\n if (cur.tagName.toLowerCase() === SUBMENU_TAG) return true;\n cur = cur.parentElement;\n }\n return false;\n }\n\n public get menuItems(): readonly NileContextMenuItem[] {\n return this._items;\n }\n\n public getItemByValue(value: string): NileContextMenuItem | undefined {\n return this._items.find(item => item.value === value);\n }\n\n public get isOpen(): boolean {\n return this._open;\n }\n\n public openAt(options: NileContextMenuOpenOptions): void {\n if (this._open) return;\n for (const other of NileContextMenu._openInstances) {\n if (other !== this) other.close('programmatic');\n }\n this._previouslyFocused = document.activeElement as HTMLElement | null;\n this._openContext = {\n x: options.x,\n y: options.y,\n target: options.target ?? null,\n originalEvent: options.originalEvent ?? null,\n };\n this._ensureProxy();\n this._positionProxyAt(options.x, options.y);\n this._open = true;\n this.open = true;\n NileContextMenu._openInstances.add(this);\n document.addEventListener('pointerdown', this._onOutsidePointer, true);\n document.addEventListener('keydown', this._onKeydown, true);\n if (this._pinned) window.addEventListener('resize', this._onPinnedReposition);\n requestAnimationFrame(() => {\n if (this._open) window.addEventListener('scroll', this._onScroll, true);\n requestAnimationFrame(() => this._openPinnedSubmenus());\n });\n this.emit('nile-change', { type: 'open', ...this._openContext });\n }\n\n public close(reason: NileContextMenuCloseReason = 'programmatic'): void {\n if (!this._open) return;\n this._open = false;\n this.open = false;\n this._pinned = false;\n this._openContext = null;\n NileContextMenu._openInstances.delete(this);\n const subs = this._menuContainerRef?.querySelectorAll(SUBMENU_TAG);\n subs?.forEach(s => (s as unknown as { closeSubmenu?: () => void }).closeSubmenu?.());\n document.removeEventListener('pointerdown', this._onOutsidePointer, true);\n document.removeEventListener('keydown', this._onKeydown, true);\n window.removeEventListener('scroll', this._onScroll, true);\n window.removeEventListener('resize', this._onPinnedReposition);\n const active = document.activeElement;\n const focusInMenu =\n active === this ||\n this._items.some(item => item === active || item.shadowRoot?.contains(active as Node));\n if (focusInMenu) {\n this._previouslyFocused?.focus?.();\n }\n this._previouslyFocused = null;\n this.emit('nile-change', { type: 'close', reason });\n }\n\n private _enabledItems(): NileContextMenuItem[] {\n return this._items.filter(item => !item.disabled);\n }\n\n private _getFocusedItem(): NileContextMenuItem | null {\n const active = document.activeElement;\n for (const item of this._items) {\n if (item === active || item.shadowRoot?.contains(active as Node)) return item;\n }\n return null;\n }\n\n private _getFocusedItemAnyLevel(): {\n item: NileContextMenuItem | null;\n container: Element | null;\n } {\n let node: Element | null = document.activeElement as Element | null;\n while (node && node.tagName?.toLowerCase() !== ITEM_TAG) {\n const root = node.getRootNode();\n node = root instanceof ShadowRoot ? root.host : node.parentElement;\n }\n if (!node) return { item: null, container: null };\n const container = node.closest(`.${MENU_CONTAINER_CLASS}`);\n return { item: node as NileContextMenuItem, container };\n }\n\n private _enabledItemsIn(container: Element): NileContextMenuItem[] {\n const all = Array.from(container.querySelectorAll(ITEM_TAG)) as NileContextMenuItem[];\n return all.filter(item => {\n if (item.disabled) return false;\n return !this._isInsideDescendantSubmenu(item, container);\n });\n }\n\n private _focusFirstEnabled(): void {\n const enabled = this._enabledItems();\n enabled[0]?.focus();\n }\n\n private _moveFocus(delta: number): void {\n const { item: focused, container } = this._getFocusedItemAnyLevel();\n const root: Element = container ?? this._menuContainerRef ?? this;\n const enabled = this._enabledItemsIn(root);\n if (enabled.length === 0) return;\n const current = focused ? enabled.indexOf(focused) : -1;\n const next = current + delta;\n const wrapped = ((next % enabled.length) + enabled.length) % enabled.length;\n enabled[wrapped].focus();\n }\n\n private _onKeydown = (e: KeyboardEvent): void => {\n if (!this._open) return;\n switch (e.key) {\n case 'Escape':\n e.preventDefault();\n this.close('escape');\n return;\n case 'Tab':\n this.close('programmatic');\n return;\n case 'ArrowDown':\n e.preventDefault();\n this._moveFocus(1);\n return;\n case 'ArrowUp':\n e.preventDefault();\n this._moveFocus(-1);\n return;\n case 'ArrowRight': {\n const { item } = this._getFocusedItemAnyLevel();\n const sub = item?.querySelector(`:scope > ${SUBMENU_TAG}`) as\n | (HTMLElement & { openSubmenu?: () => void })\n | null;\n if (!sub) return;\n e.preventDefault();\n sub.openSubmenu?.();\n requestAnimationFrame(() => {\n (sub as unknown as { focusFirstItem?: () => void }).focusFirstItem?.();\n });\n return;\n }\n case 'ArrowLeft': {\n const { item, container } = this._getFocusedItemAnyLevel();\n if (!item || !container) return;\n const sub = this._findSubmenuOwning(container);\n if (!sub) return;\n e.preventDefault();\n // Pinned submenus (parent item has `open`) stay open; just move focus.\n if (!sub.parentItem?.open) sub.closeSubmenu?.();\n sub.parentItem?.focus();\n return;\n }\n case 'Enter':\n case ' ': {\n e.preventDefault();\n const { item } = this._getFocusedItemAnyLevel();\n if (!item || item.disabled) return;\n const sub = item.querySelector(`:scope > ${SUBMENU_TAG}`) as\n | (HTMLElement & { openSubmenu?: () => void })\n | null;\n if (sub) {\n sub.openSubmenu?.();\n requestAnimationFrame(() => {\n const panel = sub.shadowRoot?.querySelector(`.${MENU_CONTAINER_CLASS}`);\n const first = panel\n ? (this._enabledItemsIn(panel)[0] as NileContextMenuItem | undefined)\n : undefined;\n first?.focus();\n });\n return;\n }\n this._selectItem(item);\n return;\n }\n }\n };\n\n private _findSubmenuOwning(container: Element):\n | (HTMLElement & { closeSubmenu?: () => void; parentItem?: NileContextMenuItem | null })\n | null {\n type SubCtor = {\n findByContainer?: (c: Element) => HTMLElement & {\n closeSubmenu?: () => void;\n parentItem?: NileContextMenuItem | null;\n } | null;\n };\n const customElements = window.customElements;\n const ctor = customElements.get(SUBMENU_TAG) as unknown as SubCtor | undefined;\n return ctor?.findByContainer?.(container) ?? null;\n }\n\n private _onScroll = (e: Event): void => {\n if (!this._open) return;\n if (this._pinned) {\n this._onPinnedReposition();\n return;\n }\n const path = e.composedPath();\n // Scroll inside the root menu container?\n if (this._menuContainerRef && path.includes(this._menuContainerRef)) return;\n // Scroll inside any descendant submenu's portaled panel?\n for (const node of path) {\n if (node instanceof HTMLElement && node.classList?.contains(MENU_CONTAINER_CLASS)) {\n return;\n }\n }\n this.close('programmatic');\n };\n\n private _onOutsidePointer = (e: Event): void => {\n if (!this._open) return;\n const path = e.composedPath();\n if (this._menuContainerRef && path.includes(this._menuContainerRef)) return;\n for (const node of path) {\n if (\n node instanceof HTMLElement &&\n node.classList?.contains(MENU_CONTAINER_CLASS)\n ) {\n return;\n }\n }\n this.close('outside-click');\n };\n\n private _onDescendantSelect = (e: CustomEvent): void => {\n if (e.detail?.type !== 'click') return;\n this.close('select');\n };\n private _stop(e: Event): void {\n e.stopPropagation();\n }\n\n private _onPanelShown = (e: Event): void => {\n e.stopPropagation();\n this._openPinnedSubmenus();\n };\n\n /** Open the submenu of every top-level item carrying the `open` attribute. */\n private _openPinnedSubmenus(): void {\n if (!this._open || !this._menuContainerRef) return;\n for (const item of this._items) {\n if (!item.open || item.disabled) continue;\n const sub = item.querySelector(`:scope > ${SUBMENU_TAG}`) as\n | (HTMLElement & { openSubmenu?: () => void })\n | null;\n sub?.openSubmenu?.();\n }\n }\n\n private _onMenuMouseOver = (e: MouseEvent): void => {\n const item = e\n .composedPath()\n .find(\n node =>\n node instanceof HTMLElement &&\n node.tagName.toLowerCase() === ITEM_TAG\n ) as NileContextMenuItem | undefined;\n if (!item || item.disabled) return;\n item.focus();\n };\n\n private _onMenuClick = (e: MouseEvent): void => {\n const item = e\n .composedPath()\n .find(\n node =>\n node instanceof HTMLElement &&\n node.tagName.toLowerCase() === ITEM_TAG\n ) as NileContextMenuItem | undefined;\n\n if (!item || item.disabled) return;\n if (item.querySelector(`:scope > ${SUBMENU_TAG}`)) return;\n this._selectItem(item);\n };\n\n private _selectItem(item: NileContextMenuItem): void {\n const detail = {\n id: item.id,\n value: item.value,\n name: (item.textContent ?? '').trim(),\n target: this._openContext?.target ?? null,\n originalEvent: this._openContext?.originalEvent ?? null,\n };\n try {\n item.onSelect?.(detail);\n } catch (err) {\n console.error('[nile-context-menu] onSelect callback threw:', err);\n }\n this.emit('nile-change', { type: 'click', ...detail });\n this.close('select');\n }\n\n public render(): TemplateResult {\n return html`\n <nile-floating-panel\n for=${this._proxyId}\n trigger=\"manual\"\n placement=\"bottom-start\"\n panelClass=\"nile-context-menu-panel\"\n .zIndex=${this.zIndex}\n ?open=${this._open}\n .interactive=${true}\n .hideOnClick=${false}\n .closeOnEscape=${false}\n .arrow=${'none'}\n .distance=${0}\n @nile-init=${this._stop}\n @nile-destroy=${this._stop}\n @nile-show=${this._stop}\n @nile-hide=${this._stop}\n @nile-after-show=${this._onPanelShown}\n @nile-after-hide=${this._stop}\n @nile-toggle=${this._stop}\n @nile-visibility-change=${this._stop}\n >\n <div class=\"nile-context-menu__menu\" role=\"menu\"></div>\n </nile-floating-panel>\n `;\n }\n}\n\nexport default NileContextMenu;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nile-context-menu': NileContextMenu;\n }\n}\n"]}
@@ -26,6 +26,7 @@ export declare class NileContextMenuItem extends NileElement {
26
26
  static get styles(): CSSResultArray;
27
27
  value: string;
28
28
  disabled: boolean;
29
+ open: boolean;
29
30
  onSelect?: NileContextMenuItemSelectHandler;
30
31
  private _hasSubmenu;
31
32
  private _hasIcon;
@@ -22,6 +22,7 @@ let NileContextMenuItem = class NileContextMenuItem extends NileElement {
22
22
  super(...arguments);
23
23
  this.value = '';
24
24
  this.disabled = false;
25
+ this.open = false;
25
26
  this._hasSubmenu = false;
26
27
  this._hasIcon = false;
27
28
  this._submenuExpanded = false;
@@ -66,7 +67,7 @@ let NileContextMenuItem = class NileContextMenuItem extends NileElement {
66
67
  <span part="label" class="label"><slot @slotchange=${this._onSlotChange}></slot></span>
67
68
  ${this._hasSubmenu
68
69
  ? html `<span part="chevron" class="chevron" aria-hidden="true">
69
- <nile-glyph name="ng-chevron-right" size="16"></nile-glyph>
70
+ <nile-glyph name="ng-chevron-right" size="16" method="stroke"></nile-glyph>
70
71
  </span>`
71
72
  : ''}
72
73
  </div>
@@ -79,6 +80,9 @@ __decorate([
79
80
  __decorate([
80
81
  property({ attribute: true, type: Boolean, reflect: true })
81
82
  ], NileContextMenuItem.prototype, "disabled", void 0);
83
+ __decorate([
84
+ property({ attribute: true, type: Boolean, reflect: true })
85
+ ], NileContextMenuItem.prototype, "open", void 0);
82
86
  __decorate([
83
87
  state()
84
88
  ], NileContextMenuItem.prototype, "_hasSubmenu", void 0);
@@ -1 +1 @@
1
- {"version":3,"file":"nile-context-menu-item.js","sourceRoot":"","sources":["../../../src/nile-context-menu-item/nile-context-menu-item.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, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { styles } from './nile-context-menu-item.css';\nimport NileElement from '../internal/nile-element';\n\n//Data passed to an item's `onSelect` callback. Matches the `nile-context-menu:select` event detail.\nexport interface NileContextMenuItemSelectDetail {\n id: string;\n value: string;\n name: string;\n target: Element | null;\n originalEvent: Event | null;\n}\n\nexport type NileContextMenuItemSelectHandler = (\n detail: NileContextMenuItemSelectDetail\n) => void;\n\n/**\n * Nile context-menu item. A clickable entry inside `nile-context-menu`.\n *\n * @tag nile-context-menu-item\n *\n * @slot - Default slot for the visible label.\n * @slot icon - Optional leading icon (e.g. a `<nile-glyph slot=\"icon\">`).\n */\n@customElement('nile-context-menu-item')\nexport class NileContextMenuItem extends NileElement {\n public static get styles(): CSSResultArray {\n return [styles];\n }\n\n @property({ attribute: true, type: String, reflect: true }) value = '';\n\n @property({ attribute: true, type: Boolean, reflect: true }) disabled = false;\n\n public onSelect?: NileContextMenuItemSelectHandler;\n\n @state() private _hasSubmenu = false;\n\n @state() private _hasIcon = false;\n\n @state() private _submenuExpanded = false;\n\n public setSubmenuExpanded(expanded: boolean): void {\n this._submenuExpanded = expanded;\n }\n\n public override focus(options?: FocusOptions): void {\n const inner = this.shadowRoot?.querySelector('.item') as HTMLElement | null;\n inner?.focus(options);\n }\n\n public get hasSubmenu(): boolean {\n return this._hasSubmenu;\n }\n\n private _onSlotChange = (e: Event): void => {\n const slot = e.target as HTMLSlotElement;\n const nodes = slot.assignedElements({ flatten: true });\n this._hasSubmenu = nodes.some(\n n => n.tagName.toLowerCase() === 'nile-context-submenu'\n );\n };\n\n private _onIconSlotChange = (e: Event): void => {\n const slot = e.target as HTMLSlotElement;\n this._hasIcon = slot.assignedNodes({ flatten: true }).some(\n n => n.nodeType === Node.ELEMENT_NODE || (n.textContent ?? '').trim() !== ''\n );\n };\n\n public render(): TemplateResult {\n return html`\n <div\n part=\"item\"\n class=\"item\"\n role=\"menuitem\"\n tabindex=\"-1\"\n aria-disabled=${this.disabled ? 'true' : 'false'}\n aria-haspopup=${this._hasSubmenu ? 'menu' : nothing}\n aria-expanded=${this._hasSubmenu ? String(this._submenuExpanded) : nothing}\n data-has-submenu=${this._hasSubmenu ? 'true' : 'false'}\n >\n <span part=\"icon\" class=\"icon\" data-empty=${this._hasIcon ? 'false' : 'true'}>\n <slot name=\"icon\" @slotchange=${this._onIconSlotChange}></slot>\n </span>\n <span part=\"label\" class=\"label\"><slot @slotchange=${this._onSlotChange}></slot></span>\n ${this._hasSubmenu\n ? html`<span part=\"chevron\" class=\"chevron\" aria-hidden=\"true\">\n <nile-glyph name=\"ng-chevron-right\" size=\"16\"></nile-glyph>\n </span>`\n : ''}\n </div>\n `;\n }\n}\n\nexport default NileContextMenuItem;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nile-context-menu-item': NileContextMenuItem;\n }\n}\n"]}
1
+ {"version":3,"file":"nile-context-menu-item.js","sourceRoot":"","sources":["../../../src/nile-context-menu-item/nile-context-menu-item.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, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { styles } from './nile-context-menu-item.css';\nimport NileElement from '../internal/nile-element';\n\n//Data passed to an item's `onSelect` callback. Matches the `nile-context-menu:select` event detail.\nexport interface NileContextMenuItemSelectDetail {\n id: string;\n value: string;\n name: string;\n target: Element | null;\n originalEvent: Event | null;\n}\n\nexport type NileContextMenuItemSelectHandler = (\n detail: NileContextMenuItemSelectDetail\n) => void;\n\n/**\n * Nile context-menu item. A clickable entry inside `nile-context-menu`.\n *\n * @tag nile-context-menu-item\n *\n * @slot - Default slot for the visible label.\n * @slot icon - Optional leading icon (e.g. a `<nile-glyph slot=\"icon\">`).\n */\n@customElement('nile-context-menu-item')\nexport class NileContextMenuItem extends NileElement {\n public static get styles(): CSSResultArray {\n return [styles];\n }\n\n @property({ attribute: true, type: String, reflect: true }) value = '';\n\n @property({ attribute: true, type: Boolean, reflect: true }) disabled = false;\n\n @property({ attribute: true, type: Boolean, reflect: true }) open = false;\n\n public onSelect?: NileContextMenuItemSelectHandler;\n\n @state() private _hasSubmenu = false;\n\n @state() private _hasIcon = false;\n\n @state() private _submenuExpanded = false;\n\n public setSubmenuExpanded(expanded: boolean): void {\n this._submenuExpanded = expanded;\n }\n\n public override focus(options?: FocusOptions): void {\n const inner = this.shadowRoot?.querySelector('.item') as HTMLElement | null;\n inner?.focus(options);\n }\n\n public get hasSubmenu(): boolean {\n return this._hasSubmenu;\n }\n\n private _onSlotChange = (e: Event): void => {\n const slot = e.target as HTMLSlotElement;\n const nodes = slot.assignedElements({ flatten: true });\n this._hasSubmenu = nodes.some(\n n => n.tagName.toLowerCase() === 'nile-context-submenu'\n );\n };\n\n private _onIconSlotChange = (e: Event): void => {\n const slot = e.target as HTMLSlotElement;\n this._hasIcon = slot.assignedNodes({ flatten: true }).some(\n n => n.nodeType === Node.ELEMENT_NODE || (n.textContent ?? '').trim() !== ''\n );\n };\n\n public render(): TemplateResult {\n return html`\n <div\n part=\"item\"\n class=\"item\"\n role=\"menuitem\"\n tabindex=\"-1\"\n aria-disabled=${this.disabled ? 'true' : 'false'}\n aria-haspopup=${this._hasSubmenu ? 'menu' : nothing}\n aria-expanded=${this._hasSubmenu ? String(this._submenuExpanded) : nothing}\n data-has-submenu=${this._hasSubmenu ? 'true' : 'false'}\n >\n <span part=\"icon\" class=\"icon\" data-empty=${this._hasIcon ? 'false' : 'true'}>\n <slot name=\"icon\" @slotchange=${this._onIconSlotChange}></slot>\n </span>\n <span part=\"label\" class=\"label\"><slot @slotchange=${this._onSlotChange}></slot></span>\n ${this._hasSubmenu\n ? html`<span part=\"chevron\" class=\"chevron\" aria-hidden=\"true\">\n <nile-glyph name=\"ng-chevron-right\" size=\"16\" method=\"stroke\"></nile-glyph>\n </span>`\n : ''}\n </div>\n `;\n }\n}\n\nexport default NileContextMenuItem;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nile-context-menu-item': NileContextMenuItem;\n }\n}\n"]}
@@ -25,7 +25,11 @@ export declare class NileContextSubmenu extends NileElement {
25
25
  private _openTimer?;
26
26
  private _closeTimer?;
27
27
  private _setupDone;
28
+ private _parentObserver?;
29
+ private _repositionQueued;
30
+ private get _pinnedOpen();
28
31
  connectedCallback(): void;
32
+ private _isParentVisible;
29
33
  private _ensureProxy;
30
34
  private _syncProxyToParent;
31
35
  disconnectedCallback(): void;
@@ -38,8 +42,13 @@ export declare class NileContextSubmenu extends NileElement {
38
42
  private _onParentLeave;
39
43
  private _onParentClick;
40
44
  private _onPanelEnter;
45
+ private _onReposition;
41
46
  private _onPanelLeave;
42
47
  openSubmenu(): void;
48
+ /** Open the submenu of every direct child item carrying the `open` attribute. */
49
+ private _openPinnedDescendants;
50
+ /** True if `item` sits at this submenu's own level (not inside a deeper submenu). */
51
+ private _isDirectChildItem;
43
52
  closeSubmenu(): void;
44
53
  get isOpen(): boolean;
45
54
  static findByContainer(container: Element): NileContextSubmenu | null;