@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.
- package/README.md +4 -0
- package/dist/{fixture-dff65c89.cjs.js → fixture-1c49c014.cjs.js} +2 -2
- package/dist/{fixture-dff65c89.cjs.js.map → fixture-1c49c014.cjs.js.map} +1 -1
- package/dist/index.cjs.js +1 -1
- package/dist/index.esm.js +1 -1
- package/dist/index.js +371 -370
- package/dist/nile-accordion/nile-accordian.test.cjs.js +1 -1
- package/dist/nile-auto-complete/index.cjs.js +1 -1
- package/dist/nile-auto-complete/index.esm.js +1 -1
- package/dist/nile-auto-complete/nile-auto-complete.cjs.js +1 -1
- package/dist/nile-auto-complete/nile-auto-complete.cjs.js.map +1 -1
- package/dist/nile-auto-complete/nile-auto-complete.esm.js +4 -4
- package/dist/nile-auto-complete/nile-auto-complete.test.cjs.js +1 -1
- package/dist/nile-auto-complete/nile-auto-complete.test.cjs.js.map +1 -1
- package/dist/nile-auto-complete/nile-auto-complete.test.esm.js +1 -1
- package/dist/nile-auto-complete/portal-manager.cjs.js +1 -1
- package/dist/nile-auto-complete/portal-manager.cjs.js.map +1 -1
- package/dist/nile-auto-complete/portal-manager.esm.js +1 -1
- package/dist/nile-auto-complete/portal-utils.cjs.js +1 -1
- package/dist/nile-auto-complete/portal-utils.cjs.js.map +1 -1
- package/dist/nile-auto-complete/portal-utils.esm.js +1 -1
- package/dist/nile-avatar/nile-avatar.test.cjs.js +1 -1
- package/dist/nile-badge/nile-badge.test.cjs.js +1 -1
- package/dist/nile-button/nile-button.test.cjs.js +1 -1
- package/dist/nile-button-toggle-group/nile-button-toggle-group.test.cjs.js +1 -1
- package/dist/nile-calendar/nile-calendar.test.cjs.js +1 -1
- package/dist/nile-card/nile-card.test.cjs.js +1 -1
- package/dist/nile-checkbox/nile-checkbox.test.cjs.js +1 -1
- package/dist/nile-chip/nile-chip.cjs.js +1 -1
- package/dist/nile-chip/nile-chip.cjs.js.map +1 -1
- package/dist/nile-chip/nile-chip.esm.js +1 -1
- package/dist/nile-chip/nile-chip.test.cjs.js +1 -1
- package/dist/nile-chip/nile-chip.test.cjs.js.map +1 -1
- package/dist/nile-chip/nile-chip.test.esm.js +1 -1
- package/dist/nile-dialog/nile-dialog.test.cjs.js +1 -1
- package/dist/nile-drawer/nile-drawer.test.cjs.js +1 -1
- package/dist/nile-dropdown/index.cjs.js +1 -1
- package/dist/nile-dropdown/index.esm.js +1 -1
- package/dist/nile-dropdown/nile-dropdown.cjs.js +1 -1
- package/dist/nile-dropdown/nile-dropdown.cjs.js.map +1 -1
- package/dist/nile-dropdown/nile-dropdown.esm.js +3 -2
- package/dist/nile-dropdown/nile-dropdown.test.cjs.js +1 -1
- package/dist/nile-dropdown/nile-dropdown.test.cjs.js.map +1 -1
- package/dist/nile-dropdown/nile-dropdown.test.esm.js +1 -1
- package/dist/nile-dropdown/portal-manager.cjs.js +2 -0
- package/dist/nile-dropdown/portal-manager.cjs.js.map +1 -0
- package/dist/nile-dropdown/portal-manager.esm.js +1 -0
- package/dist/nile-dropdown/portal-utils.cjs.js +2 -0
- package/dist/nile-dropdown/portal-utils.cjs.js.map +1 -0
- package/dist/nile-dropdown/portal-utils.esm.js +1 -0
- package/dist/nile-empty-state/nile-empty-state.test.cjs.js +1 -1
- package/dist/nile-error-message/nile-error-message.test.cjs.js +1 -1
- package/dist/nile-file-preview/nile-file-preview.test.cjs.js +1 -1
- package/dist/nile-file-upload/index.cjs.js +1 -1
- package/dist/nile-file-upload/nile-file-upload.cjs.js +1 -1
- package/dist/nile-file-upload/nile-file-upload.template.cjs.js +1 -1
- package/dist/nile-file-upload/nile-file-upload.test.cjs.js +1 -1
- package/dist/nile-filter-chip/nile-filter-chip.test.cjs.js +1 -1
- package/dist/nile-form-group/nile-form-group.test.cjs.js +1 -1
- package/dist/nile-form-help-text/nile-form-help-text.test.cjs.js +1 -1
- package/dist/nile-hero/nile-hero.test.cjs.js +1 -1
- package/dist/nile-icon/nile-icon.test.cjs.js +1 -1
- package/dist/nile-input/nile-input.test.cjs.js +1 -1
- package/dist/nile-link/nile-link.test.cjs.js +1 -1
- package/dist/nile-lite-tooltip/nile-lite-tooltip.cjs.js +1 -1
- package/dist/nile-lite-tooltip/nile-lite-tooltip.cjs.js.map +1 -1
- package/dist/nile-lite-tooltip/nile-lite-tooltip.esm.js +1 -1
- package/dist/nile-loader/nile-loader.test.cjs.js +1 -1
- package/dist/nile-popover/index.cjs.js +1 -1
- package/dist/nile-popover/nile-popover.cjs.js +1 -1
- package/dist/nile-popover/nile-popover.test.cjs.js +1 -1
- package/dist/nile-popup/nile-popup.test.cjs.js +1 -1
- package/dist/nile-progress-bar/nile-progress-bar.test.cjs.js +1 -1
- package/dist/nile-radio/nile-radio.test.cjs.js +1 -1
- package/dist/nile-radio-group/nile-radio-group.test.cjs.js +1 -1
- package/dist/nile-select/nile-select.test.cjs.js +1 -1
- package/dist/nile-slide-toggle/nile-slide-toggle.test.cjs.js +1 -1
- package/dist/nile-tab-group/nile-tab-group.test.cjs.js +1 -1
- package/dist/nile-textarea/nile-textarea.test.cjs.js +1 -1
- package/dist/nile-virtual-select/nile-virtual-select.test.cjs.js +1 -1
- package/dist/{scopedElementsWrapper-1bff26ef.cjs.js → scopedElementsWrapper-5ea5834f.cjs.js} +2 -2
- package/dist/{scopedElementsWrapper-1bff26ef.cjs.js.map → scopedElementsWrapper-5ea5834f.cjs.js.map} +1 -1
- package/dist/src/nile-auto-complete/nile-auto-complete.js.map +1 -1
- package/dist/src/nile-auto-complete/portal-utils.js +5 -5
- package/dist/src/nile-auto-complete/portal-utils.js.map +1 -1
- package/dist/src/nile-chip/nile-chip.js +24 -13
- package/dist/src/nile-chip/nile-chip.js.map +1 -1
- package/dist/src/nile-dropdown/nile-dropdown.d.ts +8 -1
- package/dist/src/nile-dropdown/nile-dropdown.js +67 -11
- package/dist/src/nile-dropdown/nile-dropdown.js.map +1 -1
- package/dist/src/nile-dropdown/portal-manager.d.ts +43 -0
- package/dist/src/nile-dropdown/portal-manager.js +374 -0
- package/dist/src/nile-dropdown/portal-manager.js.map +1 -0
- package/dist/src/nile-dropdown/portal-utils.d.ts +32 -0
- package/dist/src/nile-dropdown/portal-utils.js +212 -0
- package/dist/src/nile-dropdown/portal-utils.js.map +1 -0
- package/dist/src/nile-lite-tooltip/nile-lite-tooltip.d.ts +1 -0
- package/dist/src/nile-lite-tooltip/nile-lite-tooltip.js +37 -19
- package/dist/src/nile-lite-tooltip/nile-lite-tooltip.js.map +1 -1
- package/dist/src/version.js +1 -1
- package/dist/src/version.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/nile-auto-complete/nile-auto-complete.ts +0 -2
- package/src/nile-auto-complete/portal-utils.ts +5 -5
- package/src/nile-chip/nile-chip.ts +23 -13
- package/src/nile-dropdown/nile-dropdown.ts +75 -14
- package/src/nile-dropdown/portal-manager.ts +488 -0
- package/src/nile-dropdown/portal-utils.ts +269 -0
- package/src/nile-lite-tooltip/nile-lite-tooltip.ts +42 -21
- package/vscode-html-custom-data.json +12 -2
package/package.json
CHANGED
|
@@ -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
|
|
179
|
-
const
|
|
180
|
-
|
|
181
|
-
|
|
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
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
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
|
-
|
|
197
|
-
|
|
198
|
-
|
|
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
|
-
|
|
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
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
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
|
-
|
|
396
|
-
|
|
397
|
-
this.
|
|
398
|
-
|
|
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
|
`;
|