@aquera/nile-elements 1.2.8 → 1.2.9

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 +4 -0
  2. package/dist/{fixture-dff65c89.cjs.js → fixture-1c49c014.cjs.js} +2 -2
  3. package/dist/{fixture-dff65c89.cjs.js.map → fixture-1c49c014.cjs.js.map} +1 -1
  4. package/dist/index.cjs.js +1 -1
  5. package/dist/index.esm.js +1 -1
  6. package/dist/index.js +371 -370
  7. package/dist/nile-accordion/nile-accordian.test.cjs.js +1 -1
  8. package/dist/nile-auto-complete/index.cjs.js +1 -1
  9. package/dist/nile-auto-complete/index.esm.js +1 -1
  10. package/dist/nile-auto-complete/nile-auto-complete.cjs.js +1 -1
  11. package/dist/nile-auto-complete/nile-auto-complete.cjs.js.map +1 -1
  12. package/dist/nile-auto-complete/nile-auto-complete.esm.js +4 -4
  13. package/dist/nile-auto-complete/nile-auto-complete.test.cjs.js +1 -1
  14. package/dist/nile-auto-complete/nile-auto-complete.test.cjs.js.map +1 -1
  15. package/dist/nile-auto-complete/nile-auto-complete.test.esm.js +1 -1
  16. package/dist/nile-auto-complete/portal-manager.cjs.js +1 -1
  17. package/dist/nile-auto-complete/portal-manager.cjs.js.map +1 -1
  18. package/dist/nile-auto-complete/portal-manager.esm.js +1 -1
  19. package/dist/nile-auto-complete/portal-utils.cjs.js +1 -1
  20. package/dist/nile-auto-complete/portal-utils.cjs.js.map +1 -1
  21. package/dist/nile-auto-complete/portal-utils.esm.js +1 -1
  22. package/dist/nile-avatar/nile-avatar.test.cjs.js +1 -1
  23. package/dist/nile-badge/nile-badge.test.cjs.js +1 -1
  24. package/dist/nile-button/nile-button.test.cjs.js +1 -1
  25. package/dist/nile-button-toggle-group/nile-button-toggle-group.test.cjs.js +1 -1
  26. package/dist/nile-calendar/nile-calendar.test.cjs.js +1 -1
  27. package/dist/nile-card/nile-card.test.cjs.js +1 -1
  28. package/dist/nile-checkbox/nile-checkbox.test.cjs.js +1 -1
  29. package/dist/nile-chip/nile-chip.cjs.js +1 -1
  30. package/dist/nile-chip/nile-chip.cjs.js.map +1 -1
  31. package/dist/nile-chip/nile-chip.esm.js +1 -1
  32. package/dist/nile-chip/nile-chip.test.cjs.js +1 -1
  33. package/dist/nile-chip/nile-chip.test.cjs.js.map +1 -1
  34. package/dist/nile-chip/nile-chip.test.esm.js +1 -1
  35. package/dist/nile-dialog/nile-dialog.test.cjs.js +1 -1
  36. package/dist/nile-drawer/nile-drawer.test.cjs.js +1 -1
  37. package/dist/nile-dropdown/index.cjs.js +1 -1
  38. package/dist/nile-dropdown/index.esm.js +1 -1
  39. package/dist/nile-dropdown/nile-dropdown.cjs.js +1 -1
  40. package/dist/nile-dropdown/nile-dropdown.cjs.js.map +1 -1
  41. package/dist/nile-dropdown/nile-dropdown.esm.js +3 -2
  42. package/dist/nile-dropdown/nile-dropdown.test.cjs.js +1 -1
  43. package/dist/nile-dropdown/nile-dropdown.test.cjs.js.map +1 -1
  44. package/dist/nile-dropdown/nile-dropdown.test.esm.js +1 -1
  45. package/dist/nile-dropdown/portal-manager.cjs.js +2 -0
  46. package/dist/nile-dropdown/portal-manager.cjs.js.map +1 -0
  47. package/dist/nile-dropdown/portal-manager.esm.js +1 -0
  48. package/dist/nile-dropdown/portal-utils.cjs.js +2 -0
  49. package/dist/nile-dropdown/portal-utils.cjs.js.map +1 -0
  50. package/dist/nile-dropdown/portal-utils.esm.js +1 -0
  51. package/dist/nile-empty-state/nile-empty-state.test.cjs.js +1 -1
  52. package/dist/nile-error-message/nile-error-message.test.cjs.js +1 -1
  53. package/dist/nile-file-preview/nile-file-preview.test.cjs.js +1 -1
  54. package/dist/nile-file-upload/index.cjs.js +1 -1
  55. package/dist/nile-file-upload/nile-file-upload.cjs.js +1 -1
  56. package/dist/nile-file-upload/nile-file-upload.template.cjs.js +1 -1
  57. package/dist/nile-file-upload/nile-file-upload.test.cjs.js +1 -1
  58. package/dist/nile-filter-chip/nile-filter-chip.test.cjs.js +1 -1
  59. package/dist/nile-form-group/nile-form-group.test.cjs.js +1 -1
  60. package/dist/nile-form-help-text/nile-form-help-text.test.cjs.js +1 -1
  61. package/dist/nile-hero/nile-hero.test.cjs.js +1 -1
  62. package/dist/nile-icon/nile-icon.test.cjs.js +1 -1
  63. package/dist/nile-input/nile-input.test.cjs.js +1 -1
  64. package/dist/nile-link/nile-link.test.cjs.js +1 -1
  65. package/dist/nile-lite-tooltip/nile-lite-tooltip.cjs.js +1 -1
  66. package/dist/nile-lite-tooltip/nile-lite-tooltip.cjs.js.map +1 -1
  67. package/dist/nile-lite-tooltip/nile-lite-tooltip.esm.js +1 -1
  68. package/dist/nile-loader/nile-loader.test.cjs.js +1 -1
  69. package/dist/nile-popover/index.cjs.js +1 -1
  70. package/dist/nile-popover/nile-popover.cjs.js +1 -1
  71. package/dist/nile-popover/nile-popover.test.cjs.js +1 -1
  72. package/dist/nile-popup/nile-popup.test.cjs.js +1 -1
  73. package/dist/nile-progress-bar/nile-progress-bar.test.cjs.js +1 -1
  74. package/dist/nile-radio/nile-radio.test.cjs.js +1 -1
  75. package/dist/nile-radio-group/nile-radio-group.test.cjs.js +1 -1
  76. package/dist/nile-select/nile-select.test.cjs.js +1 -1
  77. package/dist/nile-slide-toggle/nile-slide-toggle.test.cjs.js +1 -1
  78. package/dist/nile-tab-group/nile-tab-group.test.cjs.js +1 -1
  79. package/dist/nile-textarea/nile-textarea.test.cjs.js +1 -1
  80. package/dist/nile-virtual-select/nile-virtual-select.test.cjs.js +1 -1
  81. package/dist/{scopedElementsWrapper-1bff26ef.cjs.js → scopedElementsWrapper-5ea5834f.cjs.js} +2 -2
  82. package/dist/{scopedElementsWrapper-1bff26ef.cjs.js.map → scopedElementsWrapper-5ea5834f.cjs.js.map} +1 -1
  83. package/dist/src/nile-auto-complete/nile-auto-complete.js.map +1 -1
  84. package/dist/src/nile-auto-complete/portal-utils.js +5 -5
  85. package/dist/src/nile-auto-complete/portal-utils.js.map +1 -1
  86. package/dist/src/nile-chip/nile-chip.js +24 -13
  87. package/dist/src/nile-chip/nile-chip.js.map +1 -1
  88. package/dist/src/nile-dropdown/nile-dropdown.d.ts +8 -1
  89. package/dist/src/nile-dropdown/nile-dropdown.js +67 -11
  90. package/dist/src/nile-dropdown/nile-dropdown.js.map +1 -1
  91. package/dist/src/nile-dropdown/portal-manager.d.ts +43 -0
  92. package/dist/src/nile-dropdown/portal-manager.js +374 -0
  93. package/dist/src/nile-dropdown/portal-manager.js.map +1 -0
  94. package/dist/src/nile-dropdown/portal-utils.d.ts +32 -0
  95. package/dist/src/nile-dropdown/portal-utils.js +212 -0
  96. package/dist/src/nile-dropdown/portal-utils.js.map +1 -0
  97. package/dist/src/nile-lite-tooltip/nile-lite-tooltip.d.ts +1 -0
  98. package/dist/src/nile-lite-tooltip/nile-lite-tooltip.js +37 -19
  99. package/dist/src/nile-lite-tooltip/nile-lite-tooltip.js.map +1 -1
  100. package/dist/src/version.js +1 -1
  101. package/dist/src/version.js.map +1 -1
  102. package/dist/tsconfig.tsbuildinfo +1 -1
  103. package/package.json +1 -1
  104. package/src/nile-auto-complete/nile-auto-complete.ts +0 -2
  105. package/src/nile-auto-complete/portal-utils.ts +5 -5
  106. package/src/nile-chip/nile-chip.ts +23 -13
  107. package/src/nile-dropdown/nile-dropdown.ts +75 -14
  108. package/src/nile-dropdown/portal-manager.ts +488 -0
  109. package/src/nile-dropdown/portal-utils.ts +269 -0
  110. package/src/nile-lite-tooltip/nile-lite-tooltip.ts +42 -21
  111. package/vscode-html-custom-data.json +12 -2
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "description": "Webcomponent nile-elements following open-wc recommendations",
4
4
  "license": "MIT",
5
5
  "author": "nile-elements",
6
- "version": "1.2.8",
6
+ "version": "1.2.9",
7
7
  "main": "dist/src/index.js",
8
8
  "type": "module",
9
9
  "module": "dist/src/index.js",
@@ -259,8 +259,6 @@ export class NileAutoComplete extends NileElement {
259
259
  </nile-menu-item>
260
260
  `;
261
261
  }
262
-
263
-
264
262
 
265
263
  handleSelect(event: CustomEvent) {
266
264
  this.value = event.detail.value;
@@ -2,6 +2,7 @@ import {
2
2
  type Placement,
3
3
  type MiddlewareData
4
4
  } from '@floating-ui/dom';
5
+ import { render } from 'lit-html';
5
6
 
6
7
  export class PortalUtils {
7
8
  static calculateAvailableSpace(referenceElement: HTMLElement): {
@@ -175,11 +176,10 @@ export class PortalContentUtils {
175
176
  }
176
177
 
177
178
  static createMenuItem(item: any, component: any): HTMLElement {
178
- const menuItem = document.createElement('nile-menu-item');
179
- const value = component.renderItemFunction ? component.renderItemFunction(item) : item;
180
- menuItem.setAttribute('value', String(value));
181
- menuItem.innerHTML = String(value);
182
- return menuItem;
179
+ const container = document.createElement('div');
180
+ const templateResult = component.getItemRenderFunction(item);
181
+ render(templateResult, container);
182
+ return container.firstElementChild as HTMLElement;
183
183
  }
184
184
 
185
185
  static createPortalMenu(component: any): HTMLElement {
@@ -302,21 +302,25 @@ export class NileChip extends NileElement {
302
302
  );
303
303
 
304
304
  let tooltipContent: string | null = null;
305
-
306
- if (selectedOption?.tooltip) {
307
- const { content, for: showFor } = selectedOption.tooltip;
308
- if (!showFor || showFor === 'tag') {
309
- if (content instanceof Promise) {
310
- this.tooltips = [...this.tooltips, 'Loading...'];
311
305
 
312
- const currentIndex = this.tooltips.length - 1;
313
- content.then((resolved) => {
314
- this.tooltips[currentIndex] = resolved;
315
- this.requestUpdate();
316
- });
317
- } else {
318
- tooltipContent = content;
306
+ if (this.showTooltip) {
307
+ if (selectedOption?.tooltip?.content) {
308
+ const { content, for: showFor } = selectedOption.tooltip;
309
+ if (!showFor || showFor === 'tag') {
310
+ if (content instanceof Promise) {
311
+ this.tooltips = [...this.tooltips, 'Loading...'];
312
+
313
+ const currentIndex = this.tooltips.length - 1;
314
+ content.then((resolved) => {
315
+ this.tooltips[currentIndex] = resolved;
316
+ this.requestUpdate();
317
+ });
318
+ } else {
319
+ tooltipContent = content;
320
+ }
319
321
  }
322
+ } else {
323
+ tooltipContent = selectedOption?.name || selectedValue;
320
324
  }
321
325
  }
322
326
 
@@ -367,6 +371,12 @@ export class NileChip extends NileElement {
367
371
  ) {
368
372
  event.preventDefault()
369
373
  this.tags = [...this.tags, this.inputValue];
374
+ if (this.showTooltip) {
375
+ this.tooltips = [...this.tooltips, this.inputValue];
376
+ } else {
377
+ this.tooltips = [...this.tooltips, null];
378
+ }
379
+
370
380
  this.resetInput();
371
381
  this.emit('nile-chip-change', { value: this.tags });
372
382
  }
@@ -5,7 +5,7 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
 
8
- import {LitElement, html, CSSResultArray, TemplateResult} from 'lit';
8
+ import {LitElement, html, CSSResultArray, TemplateResult, PropertyValues} from 'lit';
9
9
  import { customElement, property } from 'lit/decorators.js';
10
10
  import {styles} from './nile-dropdown.css';
11
11
  import { animateTo, stopAnimations } from '../internal/animate';
@@ -22,6 +22,7 @@ import type NileIconButton from '../nile-icon-button/nile-icon-button';
22
22
  import type { NileMenu } from '../nile-menu';
23
23
  import type { NilePopup } from '../nile-popup';
24
24
  import '../nile-popup';
25
+ import { DropdownPortalManager } from './portal-manager';
25
26
 
26
27
  /**
27
28
  * Nile icon component.
@@ -111,6 +112,14 @@ export class NileDropdown extends NileElement {
111
112
  */
112
113
  @property({ type: Boolean }) hoist = false;
113
114
 
115
+ /**
116
+ * Enable portal mode to render the dropdown panel in a portal outside the component's DOM tree.
117
+ * This provides better positioning control and prevents clipping issues in complex layouts.
118
+ */
119
+ @property({ type: Boolean, reflect: true }) portal = false;
120
+
121
+ private portalManager: DropdownPortalManager | null = null;
122
+
114
123
  connectedCallback() {
115
124
  super.connectedCallback();
116
125
  this.handlePanelSelect = this.handlePanelSelect.bind(this);
@@ -122,6 +131,12 @@ export class NileDropdown extends NileElement {
122
131
  this.containingElement = this;
123
132
  }
124
133
  this.emit('nile-init');
134
+
135
+ requestAnimationFrame(() => {
136
+ if (this.portal && !this.portalManager) {
137
+ this.portalManager = new DropdownPortalManager(this);
138
+ }
139
+ });
125
140
  }
126
141
 
127
142
  firstUpdated() {
@@ -139,6 +154,11 @@ export class NileDropdown extends NileElement {
139
154
  this.removeOpenListeners();
140
155
  this.hide();
141
156
  this.emit('nile-destroy');
157
+
158
+ if (this.portalManager) {
159
+ this.portalManager.cleanupPortalAppend();
160
+ this.portalManager = null;
161
+ }
142
162
  }
143
163
 
144
164
  focusOnTrigger() {
@@ -193,10 +213,12 @@ export class NileDropdown extends NileElement {
193
213
  ? document.activeElement?.shadowRoot?.activeElement
194
214
  : document.activeElement;
195
215
 
196
- if (
197
- !this.containingElement ||
198
- activeElement?.closest(this.containingElement.tagName.toLowerCase()) !== this.containingElement
199
- ) {
216
+ const hitSelf = this.containingElement && activeElement?.closest(this.containingElement.tagName.toLowerCase()) === this.containingElement;
217
+ const hitPortalAppend = this.portal && this.portalManager?.portalContainerElement &&
218
+ (activeElement === this.portalManager.portalContainerElement ||
219
+ activeElement?.closest('.nile-dropdown-portal-append') === this.portalManager.portalContainerElement);
220
+
221
+ if (!hitSelf && !hitPortalAppend) {
200
222
  this.hide();
201
223
  }
202
224
  });
@@ -206,7 +228,10 @@ export class NileDropdown extends NileElement {
206
228
  handleDocumentMouseDown(event: MouseEvent) {
207
229
  // Close when clicking outside of the containing element
208
230
  const path = event.composedPath();
209
- if (this.containingElement && !path.includes(this.containingElement)) {
231
+ const hitSelf = this.containingElement && path.includes(this.containingElement);
232
+ const hitPortalAppend = this.portal && this.portalManager?.portalContainerElement && path.includes(this.portalManager.portalContainerElement);
233
+
234
+ if (!hitSelf && !hitPortalAppend) {
210
235
  this.hide();
211
236
  }
212
237
  }
@@ -365,6 +390,22 @@ export class NileDropdown extends NileElement {
365
390
  document.removeEventListener('mousedown', this.handleDocumentMouseDown);
366
391
  }
367
392
 
393
+ protected updated(changedProperties: PropertyValues): void {
394
+ super.updated(changedProperties);
395
+
396
+ if (changedProperties.has('portal')) {
397
+ if (this.portal && !this.portalManager) {
398
+ this.portalManager = new DropdownPortalManager(this);
399
+ if (this.open) {
400
+ this.portalManager.setupPortalAppend();
401
+ }
402
+ } else if (!this.portal && this.portalManager) {
403
+ this.portalManager.cleanupPortalAppend();
404
+ this.portalManager = null;
405
+ }
406
+ }
407
+ }
408
+
368
409
  @watch('open', { waitUntilFirstUpdate: true })
369
410
  async handleOpenChange() {
370
411
  if (this.disabled) {
@@ -379,11 +420,22 @@ export class NileDropdown extends NileElement {
379
420
  this.emit('nile-show');
380
421
  this.addOpenListeners();
381
422
 
423
+ if (this.portal && this.portalManager) {
424
+ this.portalManager.setupPortalAppend();
425
+ } else if (this.portal && !this.portalManager) {
426
+ this.portalManager = new DropdownPortalManager(this);
427
+ this.portalManager.setupPortalAppend();
428
+ }
429
+
382
430
  await stopAnimations(this);
383
- this.panel.hidden = false;
384
- this.popup.active = true;
385
- const { keyframes, options } = getAnimation(this, 'dropdown.show', { dir: '' });
386
- await animateTo(this.popup.popup, keyframes, options);
431
+
432
+ // Only show panel and animate if not using portal
433
+ if (!this.portal) {
434
+ this.panel.hidden = false;
435
+ this.popup.active = true;
436
+ const { keyframes, options } = getAnimation(this, 'dropdown.show', { dir: '' });
437
+ await animateTo(this.popup.popup, keyframes, options);
438
+ }
387
439
 
388
440
  this.emit('nile-after-show');
389
441
  } else {
@@ -391,11 +443,19 @@ export class NileDropdown extends NileElement {
391
443
  this.emit('nile-hide');
392
444
  this.removeOpenListeners();
393
445
 
446
+ if (this.portal && this.portalManager) {
447
+ this.portalManager.cleanupPortalAppend();
448
+ }
449
+
394
450
  await stopAnimations(this);
395
- const { keyframes, options } = getAnimation(this, 'dropdown.hide', { dir: '' });
396
- await animateTo(this.popup.popup, keyframes, options);
397
- this.panel.hidden = true;
398
- this.popup.active = false;
451
+
452
+ // Only hide panel and animate if not using portal
453
+ if (!this.portal) {
454
+ const { keyframes, options } = getAnimation(this, 'dropdown.hide', { dir: '' });
455
+ await animateTo(this.popup.popup, keyframes, options);
456
+ this.panel.hidden = true;
457
+ this.popup.active = false;
458
+ }
399
459
 
400
460
  this.emit('nile-after-hide');
401
461
  }
@@ -436,6 +496,7 @@ export class NileDropdown extends NileElement {
436
496
  class="dropdown__panel"
437
497
  aria-hidden=${this.open ? 'false' : 'true'}
438
498
  aria-labelledby="dropdown"
499
+ style=${this.portal && this.portalManager ? 'display: none;' : ''}
439
500
  ></slot>
440
501
  </nile-popup>
441
502
  `;