@aquera/nile-elements 1.7.8 → 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 (111) hide show
  1. package/README.md +6 -0
  2. package/dist/index.cjs.js +1 -1
  3. package/dist/index.esm.js +1 -1
  4. package/dist/index.js +862 -520
  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/nile-status-light/index.cjs.js +2 -0
  39. package/dist/nile-status-light/index.cjs.js.map +1 -0
  40. package/dist/nile-status-light/index.esm.js +1 -0
  41. package/dist/nile-status-light/nile-status-light.cjs.js +2 -0
  42. package/dist/nile-status-light/nile-status-light.cjs.js.map +1 -0
  43. package/dist/nile-status-light/nile-status-light.css.cjs.js +2 -0
  44. package/dist/nile-status-light/nile-status-light.css.cjs.js.map +1 -0
  45. package/dist/nile-status-light/nile-status-light.css.esm.js +136 -0
  46. package/dist/nile-status-light/nile-status-light.esm.js +13 -0
  47. package/dist/src/index.d.ts +4 -0
  48. package/dist/src/index.js +4 -0
  49. package/dist/src/index.js.map +1 -1
  50. package/dist/src/nile-context-menu/index.d.ts +3 -0
  51. package/dist/src/nile-context-menu/index.js +4 -0
  52. package/dist/src/nile-context-menu/index.js.map +1 -0
  53. package/dist/src/nile-context-menu/nile-context-menu.css.d.ts +10 -0
  54. package/dist/src/nile-context-menu/nile-context-menu.css.js +127 -0
  55. package/dist/src/nile-context-menu/nile-context-menu.css.js.map +1 -0
  56. package/dist/src/nile-context-menu/nile-context-menu.d.ts +123 -0
  57. package/dist/src/nile-context-menu/nile-context-menu.js +625 -0
  58. package/dist/src/nile-context-menu/nile-context-menu.js.map +1 -0
  59. package/dist/src/nile-context-menu-group/index.d.ts +1 -0
  60. package/dist/src/nile-context-menu-group/index.js +2 -0
  61. package/dist/src/nile-context-menu-group/index.js.map +1 -0
  62. package/dist/src/nile-context-menu-group/nile-context-menu-group.css.d.ts +9 -0
  63. package/dist/src/nile-context-menu-group/nile-context-menu-group.css.js +29 -0
  64. package/dist/src/nile-context-menu-group/nile-context-menu-group.css.js.map +1 -0
  65. package/dist/src/nile-context-menu-group/nile-context-menu-group.d.ts +28 -0
  66. package/dist/src/nile-context-menu-group/nile-context-menu-group.js +55 -0
  67. package/dist/src/nile-context-menu-group/nile-context-menu-group.js.map +1 -0
  68. package/dist/src/nile-context-menu-item/index.d.ts +1 -0
  69. package/dist/src/nile-context-menu-item/index.js +2 -0
  70. package/dist/src/nile-context-menu-item/index.js.map +1 -0
  71. package/dist/src/nile-context-menu-item/nile-context-menu-item.css.d.ts +9 -0
  72. package/dist/src/nile-context-menu-item/nile-context-menu-item.css.js +81 -0
  73. package/dist/src/nile-context-menu-item/nile-context-menu-item.css.js.map +1 -0
  74. package/dist/src/nile-context-menu-item/nile-context-menu-item.d.ts +45 -0
  75. package/dist/src/nile-context-menu-item/nile-context-menu-item.js +96 -0
  76. package/dist/src/nile-context-menu-item/nile-context-menu-item.js.map +1 -0
  77. package/dist/src/nile-context-submenu/index.d.ts +1 -0
  78. package/dist/src/nile-context-submenu/index.js +2 -0
  79. package/dist/src/nile-context-submenu/index.js.map +1 -0
  80. package/dist/src/nile-context-submenu/nile-context-submenu.d.ts +60 -0
  81. package/dist/src/nile-context-submenu/nile-context-submenu.js +324 -0
  82. package/dist/src/nile-context-submenu/nile-context-submenu.js.map +1 -0
  83. package/dist/src/nile-status-light/index.d.ts +1 -0
  84. package/dist/src/nile-status-light/index.js +2 -0
  85. package/dist/src/nile-status-light/index.js.map +1 -0
  86. package/dist/src/nile-status-light/nile-status-light.css.d.ts +9 -0
  87. package/dist/src/nile-status-light/nile-status-light.css.js +145 -0
  88. package/dist/src/nile-status-light/nile-status-light.css.js.map +1 -0
  89. package/dist/src/nile-status-light/nile-status-light.d.ts +53 -0
  90. package/dist/src/nile-status-light/nile-status-light.js +108 -0
  91. package/dist/src/nile-status-light/nile-status-light.js.map +1 -0
  92. package/dist/src/version.js +1 -1
  93. package/dist/src/version.js.map +1 -1
  94. package/dist/tsconfig.tsbuildinfo +1 -1
  95. package/package.json +2 -1
  96. package/src/index.ts +4 -0
  97. package/src/nile-context-menu/index.ts +12 -0
  98. package/src/nile-context-menu/nile-context-menu.css.ts +130 -0
  99. package/src/nile-context-menu/nile-context-menu.ts +698 -0
  100. package/src/nile-context-menu-group/index.ts +1 -0
  101. package/src/nile-context-menu-group/nile-context-menu-group.css.ts +31 -0
  102. package/src/nile-context-menu-group/nile-context-menu-group.ts +55 -0
  103. package/src/nile-context-menu-item/index.ts +5 -0
  104. package/src/nile-context-menu-item/nile-context-menu-item.css.ts +83 -0
  105. package/src/nile-context-menu-item/nile-context-menu-item.ts +112 -0
  106. package/src/nile-context-submenu/index.ts +1 -0
  107. package/src/nile-context-submenu/nile-context-submenu.ts +322 -0
  108. package/src/nile-status-light/index.ts +1 -0
  109. package/src/nile-status-light/nile-status-light.css.ts +146 -0
  110. package/src/nile-status-light/nile-status-light.ts +111 -0
  111. package/vscode-html-custom-data.json +140 -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"]}
@@ -0,0 +1 @@
1
+ export { NileStatusLight } from './nile-status-light';
@@ -0,0 +1,2 @@
1
+ export { NileStatusLight } from './nile-status-light';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/nile-status-light/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC","sourcesContent":["export { NileStatusLight } from './nile-status-light';\n"]}
@@ -0,0 +1,9 @@
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
+ export declare const styles: import("lit").CSSResult;
8
+ declare const _default: import("lit").CSSResult[];
9
+ export default _default;
@@ -0,0 +1,145 @@
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
+ import { css } from 'lit';
8
+ export const styles = css `
9
+ :host {
10
+ -webkit-font-smoothing: var(
11
+ --nile-webkit-font-smoothing,
12
+ var(--ng-webkit-font-smoothing)
13
+ );
14
+ -moz-osx-font-smoothing: var(
15
+ --nile-moz-osx-font-smoothing,
16
+ var(--ng-moz-osx-font-smoothing)
17
+ );
18
+ text-rendering: var(--nile-text-rendering, var(--ng-text-rendering));
19
+ display: inline-block;
20
+ }
21
+
22
+ .status-light {
23
+ display: inline-flex;
24
+ align-items: center;
25
+ gap: var(--nile-spacing-sm, var(--ng-spacing-2));
26
+ box-sizing: border-box;
27
+ }
28
+
29
+ .status-light__dot {
30
+ position: relative;
31
+ flex: none;
32
+ border-radius: var(--nile-radius-full, var(--ng-radius-full));
33
+ width: var(--nile-height-10px, var(--ng-height-10px));
34
+ height: var(--nile-height-10px, var(--ng-height-10px));
35
+ background: var(--nile-colors-gray-light-mode-500, var(--ng-componentcolors-utility-gray-500));
36
+ }
37
+
38
+ .status-light__label {
39
+ font-family: var(--nile-font-family-serif, var(--ng-font-family-body));
40
+ font-size: var(--nile-type-scale-2, var(--ng-font-size-text-sm));
41
+ font-style: normal;
42
+ font-weight: var(--nile-font-weight-medium, var(--ng-font-weight-medium));
43
+ line-height: var(--nile-type-scale-5, var(--ng-line-height-text-sm));
44
+ letter-spacing: 0.2px;
45
+ color: var(--nile-colors-dark-900, var(--ng-componentcolors-utility-gray-900));
46
+ }
47
+
48
+ /* #region Sizes */
49
+
50
+ .status-light--small .status-light__dot {
51
+ width: var(--nile-height-8px, var(--ng-height-8px));
52
+ height: var(--nile-height-8px, var(--ng-height-8px));
53
+ }
54
+
55
+ .status-light--medium .status-light__dot {
56
+ width: var(--nile-height-10px, var(--ng-height-10px));
57
+ height: var(--nile-height-10px, var(--ng-height-10px));
58
+ }
59
+
60
+ .status-light--large .status-light__dot {
61
+ width: var(--nile-height-12px, var(--ng-height-12px));
62
+ height: var(--nile-height-12px, var(--ng-height-12px));
63
+ }
64
+
65
+ .status-light--x-large .status-light__dot {
66
+ width: var(--nile-height-14px, var(--ng-height-14px));
67
+ height: var(--nile-height-14px, var(--ng-height-14px));
68
+ }
69
+
70
+ .status-light--large .status-light__label,
71
+ .status-light--x-large .status-light__label {
72
+ font-size: var(--nile-type-scale-3, var(--ng-font-size-text-md));
73
+ line-height: var(--nile-type-scale-6, var(--ng-line-height-text-md));
74
+ }
75
+
76
+
77
+
78
+ .status-light--positive .status-light__dot {
79
+ background: var(--nile-colors-green-500, var(--ng-componentcolors-utility-success-500));
80
+ }
81
+
82
+ .status-light--negative .status-light__dot {
83
+ background: var(--nile-colors-red-500, var(--ng-componentcolors-utility-error-500));
84
+ }
85
+
86
+ .status-light--notice .status-light__dot {
87
+ background: var(--nile-colors-yellow-500, var(--ng-componentcolors-utility-warning-500));
88
+ }
89
+
90
+ .status-light--informative .status-light__dot {
91
+ background: var(--nile-colors-blue-500, var(--ng-componentcolors-utility-blue-light-500));
92
+ }
93
+
94
+ .status-light--neutral .status-light__dot {
95
+ background: var(--nile-colors-gray-light-mode-500, var(--ng-componentcolors-utility-gray-500));
96
+ }
97
+
98
+ .status-light--inactive .status-light__dot {
99
+ background: var(--nile-colors-gray-light-mode-300, var(--ng-componentcolors-utility-gray-300));
100
+ }
101
+
102
+ .status-light--inactive .status-light__label {
103
+ color: var(--nile-colors-text-tertiary, var(--ng-componentcolors-utility-gray-500));
104
+ }
105
+
106
+ .status-light--disabled .status-light__dot {
107
+ background: var(--nile-colors-text-disabled, var(--ng-componentcolors-utility-gray-300));
108
+ }
109
+
110
+ .status-light--disabled .status-light__label {
111
+ color: var(--nile-colors-text-disabled, var(--ng-colors-text-disabled));
112
+ }
113
+
114
+
115
+
116
+ .status-light--pulse .status-light__dot::after {
117
+ content: '';
118
+ position: absolute;
119
+ inset: 0;
120
+ border-radius: inherit;
121
+ background: inherit;
122
+ animation: status-light-pulse 1.5s ease-out infinite;
123
+ }
124
+
125
+ @keyframes status-light-pulse {
126
+ 0% {
127
+ transform: scale(1);
128
+ opacity: 0.6;
129
+ }
130
+ 100% {
131
+ transform: scale(2.5);
132
+ opacity: 0;
133
+ }
134
+ }
135
+
136
+ @media (prefers-reduced-motion: reduce) {
137
+ .status-light--pulse .status-light__dot::after {
138
+ animation: none;
139
+ }
140
+ }
141
+
142
+ /* #endregion */
143
+ `;
144
+ export default [styles];
145
+ //# sourceMappingURL=nile-status-light.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nile-status-light.css.js","sourceRoot":"","sources":["../../../src/nile-status-light/nile-status-light.css.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC1B,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuIxB,CAAC;AAEF,eAAe,CAAC,MAAM,CAAC,CAAC","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 { css } from 'lit';\nexport const styles = css`\n :host {\n -webkit-font-smoothing: var(\n --nile-webkit-font-smoothing,\n var(--ng-webkit-font-smoothing)\n );\n -moz-osx-font-smoothing: var(\n --nile-moz-osx-font-smoothing,\n var(--ng-moz-osx-font-smoothing)\n );\n text-rendering: var(--nile-text-rendering, var(--ng-text-rendering));\n display: inline-block;\n }\n\n .status-light {\n display: inline-flex;\n align-items: center;\n gap: var(--nile-spacing-sm, var(--ng-spacing-2));\n box-sizing: border-box;\n }\n\n .status-light__dot {\n position: relative;\n flex: none;\n border-radius: var(--nile-radius-full, var(--ng-radius-full));\n width: var(--nile-height-10px, var(--ng-height-10px));\n height: var(--nile-height-10px, var(--ng-height-10px));\n background: var(--nile-colors-gray-light-mode-500, var(--ng-componentcolors-utility-gray-500));\n }\n\n .status-light__label {\n font-family: var(--nile-font-family-serif, var(--ng-font-family-body));\n font-size: var(--nile-type-scale-2, var(--ng-font-size-text-sm));\n font-style: normal;\n font-weight: var(--nile-font-weight-medium, var(--ng-font-weight-medium));\n line-height: var(--nile-type-scale-5, var(--ng-line-height-text-sm));\n letter-spacing: 0.2px;\n color: var(--nile-colors-dark-900, var(--ng-componentcolors-utility-gray-900));\n }\n\n /* #region Sizes */\n\n .status-light--small .status-light__dot {\n width: var(--nile-height-8px, var(--ng-height-8px));\n height: var(--nile-height-8px, var(--ng-height-8px));\n }\n\n .status-light--medium .status-light__dot {\n width: var(--nile-height-10px, var(--ng-height-10px));\n height: var(--nile-height-10px, var(--ng-height-10px));\n }\n\n .status-light--large .status-light__dot {\n width: var(--nile-height-12px, var(--ng-height-12px));\n height: var(--nile-height-12px, var(--ng-height-12px));\n }\n\n .status-light--x-large .status-light__dot {\n width: var(--nile-height-14px, var(--ng-height-14px));\n height: var(--nile-height-14px, var(--ng-height-14px));\n }\n\n .status-light--large .status-light__label,\n .status-light--x-large .status-light__label {\n font-size: var(--nile-type-scale-3, var(--ng-font-size-text-md));\n line-height: var(--nile-type-scale-6, var(--ng-line-height-text-md));\n }\n\n \n\n .status-light--positive .status-light__dot {\n background: var(--nile-colors-green-500, var(--ng-componentcolors-utility-success-500));\n }\n\n .status-light--negative .status-light__dot {\n background: var(--nile-colors-red-500, var(--ng-componentcolors-utility-error-500));\n }\n\n .status-light--notice .status-light__dot {\n background: var(--nile-colors-yellow-500, var(--ng-componentcolors-utility-warning-500));\n }\n\n .status-light--informative .status-light__dot {\n background: var(--nile-colors-blue-500, var(--ng-componentcolors-utility-blue-light-500));\n }\n\n .status-light--neutral .status-light__dot {\n background: var(--nile-colors-gray-light-mode-500, var(--ng-componentcolors-utility-gray-500));\n }\n\n .status-light--inactive .status-light__dot {\n background: var(--nile-colors-gray-light-mode-300, var(--ng-componentcolors-utility-gray-300));\n }\n\n .status-light--inactive .status-light__label {\n color: var(--nile-colors-text-tertiary, var(--ng-componentcolors-utility-gray-500));\n }\n\n .status-light--disabled .status-light__dot {\n background: var(--nile-colors-text-disabled, var(--ng-componentcolors-utility-gray-300));\n }\n\n .status-light--disabled .status-light__label {\n color: var(--nile-colors-text-disabled, var(--ng-colors-text-disabled));\n }\n\n \n\n .status-light--pulse .status-light__dot::after {\n content: '';\n position: absolute;\n inset: 0;\n border-radius: inherit;\n background: inherit;\n animation: status-light-pulse 1.5s ease-out infinite;\n }\n\n @keyframes status-light-pulse {\n 0% {\n transform: scale(1);\n opacity: 0.6;\n }\n 100% {\n transform: scale(2.5);\n opacity: 0;\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n .status-light--pulse .status-light__dot::after {\n animation: none;\n }\n }\n\n /* #endregion */\n`;\n\nexport default [styles];\n"]}
@@ -0,0 +1,53 @@
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
+ import { TemplateResult } from 'lit';
8
+ import NileElement from '../internal/nile-element';
9
+ import type { CSSResultGroup } from 'lit';
10
+ /**
11
+ * Nile status light component.
12
+ *
13
+ * @tag nile-status-light
14
+ *
15
+ * @summary Status lights describe the status of an object, using a colored dot
16
+ * alongside a text label (e.g. "Active", "Error", "Pending").
17
+ * @status experimental
18
+ *
19
+ * @slot - The status light's text label.
20
+ *
21
+ * @attr {boolean} pulse - Optional pulse animation for active statuses.
22
+ *
23
+ * @csspart base - The component's base wrapper.
24
+ * @csspart indicator - The colored status dot.
25
+ * @csspart label - The status light's text label.
26
+ *
27
+ * @example
28
+ * <!-- Pulse animation for an active status -->
29
+ * <nile-status-light variant="positive" pulse>Active</nile-status-light>
30
+ *
31
+ * @example
32
+ * <!-- Disabled status light with muted colors -->
33
+ * <nile-status-light variant="positive" disabled>Inactive</nile-status-light>
34
+ */
35
+ export declare class NileStatusLight extends NileElement {
36
+ static styles: CSSResultGroup;
37
+ connectedCallback(): void;
38
+ /** The status light's color variant. */
39
+ variant: 'positive' | 'negative' | 'notice' | 'informative' | 'neutral' | 'inactive';
40
+ /** The status light's size. */
41
+ size: 'small' | 'medium' | 'large' | 'x-large';
42
+ /** Disables the status light, muting its colors. */
43
+ disabled: boolean;
44
+ /** Draws attention to an active status with a pulsing animation around the dot. */
45
+ pulse: boolean;
46
+ render(): TemplateResult;
47
+ }
48
+ export default NileStatusLight;
49
+ declare global {
50
+ interface HTMLElementTagNameMap {
51
+ 'nile-status-light': NileStatusLight;
52
+ }
53
+ }