Skip to content

Commit beedd45

Browse files
vursenclaude
andauthored
fix: use :scope selector for all slotted element queries (#11477)
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 2fc3983 commit beedd45

1 file changed

Lines changed: 29 additions & 13 deletions

File tree

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

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -318,9 +318,10 @@ class MasterDetailLayout extends ElementMixin(ThemableMixin(PolylitMixin(LitElem
318318
this.__resizeObserver = this.__resizeObserver || new ResizeObserver(() => this.__onResize());
319319
this.__resizeObserver.disconnect();
320320

321-
const children = this.querySelectorAll(':scope > [slot="detail"], :scope >:not([slot])');
322-
[this, this.$.master, this.$.detail, ...children].forEach((node) => {
323-
this.__resizeObserver.observe(node);
321+
[this, this.$.master, this.$.detail, this.__slottedMaster, this.__slottedDetail].forEach((node) => {
322+
if (node) {
323+
this.__resizeObserver.observe(node);
324+
}
324325
});
325326
}
326327

@@ -344,14 +345,14 @@ class MasterDetailLayout extends ElementMixin(ThemableMixin(PolylitMixin(LitElem
344345
__readLayoutState() {
345346
const isVertical = this.orientation === 'vertical';
346347

347-
const masterContent = this.querySelector(':scope > :is([slot=""], :not([slot]))');
348-
const detailContent = this.querySelector(':scope > [slot="detail"]');
349-
const detailPlaceholder = this.querySelector(':scope > [slot="detail-placeholder"]');
348+
const slottedMaster = this.__slottedMaster;
349+
const slottedDetail = this.__slottedDetail;
350+
const slottedDetailPlaceholder = this.__slottedDetailPlaceholder;
350351

351-
const hasMaster = !!masterContent;
352+
const hasMaster = !!slottedMaster;
352353
const hadDetail = this.hasAttribute('has-detail');
353-
const hasDetail = detailContent != null && detailContent.checkVisibility();
354-
const hasDetailPlaceholder = !!detailPlaceholder;
354+
const hasDetail = slottedDetail != null && slottedDetail.checkVisibility();
355+
const hasDetailPlaceholder = !!slottedDetailPlaceholder;
355356

356357
const computedStyle = getComputedStyle(this);
357358
const hostSizeProp = isVertical ? 'height' : 'width';
@@ -361,7 +362,7 @@ class MasterDetailLayout extends ElementMixin(ThemableMixin(PolylitMixin(LitElem
361362
const trackSizes = parseTrackSizes(computedStyle[trackSizesProp]);
362363

363364
const hasOverflow = (hasDetail || hasDetailPlaceholder) && detectOverflow(hostSize, trackSizes);
364-
const focusTarget = !hadDetail && hasDetail && hasOverflow ? getFocusableElements(detailContent)[0] : null;
365+
const focusTarget = !hadDetail && hasDetail && hasOverflow ? getFocusableElements(slottedDetail)[0] : null;
365366

366367
return {
367368
hasMaster,
@@ -500,7 +501,7 @@ class MasterDetailLayout extends ElementMixin(ThemableMixin(PolylitMixin(LitElem
500501
*/
501502
async _setDetail(newDetail, skipTransition) {
502503
// Don't start a transition if detail didn't change
503-
const oldDetail = this.querySelector('[slot="detail"]');
504+
const oldDetail = this.__slottedDetail;
504505
if (oldDetail === (newDetail || null)) {
505506
return;
506507
}
@@ -526,7 +527,7 @@ class MasterDetailLayout extends ElementMixin(ThemableMixin(PolylitMixin(LitElem
526527
return;
527528
}
528529

529-
const hasPlaceholder = !!this.querySelector('[slot="detail-placeholder"]');
530+
const hasPlaceholder = !!this.__slottedDetailPlaceholder;
530531
if ((oldDetail && newDetail) || (hasPlaceholder && !this.hasAttribute('overlay'))) {
531532
await this._startTransition('replace', updateSlot);
532533
} else if (!oldDetail && newDetail) {
@@ -631,7 +632,7 @@ class MasterDetailLayout extends ElementMixin(ThemableMixin(PolylitMixin(LitElem
631632
* @private
632633
*/
633634
__snapshotDetailOutgoing() {
634-
const currentDetail = this.querySelector('[slot="detail"]');
635+
const currentDetail = this.__slottedDetail;
635636
if (!currentDetail) {
636637
return;
637638
}
@@ -650,6 +651,21 @@ class MasterDetailLayout extends ElementMixin(ThemableMixin(PolylitMixin(LitElem
650651
this.__replacing = false;
651652
}
652653

654+
/** @private */
655+
get __slottedMaster() {
656+
return this.querySelector(':scope > :is([slot=""], :not([slot]))');
657+
}
658+
659+
/** @private */
660+
get __slottedDetail() {
661+
return this.querySelector(':scope > [slot="detail"]');
662+
}
663+
664+
/** @private */
665+
get __slottedDetailPlaceholder() {
666+
return this.querySelector(':scope > [slot="detail-placeholder"]');
667+
}
668+
653669
/**
654670
* @event backdrop-click
655671
* Fired when the user clicks the backdrop in the overlay mode.

0 commit comments

Comments
 (0)