Skip to content

Commit 0a626ae

Browse files
authored
Merge branch 'main' into v1/bugfix/menu-item-z-index
2 parents da99d41 + a88759c commit 0a626ae

File tree

7 files changed

+247
-126
lines changed

7 files changed

+247
-126
lines changed

package-lock.json

Lines changed: 31 additions & 28 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,9 +125,9 @@
125125
"storybook": "^9.1.1",
126126
"tsc-files": "1.1.4",
127127
"turbo": "2.5.5",
128-
"typescript": "5.8.2",
128+
"typescript": "5.9.3",
129129
"typescript-eslint": "8.26.0",
130-
"vite": "6.3.5",
130+
"vite": "7.1.9",
131131
"vite-plugin-turbosnap": "1.0.3",
132132
"web-component-analyzer": "2.0.0"
133133
},

packages/uui-popover-container/lib/uui-popover-container.element.ts

Lines changed: 38 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -72,14 +72,20 @@ export class UUIPopoverContainerElement extends LitElement {
7272
#sizeObserver: ResizeObserver | null = null;
7373
#size: { width: number; height: number } = { width: 0, height: 0 };
7474

75+
constructor() {
76+
super();
77+
78+
this.addEventListener('beforetoggle', this.#onBeforeToggle, {
79+
passive: true,
80+
});
81+
}
82+
7583
connectedCallback(): void {
84+
super.connectedCallback();
7685
if (!this.hasAttribute('popover')) {
7786
this.setAttribute('popover', '');
7887
}
7988

80-
super.connectedCallback();
81-
this.addEventListener('beforetoggle', this.#onBeforeToggle);
82-
8389
if (!this.#sizeObserver) {
8490
this.#sizeObserver = new ResizeObserver(entries => {
8591
const element = entries[0]; // should be only one
@@ -101,7 +107,6 @@ export class UUIPopoverContainerElement extends LitElement {
101107

102108
disconnectedCallback(): void {
103109
super.disconnectedCallback();
104-
this.removeEventListener('beforetoggle', this.#onBeforeToggle);
105110
this.#stopScrollListener();
106111
this.#sizeObserver?.disconnect();
107112
this.#sizeObserver = null;
@@ -116,8 +121,6 @@ export class UUIPopoverContainerElement extends LitElement {
116121
this.id,
117122
);
118123

119-
this.#getScrollParents();
120-
121124
// Dispatch a custom event that can be listened to by the popover target.
122125
// Mostly used for UUIButton.
123126
this.#targetElement?.dispatchEvent(
@@ -131,16 +134,17 @@ export class UUIPopoverContainerElement extends LitElement {
131134
}),
132135
);
133136

134-
if (!this._open) {
135-
this.#stopScrollListener();
136-
return;
137-
}
137+
if (this._open) {
138+
this.#calculateScrollParents();
138139

139-
this.#startScrollListener();
140+
this.#startScrollListener();
140141

141-
requestAnimationFrame(() => {
142-
this.#initUpdate();
143-
});
142+
requestAnimationFrame(() => {
143+
this.#initUpdate();
144+
});
145+
} else {
146+
this.#stopScrollListener();
147+
}
144148
};
145149

146150
#initUpdate = () => {
@@ -340,7 +344,17 @@ export class UUIPopoverContainerElement extends LitElement {
340344
document.removeEventListener('scroll', this.#initUpdate);
341345
}
342346

343-
#getScrollParents(): any {
347+
/**
348+
* @internal
349+
*/
350+
_getScrollParents() {
351+
return this.#scrollParents;
352+
}
353+
354+
#calculateScrollParents(): void {
355+
// Clear previous scroll parents to avoid duplicates
356+
this.#scrollParents = [];
357+
344358
if (!this.#targetElement) return;
345359

346360
let style = getComputedStyle(this.#targetElement);
@@ -349,7 +363,7 @@ export class UUIPopoverContainerElement extends LitElement {
349363
}
350364

351365
const includeHidden = false;
352-
const excludeStaticParent = style.position === 'absolute';
366+
let excludeStaticParent = style.position === 'absolute';
353367
const overflowRegex = includeHidden
354368
? /(auto|scroll|hidden)/
355369
: /(auto|scroll)/;
@@ -362,6 +376,11 @@ export class UUIPopoverContainerElement extends LitElement {
362376
el = this.#getAncestorElement(el);
363377
continue;
364378
}
379+
380+
if (style.position !== 'static') {
381+
excludeStaticParent = style.position === 'absolute';
382+
}
383+
365384
if (
366385
overflowRegex.test(style.overflow + style.overflowY + style.overflowX)
367386
) {
@@ -379,10 +398,10 @@ export class UUIPopoverContainerElement extends LitElement {
379398
#getAncestorElement(el: HTMLElement | null): HTMLElement | null {
380399
if (el?.parentElement) {
381400
return el.parentElement;
382-
} else {
383-
// If we had no parentElement, then check for shadow roots:
384-
return (el?.getRootNode() as any)?.host;
385401
}
402+
403+
// If we had no parentElement, then check for shadow roots:
404+
return (el?.getRootNode() as any)?.host;
386405
}
387406

388407
render() {

packages/uui-popover-container/lib/uui-popover-container.story.ts

Lines changed: 23 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,28 @@ const meta: Meta<UUIPopoverContainerElement> = {
99
id: 'uui-popover-container',
1010
component: 'uui-popover-container',
1111
title: 'Displays/Popover Container',
12+
argTypes: {
13+
open: {
14+
control: false,
15+
},
16+
placement: {
17+
options: [
18+
'auto',
19+
'top',
20+
'top-start',
21+
'top-end',
22+
'bottom',
23+
'bottom-start',
24+
'bottom-end',
25+
'right',
26+
'right-start',
27+
'right-end',
28+
'left',
29+
'left-start',
30+
'left-end',
31+
],
32+
},
33+
},
1234
parameters: {
1335
readme: {
1436
markdown: readme,
@@ -32,28 +54,6 @@ export const Overview: Story = {
3254
placement: 'bottom-start',
3355
margin: 0,
3456
},
35-
argTypes: {
36-
open: {
37-
control: false,
38-
},
39-
placement: {
40-
options: [
41-
'auto',
42-
'top',
43-
'top-start',
44-
'top-end',
45-
'bottom',
46-
'bottom-start',
47-
'bottom-end',
48-
'right',
49-
'right-start',
50-
'right-end',
51-
'left',
52-
'left-start',
53-
'left-end',
54-
],
55-
},
56-
},
5757
render: args => html`
5858
<uui-button
5959
id="popover-button"
@@ -119,28 +119,6 @@ export const Tooltip: Story = {
119119
placement: 'bottom-start',
120120
margin: 0,
121121
},
122-
argTypes: {
123-
open: {
124-
control: false,
125-
},
126-
placement: {
127-
options: [
128-
'auto',
129-
'top',
130-
'top-start',
131-
'top-end',
132-
'bottom',
133-
'bottom-start',
134-
'bottom-end',
135-
'right',
136-
'right-start',
137-
'right-end',
138-
'left',
139-
'left-start',
140-
'left-end',
141-
],
142-
},
143-
},
144122
render: args => html`
145123
Sometimes words such as
146124
<b id="tooltip-toggle" popovertarget="tooltip-popover">petrichor</b> needs
@@ -164,28 +142,6 @@ export const InsideScrollContainer: Story = {
164142
placement: 'bottom-start',
165143
margin: 0,
166144
},
167-
argTypes: {
168-
open: {
169-
control: false,
170-
},
171-
placement: {
172-
options: [
173-
'auto',
174-
'top',
175-
'top-start',
176-
'top-end',
177-
'bottom',
178-
'bottom-start',
179-
'bottom-end',
180-
'right',
181-
'right-start',
182-
'right-end',
183-
'left',
184-
'left-start',
185-
'left-end',
186-
],
187-
},
188-
},
189145
render: args => html`
190146
<div style="height: 500px; overflow: auto; outline: 1px solid black">
191147
<div
@@ -222,15 +178,10 @@ export const InsideShadowDOMScrollContainer: Story = {
222178
placement: 'bottom-start',
223179
margin: 0,
224180
},
225-
argTypes: {
226-
open: {
227-
control: false,
228-
},
229-
},
230181
render: () => html`
231182
<div style="height: 500px; overflow: auto; outline: 1px solid black">
232183
<div
233-
style="position:static; width: 300px; height: 300px; outline: 1px solid black; overflow: auto;">
184+
style="position:static; width: 300px; height: 300px; outline: 1px solid black; overflow: auto; margin:auto">
234185
<div style="height: 150px"></div>
235186
<uui-popover-container-shadowdomtester></uui-popover-container-shadowdomtester>
236187
<div style="height: 150px"></div>

0 commit comments

Comments
 (0)