Skip to content

Commit 2a8bc15

Browse files
web-padawanclaude
andauthored
feat: add backdrop fade-in/out transition to master-detail-layout (#11414)
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent e173de5 commit 2a8bc15

File tree

3 files changed

+21
-8
lines changed

3 files changed

+21
-8
lines changed

packages/master-detail-layout/src/styles/vaadin-master-detail-layout-base-styles.js

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -74,11 +74,12 @@ export const masterDetailLayoutStyles = css`
7474
grid-row: detail-start / detail-end;
7575
}
7676
77-
[part~='backdrop'] {
77+
#backdrop {
7878
position: absolute;
7979
inset: 0;
8080
z-index: 1;
81-
display: none;
81+
opacity: 0;
82+
pointer-events: none;
8283
background: var(--vaadin-overlay-backdrop-background, rgba(0, 0, 0, 0.2));
8384
forced-color-adjust: none;
8485
}
@@ -141,8 +142,9 @@ export const masterDetailLayoutStyles = css`
141142
grid-row: none;
142143
}
143144
144-
:host([has-detail][overlay]) [part~='backdrop'] {
145-
display: block;
145+
:host([has-detail][overlay]) #backdrop {
146+
opacity: 1;
147+
pointer-events: auto;
146148
}
147149
148150
:host([has-detail][overlay]:not([orientation='vertical'])) :is(#detail, #outgoing) {
@@ -157,8 +159,7 @@ export const masterDetailLayoutStyles = css`
157159
height: var(--_overlay-size, var(--_detail-size, min-content));
158160
}
159161
160-
:host([has-detail][overlay][overlay-containment='viewport']) :is(#detail, #outgoing),
161-
:host([has-detail][overlay][overlay-containment='viewport']) [part~='backdrop'] {
162+
:host([has-detail][overlay][overlay-containment='viewport']) :is(#detail, #outgoing, #backdrop) {
162163
position: fixed;
163164
}
164165

packages/master-detail-layout/src/vaadin-master-detail-layout.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ class MasterDetailLayout extends ElementMixin(ThemableMixin(PolylitMixin(LitElem
214214
const isLayoutContained = isOverlay && !isViewport;
215215

216216
return html`
217-
<div part="backdrop" @click="${this.__onBackdropClick}"></div>
217+
<div id="backdrop" part="backdrop" @click="${this.__onBackdropClick}"></div>
218218
<div id="master" part="master" ?inert="${isLayoutContained}">
219219
<slot @slotchange="${this.__onSlotChange}"></slot>
220220
</div>
@@ -542,6 +542,15 @@ class MasterDetailLayout extends ElementMixin(ThemableMixin(PolylitMixin(LitElem
542542
} else {
543543
this.__slide(this.$.detail, true, opts).then(() => onFinish());
544544
}
545+
546+
// Fade backdrop in/out for overlay add/remove (not replace — backdrop stays visible)
547+
if (opts.overlay && transitionType !== 'replace') {
548+
const fadeIn = transitionType !== 'remove';
549+
this.__animate(this.$.backdrop, [{ opacity: fadeIn ? 0 : 1 }, { opacity: fadeIn ? 1 : 0 }], {
550+
duration: opts.duration,
551+
easing: 'linear',
552+
});
553+
}
545554
});
546555
}
547556

packages/master-detail-layout/test/dom/__snapshots__/master-detail-layout.test.snap.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,10 @@ snapshots["vaadin-master-detail-layout host no detail placeholder"] =
115115
/* end snapshot vaadin-master-detail-layout host no detail placeholder */
116116

117117
snapshots["vaadin-master-detail-layout shadow default"] =
118-
`<div part="backdrop">
118+
`<div
119+
id="backdrop"
120+
part="backdrop"
121+
>
119122
</div>
120123
<div
121124
id="master"

0 commit comments

Comments
 (0)