Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions express/code/blocks/grid-marquee/grid-marquee.css
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,13 @@
text-align: center;
}

/* Anti-FOUC: hide raw authored rows until the block builds .foreground, so the
staged decoration (image removed first, video anchor removed a frame later)
never paints the raw anchor text beneath the card image. */
.grid-marquee:not(:has(> .foreground)) > div {
visibility: hidden;
}



.grid-marquee .express-logo {
Expand Down
18 changes: 15 additions & 3 deletions express/code/blocks/grid-marquee/grid-marquee.js
Original file line number Diff line number Diff line change
Expand Up @@ -183,8 +183,20 @@ function toCard(drawer) {
const panelsFrag = new DocumentFragment();
panelsFrag.append(...panels);
panels.forEach((panel) => panel.classList.add('panel'));
const videoAnchor = face.querySelector('a');
videoAnchor?.remove();
// The drawer video is authored in the face as an <a href="*.mp4">. But if
// Express's auto-video decoration ran first (e.g. inside an MEP replacePage
// fragment where #_dnb wasn't applied to the link), it arrives as an inlined
// <video> instead. Capture the source from whichever form is present and
// remove BOTH so the face video can never duplicate the drawer video.
const faceAnchor = face.querySelector('a');
const faceVideo = face.querySelector('video');
const videoSrc = faceAnchor?.href
|| faceVideo?.querySelector('source')?.src
|| faceVideo?.currentSrc
|| faceVideo?.getAttribute('src')
|| faceVideo?.dataset?.videoSource;
faceAnchor?.remove();
faceVideo?.remove();

// Use createTag like hero-marquee does (now available)
const card = createTag('button', {
Expand All @@ -195,7 +207,7 @@ function toCard(drawer) {
}, [face, drawer]);

face.classList.add('face');
const lazyCB = () => decorateDrawer(videoAnchor.href, getPosterSrc(face.querySelector('img')), titleText, panels, panelsFrag, drawer);
const lazyCB = () => decorateDrawer(videoSrc, getPosterSrc(face.querySelector('img')), titleText, panels, panelsFrag, drawer);
addCardInteractions(card, drawer, lazyCB);
drawer.classList.add('drawer', 'hide');
drawer.id = `drawer-${titleText}`;
Expand Down
Loading