Skip to content

Commit c0ef6cf

Browse files
authored
fix(web-components): make anchor position targets fixed positioned (microsoft#36258)
1 parent 23c05d1 commit c0ef6cf

10 files changed

Lines changed: 111 additions & 33 deletions

File tree

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"type": "prerelease",
3+
"comment": "make anchor position target fixed position",
4+
"packageName": "@fluentui/web-components",
5+
"email": "machi@microsoft.com",
6+
"dependentChangeType": "patch"
7+
}

packages/web-components/src/dialog/dialog.styles.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ export const styles = css`
4141
4242
:host([type='non-modal']) dialog {
4343
inset: 0;
44-
position: fixed;
4544
z-index: 2;
4645
overflow: auto;
4746
}

packages/web-components/src/dropdown/dropdown.stories.ts

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -493,3 +493,85 @@ export const OverflowScroll: Story = {
493493
`),
494494
args: { ...Default.args },
495495
};
496+
497+
export const InsideDialog: Story = {
498+
render: renderComponent(html<StoryArgs<FluentDropdown>>`
499+
<fluent-button @click="${story => story.dialog.show()}">Open dialog</fluent-button>
500+
<fluent-dialog ${ref('dialog')} aria-label="Dropdown in a dialog">
501+
<fluent-dialog-body>
502+
<h3 slot="title">Dropdown in a dialog</h3>
503+
${storyTemplate}
504+
</fluent-dialog-body>
505+
</fluent-dialog>
506+
`),
507+
args: { ...Default.args },
508+
};
509+
510+
export const InsideDialogWithScrollingContent: Story = {
511+
render: renderComponent(html<StoryArgs<FluentDropdown>>`
512+
<fluent-button @click="${story => story.dialog.show()}">Open dialog</fluent-button>
513+
<fluent-dialog ${ref('dialog')} aria-label="Dropdown in a dialog with scrolling content">
514+
<fluent-dialog-body style="max-block-size: 30vb;">
515+
<h3 slot="title">Dropdown in a dialog</h3>
516+
<p>
517+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce nec lectus non lorem iaculis luctus. Proin ac
518+
dolor eget enim commodo pretium. Duis ut nibh ac metus interdum finibus. Integer maximus ante a tincidunt
519+
pretium. Aliquam erat volutpat. Sed nec ante vel lectus dignissim commodo id ut elit. Curabitur ullamcorper
520+
sapien id mauris interdum, ac placerat mi malesuada. Duis aliquam, dolor eget facilisis mollis, ante leo
521+
tincidunt quam, vel convallis ipsum turpis et turpis. Mauris fermentum neque nec tortor semper tempus. Integer
522+
malesuada, nunc ac cursus facilisis, lectus mauris interdum erat, in vulputate risus velit in neque. Etiam
523+
volutpat ante nec fringilla tempus. Quisque et lobortis dolor. Fusce sit amet odio sed ipsum fringilla auctor.
524+
Suspendisse faucibus tellus in luctus hendrerit. Vestibulum euismod velit non laoreet feugiat. Nam sit amet
525+
velit urna. Cras consectetur tempor sem, in suscipit sem ultrices id. Vivamus id felis fringilla, scelerisque
526+
nulla non, aliquam leo. In pharetra mauris ut enim ullamcorper, id suscipit quam ullamcorper. Quisque
527+
tincidunt, felis nec congue elementum, mauris est finibus ex, ut volutpat ante est nec est. Aliquam tempor,
528+
turpis ac scelerisque dignissim, metus velit rutrum sem, eget efficitur mauris erat in metus. Vestibulum in
529+
urna massa. Donec eleifend leo at dui convallis aliquet. Integer eleifend, velit ut consequat tempus, enim
530+
elit ultricies diam, at congue enim enim id nunc. Nullam fringilla bibendum nulla, at lacinia sem bibendum
531+
eget. Nunc posuere ipsum sed enim facilisis efficitur. Pellentesque id semper mi, a feugiat sem. Nunc
532+
interdum, leo ut tincidunt consectetur, nunc mauris accumsan nulla, vel ultricies velit erat nec sapien.
533+
Praesent eleifend ex at odio scelerisque cursus. Morbi eget tellus sed sapien scelerisque cursus at a ante.
534+
Sed venenatis vehicula erat eu feugiat. Ut eu elit vitae urna tincidunt pulvinar nec at nunc. Vestibulum eget
535+
tristique sapien. Sed egestas sapien vel ante viverra pharetra. Cras sit amet felis at nulla tincidunt euismod
536+
vitae et justo. Duis nec rutrum lectus, nec lobortis quam. Pellentesque habitant morbi tristique senectus et
537+
netus et malesuada fames ac turpis egestas. Sed ac ex condimentum, consectetur felis non, maximus odio. Sed
538+
mattis arcu id justo fringilla, a tristique purus vestibulum. Nulla nec fringilla quam. Sed ac elit ac sem
539+
posuere cursus nec vitae mauris. Suspendisse nec pulvinar risus. Sed a tincidunt elit, in gravida tortor.
540+
Quisque sollicitudin lectus vel interdum tempor. Fusce dictum fermentum sem sed suscipit. Vivamus sollicitudin
541+
ex turpis, sit amet consequat leo auctor at. Donec fermentum aliquet lectus, sit amet efficitur nibh
542+
pellentesque et. Curabitur dapibus quam vitae lectus pellentesque, vitae varius massa facilisis. Quisque
543+
consectetur eros a arcu cursus fringilla. Fusce efficitur auctor nibh, nec sollicitudin eros semper eget. Cras
544+
a elit ut tortor semper volutpat eu vel nunc. Duis dapibus quam risus, ac tristique nisl aliquam eu. Curabitur
545+
vel ipsum non nunc euismod fringilla vel a lorem. Curabitur viverra magna ac justo fringilla, eu vestibulum
546+
purus finibus. Donec elementum volutpat libero, in tempus massa convallis vitae. Curabitur vitae mauris id
547+
urna dictum pharetra. Nullam vehicula arcu arcu, vitae elementum enim tincidunt at. Duis eleifend, lorem a
548+
efficitur facilisis, nulla dolor finibus orci, et ullamcorper orci ex ac purus. Aenean sem lectus, malesuada
549+
id magna id, facilisis condimentum nibh. Cras tempor neque mi, sit amet suscipit libero consectetur non.
550+
Nullam id eleifend mauris. Mauris iaculis lectus eu scelerisque efficitur. In id suscipit libero. Donec
551+
condimentum, purus ac laoreet facilisis, risus lorem facilisis neque, id volutpat felis mi eget metus. Nulla
552+
facilisi. Donec consequat tincidunt nunc sed elementum. Integer consectetur tristique orci, ut congue justo
553+
pellentesque eu. Fusce faucibus iaculis mauris, eu lobortis orci egestas eget. Nullam nec arcu bibendum,
554+
cursus diam ac, facilisis enim. Nulla facilisi. Curabitur lacinia odio mauris, a gravida nisi volutpat in.
555+
Aliquam at maximus felis. Vestibulum convallis dignissim urna id gravida.
556+
</p>
557+
${storyTemplate}
558+
</fluent-dialog-body>
559+
</fluent-dialog>
560+
`),
561+
args: { ...Default.args },
562+
};
563+
564+
export const InsideNonModalDialog: Story = {
565+
render: renderComponent(html<StoryArgs<FluentDropdown>>`
566+
<div style="min-block-size: 20rem;">
567+
<fluent-button @click="${story => story.dialog.show()}">Open dialog</fluent-button>
568+
<fluent-dialog ${ref('dialog')} type="non-modal" aria-label="Dropdown in a non-modal dialog">
569+
<fluent-dialog-body>
570+
<h3 slot="title">Dropdown in a non-modal dialog</h3>
571+
${storyTemplate}
572+
</fluent-dialog-body>
573+
</fluent-dialog>
574+
</div>
575+
`),
576+
args: { ...Default.args },
577+
};

packages/web-components/src/dropdown/dropdown.styles.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,6 @@ export const styles = css`
5959
${display('inline-flex')}
6060
6161
:host {
62-
anchor-name: --dropdown-trigger;
6362
box-sizing: border-box;
6463
color: ${colorNeutralForeground1};
6564
cursor: pointer;

packages/web-components/src/listbox/listbox.styles.ts

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ export const styles = css`
2727
box-sizing: border-box;
2828
flex-direction: column;
2929
margin: 0;
30-
min-width: 160px;
30+
min-inline-size: 160px;
3131
padding: ${spacingHorizontalXS};
3232
row-gap: ${spacingHorizontalXXS};
3333
width: auto;
@@ -40,26 +40,20 @@ export const styles = css`
4040
4141
@supports (anchor-name: --anchor) {
4242
:host([popover]) {
43-
position: absolute;
44-
margin-block-start: 0;
45-
max-height: var(--listbox-max-height, calc(50vh - anchor-size(self-block)));
46-
min-width: anchor-size(width);
47-
position-anchor: --dropdown;
48-
position-area: block-end span-inline-end;
49-
position-try-fallbacks: flip-inline, flip-block, --flip-block, block-start;
50-
}
51-
52-
@position-try --flip-block {
53-
bottom: anchor(top);
54-
top: unset;
43+
position: fixed;
44+
max-block-size: var(--listbox-max-height, calc(50vh - anchor-size(self-block)));
45+
min-inline-size: anchor-size(inline);
46+
inset-block-start: anchor(end);
47+
inset-inline-start: anchor(start);
48+
position-try-fallbacks: flip-block, flip-inline, flip-inline flip-block;
5549
}
5650
}
5751
5852
@supports not (anchor-name: --anchor) {
5953
:host([popover]) {
6054
margin-block-start: var(--margin-offset, 0);
61-
max-height: var(--listbox-max-height, 50vh);
62-
position: fixed;
55+
max-block-size: var(--listbox-max-height, 50vh);
56+
position: absolute;
6357
}
6458
6559
:host([popover]${flipBlockState}) {

packages/web-components/src/menu-item/menu-item.styles.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -147,9 +147,11 @@ export const styles = css`
147147
::slotted([popover]) {
148148
margin: 0;
149149
max-height: var(--menu-max-height, auto);
150-
position: absolute;
150+
position: fixed;
151151
position-anchor: --menu-trigger;
152-
position-area: inline-end span-block-end;
152+
inset: unset;
153+
inset-block-start: anchor(start);
154+
inset-inline-start: anchor(end);
153155
position-try-fallbacks: flip-inline, block-start, block-end;
154156
z-index: 1;
155157
}
@@ -158,10 +160,6 @@ export const styles = css`
158160
display: none;
159161
}
160162
161-
::slotted([popover]:popover-open) {
162-
inset: unset;
163-
}
164-
165163
/* Fallback for no anchor-positioning */
166164
@supports not (anchor-name: --menu-trigger) {
167165
::slotted([popover]) {

packages/web-components/src/menu/menu.styles.ts

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,17 @@ export const styles = css`
1616
margin: 0;
1717
max-height: var(--menu-max-height, auto);
1818
position-anchor: --menu-trigger;
19-
position-area: block-end span-inline-end;
19+
inset: unset;
20+
inset-block-start: anchor(end);
21+
inset-inline-start: anchor(start);
2022
position-try-fallbacks: flip-block;
21-
position: absolute;
23+
position: fixed;
2224
z-index: 1;
2325
}
2426
2527
:host([split]) ::slotted([popover]) {
26-
position-area: block-end span-inline-start;
27-
}
28-
29-
::slotted([popover]:popover-open) {
30-
inset: unset;
28+
inset-inline-start: auto;
29+
inset-inline-end: anchor(end);
3130
}
3231
3332
::slotted([popover]:not(:popover-open)) {

packages/web-components/src/tablist/tablist.styles.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ export const styles = css`
201201
content: '';
202202
inline-size: 100%;
203203
inset: auto auto anchor(end) anchor(center);
204-
position: absolute;
204+
position: fixed;
205205
position-anchor: --tab;
206206
transform: translateX(-50%);
207207
transition-property: inset-inline, width;

packages/web-components/src/tooltip/tooltip.styles.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ export const styles = css`
4949
padding: 4px ${spacingHorizontalMNudge} 6px;
5050
position: absolute;
5151
position-area: var(--position-area);
52-
position-try-options: var(--position-try-options);
52+
position-try-fallbacks: var(--position-try-options);
5353
width: auto;
5454
z-index: 1;
5555
}

packages/web-components/src/tooltip/tooltip.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ export class Tooltip extends FASTElement {
256256
#${this.id} {
257257
inset: unset;
258258
position-anchor: ${anchorName};
259-
position: absolute;
259+
position: fixed;
260260
${directionCSS}
261261
${alignmentCSS}
262262
}

0 commit comments

Comments
 (0)