Skip to content
This repository was archived by the owner on Dec 9, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
cd17dd0
test-gen blocks
hadobe Nov 13, 2025
0a7fc96
Merge branch 'stage' into test-gen-blocks
hadobe Nov 13, 2025
aecbecc
Merge branch 'stage' into test-gen-blocks
hadobe Nov 13, 2025
11e6614
fix: replace div role=button with proper button element for video acc…
yeibercano Oct 2, 2025
37c0111
enhance: improve video accessibility controls focus and keyboard hand…
yeibercano Oct 2, 2025
4850119
test: add unit tests for video accessibility controls
yeibercano Oct 2, 2025
d4ccc66
fix: remove video tabindex and use direct click handler for accessibi…
yeibercano Nov 14, 2025
fa700b4
test: remove unit tests for createAccessibilityVideoControls
yeibercano Nov 14, 2025
a4ad610
Merge branch 'stage' into test-gen-blocks
hadobe Nov 15, 2025
38c2cec
test: add video controls accessibility tests for MWPW-181684
yeibercano Nov 19, 2025
b6c69dd
test: add skip logic for ax-marquee button test when block missing
yeibercano Nov 19, 2025
d6fd45b
test: add error handling for page load failures in ax-marquee tests
yeibercano Nov 19, 2025
3183867
new blocks:
hadobe Nov 20, 2025
7c1ce38
injection regression test
fullcolorcoder Nov 25, 2025
190f25c
more blocks
hadobe Dec 1, 2025
c20b64d
MWPW-183708: Added photo logo option to marquee block
fullcolorcoder Dec 1, 2025
6c23773
Added svg
fullcolorcoder Dec 1, 2025
b4eefa5
Merge branch 'stage' into test-inject
hadobe Dec 2, 2025
4e6feae
link-list-v2 and pricing-table
hadobe Dec 2, 2025
1ba1b2c
ensures tabbed play / pause button can be toggled via enter
jsandland Dec 2, 2025
11ff160
for testing purpose adding the base query param in the URL (#739)
shairil Dec 3, 2025
4934df1
holding down space bar does not repeatedly toggle play / pause
jsandland Dec 3, 2025
781b7b4
Merge branch 'stage' into test-inject
hadobe Dec 4, 2025
c31291c
Merge pull request #822 from adobecom/test-inject
hadobe Dec 4, 2025
655636d
Merge branch 'stage' into MWPW-181684
hadobe Dec 4, 2025
de89a62
Merge pull request #800 from adobecom/MWPW-181684
hadobe Dec 4, 2025
66b62bf
additional blocks and merge with stage
hadobe Dec 4, 2025
e1d0bd2
Merge branch 'stage' into test-gen-blocks
hadobe Dec 4, 2025
ef2ec70
Merge pull request #808 from adobecom/test-gen-blocks
hadobe Dec 4, 2025
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
34 changes: 21 additions & 13 deletions express/code/blocks/ax-marquee/ax-marquee.js
Original file line number Diff line number Diff line change
Expand Up @@ -341,19 +341,27 @@ const LOGO = 'adobe-express-logo';
const LOGO_WHITE = 'adobe-express-logo-white';
function injectExpressLogo(block, wrapper) {
if (block.classList.contains('entitled')) return;
if (!['on', 'yes'].includes(getMetadata('marquee-inject-logo')?.toLowerCase())) return;
const mediaQuery = window.matchMedia('(min-width: 900px)');
const logo = getIconElementDeprecated(block.classList.contains('dark') && mediaQuery.matches ? LOGO_WHITE : LOGO);
mediaQuery.addEventListener('change', (e) => {
if (!block.classList.contains('dark')) return;
if (e.matches) {
logo.src = logo.src.replace(`${LOGO}.svg`, `${LOGO_WHITE}.svg`);
logo.alt = logo.alt.replace(LOGO, LOGO_WHITE);
} else {
logo.src = logo.src.replace(`${LOGO_WHITE}.svg`, `${LOGO}.svg`);
logo.alt = logo.alt.replace(LOGO_WHITE, LOGO);
}
});
const injectLogo = ['on', 'yes'].includes(getMetadata('marquee-inject-logo')?.toLowerCase());
const injectPhotoLogo = ['on', 'yes'].includes(getMetadata('marquee-inject-photo-logo')?.toLowerCase());
if (!injectLogo && !injectPhotoLogo) return;

let logo;
if (injectPhotoLogo) {
logo = getIconElementDeprecated('adobe-express-photos-logo');
} else {
const mediaQuery = window.matchMedia('(min-width: 900px)');
logo = getIconElementDeprecated(block.classList.contains('dark') && mediaQuery.matches ? LOGO_WHITE : LOGO);
mediaQuery.addEventListener('change', (e) => {
if (!block.classList.contains('dark')) return;
if (e.matches) {
logo.src = logo.src.replace(`${LOGO}.svg`, `${LOGO_WHITE}.svg`);
logo.alt = logo.alt.replace(LOGO, LOGO_WHITE);
} else {
logo.src = logo.src.replace(`${LOGO_WHITE}.svg`, `${LOGO}.svg`);
logo.alt = logo.alt.replace(LOGO_WHITE, LOGO);
}
});
}
logo.classList.add('express-logo');
if (wrapper.firstElementChild?.tagName === 'H2') {
logo.classList.add('eyebrow-margin');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -579,8 +579,9 @@ export default async function decorate(block) {
if (variant === FRICTIONLESS_UPLOAD_QUICK_ACTIONS.removeBackgroundVariant1
|| variant === FRICTIONLESS_UPLOAD_QUICK_ACTIONS.removeBackgroundVariant2) {
const isStage = urlParams.get('hzenv') === 'stage';
const stageURL = urlParams.get('base') ? urlParams.get('base') : 'https://stage.projectx.corp.adobe.com/new';
frictionlessTargetBaseUrl = isStage
? 'https://stage.projectx.corp.adobe.com/new'
? stageURL
: 'https://express.adobe.com/new';
}

Expand Down
2 changes: 1 addition & 1 deletion express/code/blocks/headline/headline.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ export default async function init(el) {
window.lana?.log(e);
}

if (document.querySelector('main > div > div') === el && ['on', 'yes'].includes(getMetadata('marquee-inject-logo')?.toLowerCase())) {
if (document.querySelector('.ax-columns:first-of-type') === el && ['on', 'yes'].includes(getMetadata('marquee-inject-logo')?.toLowerCase())) {
const logo = getIconElementDeprecated('adobe-express-logo');
logo.classList.add('express-logo');
el.prepend(logo);
Expand Down
42 changes: 42 additions & 0 deletions express/code/icons/adobe-express-photos-logo.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
34 changes: 21 additions & 13 deletions express/code/scripts/utils/media.js
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ export function addAnimationToggle(target) {
toggleVideo(target);
}, true);
target.addEventListener('keypress', (e) => {
if (e.repeat) return;
if (e.key !== 'Enter' && e.keyCode !== 32 && e.key !== ' ') {
return;
}
Expand All @@ -80,10 +81,9 @@ export async function createAccessibilityVideoControls(videoElement) {

const federatedRootPath = getFederatedContentRoot() || federatedAccessibilityIconsPath;

const controlsWrapper = createTag('div', {
const controlsWrapper = createTag('button', {
class: 'video-controls-wrapper',
tabIndex: '0',
role: 'button',
type: 'button',
'aria-pressed': 'true',
'aria-label': videoLabels.pauseMotion,
});
Expand All @@ -94,14 +94,6 @@ export async function createAccessibilityVideoControls(videoElement) {
createTag('img', { alt: '', src: `${federatedRootPath}/federal/assets/svgs/accessibility-play.svg`, class: 'accessibility-control icon-play-video isHidden' }),
);

// Add keyboard support
controlsWrapper.addEventListener('keydown', (e) => {
if (e.code === 'Space' || e.code === 'Enter') {
e.preventDefault();
controlsWrapper.click();
}
});

// Update button state when video state changes
videoElement.addEventListener('play', () => {
controlsWrapper.setAttribute('aria-pressed', 'true');
Expand All @@ -116,7 +108,23 @@ export async function createAccessibilityVideoControls(videoElement) {
videoContainer.appendChild(videoElement);
videoContainer.appendChild(controlsWrapper);
videoAnimation.appendChild(videoContainer);
addAnimationToggle(controlsWrapper);

// Add click and keyboard handlers for button element
controlsWrapper.addEventListener('click', (e) => {
// Skip keyboard-triggered clicks (detail === 0) - keydown handler handles those
if (e.detail === 0) return;
toggleVideo(controlsWrapper);
});

// Explicit keyboard handling to ensure Enter/Space work even if parent elements intercept events
controlsWrapper.addEventListener('keydown', (e) => {
if (e.repeat) return;
if (e.key === 'Enter' || e.key === ' ') {
e.preventDefault();
toggleVideo(controlsWrapper);
}
});

return videoElement;
}

Expand Down Expand Up @@ -176,7 +184,7 @@ export function transformLinkToAnimation($a, $videoLooping = true, hasControls =
const $innerDiv = $a.closest('div');
$innerDiv.prepend($video);
$innerDiv.classList.add('hero-animation-overlay');
$video.setAttribute('tabindex', 0);
// Don't make video focusable - accessibility controls button handles interaction
$a.replaceWith($video);

// autoplay animation
Expand Down
8 changes: 6 additions & 2 deletions express/code/styles/styles.css
Original file line number Diff line number Diff line change
Expand Up @@ -1530,12 +1530,16 @@ body:not(.blog) main #hero:not(:has(.hero-bg)) p {
right: 35px;
width: 32px;
height: 32px;
/* Reset button styles */
border: none;
padding: 0;
background: transparent;
cursor: pointer;
border-radius: 50%;
background-color: var(--color-gray-700);
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
transition: background-color 0.3s ease;
z-index: 2;
}
Expand All @@ -1544,7 +1548,7 @@ body:not(.blog) main #hero:not(:has(.hero-bg)) p {
background-color: var(--color-black);
}

.video-controls-wrapper:focus {
.video-controls-wrapper:focus-visible {
outline: 2px solid #1473e6;
outline-offset: 2px;
}
Expand Down
119 changes: 112 additions & 7 deletions nala/assets/urls.txt
Original file line number Diff line number Diff line change
@@ -1,27 +1,132 @@

https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/app-ratings/app-ratings

https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/ax-columns/ax-columns-fullsize
https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/ax-columns/ax-columns-numbered

https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/ax-marquee/ax-marquee-default
https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/ax-marquee/ax-marquee-dark
https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/ax-marquee/ax-marquee-short
https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/ax-marquee/ax-marquee-narrow

https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/ax-marquee-dynamic-hero/ax-marquee-dynamic-hero

https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/ax-table-of-contents/ax-table-of-contents

https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/ax-banner/ax-banner-default
https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/ax-banner/ax-banner-light
https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/ax-banner/ax-banner-standout
https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/ax-banner/ax-banner-cool

https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/banner-bg/banner-bg

https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/blog-posts/blog-posts

https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/blog-posts-v2/blog-post-v2

https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/ax-browse-by-category/ax-browse-by-category-default
https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/ax-browse-by-category/ax-browse-by-category-card
https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/ax-browse-by-category/ax-browse-by-category-fullwidth

https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/ax-cards/cards-dark
https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/ax-cards/card-half-card
https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/ax-cards/ax-cards-default

https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/collapsible-cards/collapsible-card

https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/collapsible-rows/collapsible-rows

https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/content-toggle/content-toggle

https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/content-toggle-v2/content-toggle-v2

https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/cta-cards/cta-cards

https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/ax-cta-carousel/cta-carousel-create
https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/ax-cta-carousel/cta-carousel-quick-action
https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/ax-cta-carousel/cta-carousel-gen-ai
https://main--express-milo--adobecom.aem.page/drafts/nala/test-gen/ax-cta-carousel/cta-carousel-quick-action-gen-ai
https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/ax-cta-carousel/cta-carousel-gen-ai-upload

https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/drawer-cards/drawer-cards
https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/drawer-cards/drawer-cards-logo

https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/embed/embed

https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/faq/faq

https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/ax-feature-grid/4-cards

https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/ax-feature-list/feature-list

https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/ax-floating-buttons/floating-buttons

https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/floating-panel/floating-panel

https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/ax-fullscreen-marquee/fullscreen-marquee-image
https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/ax-fullscreen-marquee/fullscreen-marquee-video


https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/ax-gen-ai-cards/gen-ai-cards

https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/ax-pricing-cards/pricing-cards-1-col
https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/ax-pricing-cards/pricing-cards-2-col
https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/ax-pricing-cards/pricing-cards-3-col
https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/highlight/highlight

https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/holiday-blade/holiday-blade
https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/holiday-blade/holiday-blade-still
https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/holiday-blade/holiday-blade-premium
https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/holiday-blade/holiday-blade-light
https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/holiday-blade/holiday-blade-free
https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/holiday-blade/holiday-blade-animated

https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/hover-cards/hover-cards

https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/ax-how-to-cards/how-to-cards
https://main--express-milo--adobecom.aem.page/drafts/nala/test-gen/ax-how-to-cards/how-to-cards-schema
https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/ax-how-to-cards/how-to-cards-center

https://main--express-milo--adobecom.aem.live/drafts/nala/blocks/how-to-steps-carousel/how-to-steps-carousel-image-schema

https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/how-to-v3/how-to-v3

https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/interactive-marquee/interactive-marquee
https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/interactive-marquee/interactive-marquee-square
https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/interactive-marquee/interactive-marquee-quad-dark
https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/interactive-marquee/interactive-marquee-quad-dark-no-search
https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/interactive-marquee/interactive-marquee-tall-dark
https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/interactive-marquee/interactive-marquee-wide-dark

https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/link-blade/link-blade

https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/link-list/link-list
https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/link-list/link-list-shaded
https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/link-list/link-list-noarrows
https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/link-list/link-list-leftalign
https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/link-list/link-list-large-shaded-centered
https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/link-list/link-list-large
https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/link-list/link-list-center


https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/list/list

https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/pricing-cards/pricing-cards
https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/pricing-cards/pricing-cards-1-col
https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/pricing-cards/pricing-cards-2-col
https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/pricing-cards/pricing-cards-3-col

https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/ax-ratings/ratings

https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/ax-ribbon-banner/ribbon-banner

https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/steps/steps
https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/steps/steps-dark
https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/steps/steps-highlight
https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/steps/steps-schema

https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/sticky-promo-bar/sticky-promo-bar
https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/sticky-promo-bar/sticky-promo-bar-rounded
https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/sticky-promo-bar/sticky-promo-bar-rounded-loadinbody

https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/submit-email/submit-email

https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/susi-light/susi-light
https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/susi-light/susi-light-tabs

https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/ax-cards/cards-dark
https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/ax-cards/card-half-card
https://main--express-milo--adobecom.aem.live/drafts/nala/test-gen/ax-cards/ax-cards-default
61 changes: 61 additions & 0 deletions nala/blocks/app-ratings/app-ratings.block.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
{
"block": "app-ratings",
"variants": [
{
"tcid": "0",
"name": "@app-ratings-default",
"selector": "div.app-ratings",
"path": "/drafts/nala/test-gen/app-ratings/app-ratings",
"data": {
"semantic": {
"texts": [],
"media": [
{
"selector": "img.icon.icon-apple-store",
"nth": 0,
"tag": "img",
"src": "/express/code/icons/apple-store.svg",
"alt": "apple-store"
},
{
"selector": "img.icon.icon-google-store",
"nth": 0,
"tag": "img",
"src": "/express/code/icons/google-store.svg",
"alt": "google-store"
}
],
"interactives": [
{
"type": "link",
"selector": "a",
"nth": 0,
"text": "",
"href": "/GJrBPFUWBBb?url=%2Fdrafts%2Fnala%2Ftest-gen%2Fapp-ratings%2Fapp-ratings&placement=outside-blocks&locale=en-US&contentRegion=us",
"ariaLabel": "Download on the app store",
"rel": "nofollow",
"title": null,
"target": "_self"
},
{
"type": "link",
"selector": "a",
"nth": 1,
"text": "",
"href": "/GJrBPFUWBBb?url=%2Fdrafts%2Fnala%2Ftest-gen%2Fapp-ratings%2Fapp-ratings&placement=outside-blocks&locale=en-US&contentRegion=us",
"ariaLabel": "Get it on Google Play",
"rel": "nofollow",
"title": null,
"target": "_self"
}
]
}
},
"tags": [
"@app-ratings",
"@default",
"@express"
]
}
]
}
7 changes: 7 additions & 0 deletions nala/blocks/app-ratings/app-ratings.page.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
class AppRatingsBlock {
constructor(page, selector = '.app-ratings', nth = 0) {
this.page = page;
this.block = page.locator(selector).nth(nth);
}
}
module.exports = AppRatingsBlock;
3 changes: 3 additions & 0 deletions nala/blocks/app-ratings/app-ratings.spec.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
const schema = require('./app-ratings.block.json');

module.exports = { features: schema.variants };
Loading
Loading