From 8417da39792c370e49a4af464de5b5c1969458bb Mon Sep 17 00:00:00 2001 From: Jan Ivan Viloria <158211769+ivanvatadobe@users.noreply.github.com> Date: Thu, 16 May 2024 07:55:23 -0400 Subject: [PATCH 1/3] OPT-26580 DC0994_US | Frictionless | Add sticky banner Upload CTA (#2298) * 05-13-24 ivan dc0944 first * Update libs/mep/dc0944/aside/aside.js Co-authored-by: Vivian A Goodrich <101133187+vgoodric@users.noreply.github.com> * 05-13-24 ivan dc0944 add css changes and js optimization * Update libs/mep/dc0944/aside/aside.js Co-authored-by: Robert Bogos <146744221+robert-bogos@users.noreply.github.com> * Update libs/mep/dc0944/aside/aside.js Co-authored-by: Robert Bogos <146744221+robert-bogos@users.noreply.github.com> * Update libs/mep/dc0944/aside/aside.js Co-authored-by: Robert Bogos <146744221+robert-bogos@users.noreply.github.com> * Update libs/mep/dc0944/aside/aside.js Co-authored-by: Robert Bogos <146744221+robert-bogos@users.noreply.github.com> * Update libs/mep/dc0944/aside/aside.js Co-authored-by: Robert Bogos <146744221+robert-bogos@users.noreply.github.com> * 05-14-24 ivan renamed mep test folder dc0994 * 05-14-24 ivan fix sticky banner close btn --------- Co-authored-by: Vivian A Goodrich <101133187+vgoodric@users.noreply.github.com> Co-authored-by: Robert Bogos <146744221+robert-bogos@users.noreply.github.com> Co-authored-by: markpadbe --- libs/mep/dc0994/aside/aside.css | 1204 +++++++++++++++++++++++++++++++ libs/mep/dc0994/aside/aside.js | 236 ++++++ 2 files changed, 1440 insertions(+) create mode 100644 libs/mep/dc0994/aside/aside.css create mode 100644 libs/mep/dc0994/aside/aside.js diff --git a/libs/mep/dc0994/aside/aside.css b/libs/mep/dc0994/aside/aside.css new file mode 100644 index 00000000000..e8f2d3c2cb7 --- /dev/null +++ b/libs/mep/dc0994/aside/aside.css @@ -0,0 +1,1204 @@ +.aside { + display: flex; + width: 100%; + position: relative; + align-items: center; + justify-content: center; + overflow: hidden; +} + +.dark .aside, +.aside.dark { + color: var(--color-white); +} + +.aside p { + margin: 0; +} + +.aside.split picture { + display: flex; +} + +.aside .split-image img, +.aside .split-image video { + object-fit: cover; + min-height: 700px; + width: 100%; + height: 100%; +} + +.aside.notification .background img { + min-height: unset; +} + +.aside .foreground.container { + display: flex; + position: relative; + align-items: center; + justify-content: center; + flex-direction: column; + gap: var(--spacing-l); +} + +.aside:not(.notification):not(.inline) .foreground > :first-child { + padding: var(--spacing-xxxl) 0 0; +} + +.aside:not(.notification):not(.inline) .foreground > :last-child { + margin-bottom: var(--spacing-xxxl); +} + +.aside .foreground.container .text { + display: flex; + flex-wrap: wrap; +} + +.aside.split .foreground.container .text { + margin: 0; + max-width: var(--grid-container-width); + padding: var(--spacing-xxxl) 0 var(--spacing-l) 0; +} + +.aside.simple .foreground.container .text { + margin-bottom: 80px; +} + +.aside.notification .foreground.container .text { + max-width: none; + padding-top: 0; + padding-bottom: 0; +} + +.aside .foreground.container .image { + position: relative; + display: flex; +} + +.aside .foreground.container > div { + flex-grow: 1; + flex-basis: 0; + min-width: 0; +} + +.aside.notification .foreground.container > div { + flex-basis: 100%; +} + +.aside.inline .foreground.container .image, +.aside.inline .foreground.container .text { + padding: 0; +} + +.aside.split.large .foreground.container .text { + padding: var(--spacing-l) 0 var(--spacing-xxxl) 0; +} + +.aside.split .icon-stack-area li, +.aside.split .icon-stack-area li a { + display: flex; + align-items: center; + gap: 12px; + font-weight: bold; +} + +.aside.notification .foreground.container .text a { + white-space: nowrap; +} + +.aside:not(.notification) .foreground.container .text > * { + width: 100%; +} + +.aside .foreground.container .text .heading-xl { + margin: 0 0 var(--spacing-xs); +} + +.aside .foreground.container .text .body-m, +.aside .foreground.container .text .body-s { + margin-bottom: var(--spacing-s); +} + +.aside .foreground.container .text .supplemental-text { + padding-top: var(--spacing-s); + margin-bottom: 0; +} + +.aside.promobar .promo-text .action-area { + flex-wrap: nowrap; + gap: var(--spacing-xs); +} + +.aside.promobar .promo-text .action-area, +.aside .foreground.container .text .action-area { + margin-bottom: 0; + display: flex; + gap: var(--spacing-s); + flex-wrap: wrap; + align-items: center; +} + +.aside.notification .icon-area { + display: flex; + align-items: center; +} + +.aside .foreground.container .icon-area { + height: 56px; + max-width: 234px; + margin-bottom: var(--spacing-s); +} + +.aside .foreground.container a.icon-area { + height: auto; + margin-bottom: 0; +} + +.aside.split .split-image img, +.aside.split .split-image video { + position: relative; + min-height: 270px; +} + +.aside.split .split-image video { + display: block; +} + +.aside.split .mobile-square img, +.aside.split .mobile-square video { + aspect-ratio: var(--aspect-ratio-square); +} + +.aside.split .mobile-wide img, +.aside.split .mobile-wide video { + aspect-ratio: var(--aspect-ratio-wide); +} + +.aside.split .mobile-standard img, +.aside.split .mobile-standard video { + aspect-ratio: var(--aspect-ratio-standard); +} + +.aside.split .format img, +.aside.split .format video { + height: auto; +} + +.aside.split .icon-stack-area li img { + width: var(--icon-size-m); + height: auto; +} + +.aside.split .format picture, +.aside.split .format video { + display: flex; + height: 100%; + align-items: center; +} + +.aside .foreground.container .icon-area img { + max-width: 234px; + height: var(--icon-size-l); + width: auto; + object-fit: cover; + object-position: left top; +} + +.aside.simple .foreground.container .image { + display: none; +} + +.aside.split { + flex-direction: column; +} + +.aside.split.large { + flex-direction: column-reverse; +} + +.aside.split .foreground.container { + width: 100%; + max-width: 100%; + flex-direction: column; + z-index: 1; +} + +.aside.split .background { + position: relative; +} + +.aside.split.large .background { + background-color: transparent; +} + +.aside.split .foreground.container .image { + margin: 0; + display: none; +} + +.aside.split .icon-stack-area li picture { + flex-shrink: 0; +} + +.aside.notification .text [class^="heading-"] + .action-area { + margin-top: var(--spacing-xs); +} + +.aside.notification .foreground.container img { + display: block; +} + +.aside .foreground.container .image video, +.aside .foreground.container .image picture, +.aside .foreground.container .image picture img { + width: 100%; + display: flex; +} + +.aside.split .foreground.container .split-image img, +.aside.split .foreground.container .split-image video { + object-fit: cover; + height: 270px; +} + +.aside.inline { + border-radius: 10px; +} + +.aside.inline .foreground.container { + width: 100%; + min-height: 0; + margin: var(--spacing-m); + padding: 0; + gap: var(--spacing-m); +} + +.aside.inline .foreground.container .image { + margin-top: 0; +} + +.aside.inline .heading-s { + margin-bottom: var(--spacing-s); +} + +.aside.notification { + min-height: 0; +} + +.aside.notification .foreground.container { + padding-top: var(--spacing-s); + padding-bottom: var(--spacing-s); + box-sizing: border-box; + justify-content: flex-start; +} + +.aside.notification .foreground.container .image { + max-width: 75px; + margin: 0; + order: -1; +} + +.aside.notification .foreground.container .text a:not(.con-button) { + width: auto; + font-weight: normal; +} + +.aside.notification .foreground.container .text .action-area > a { + margin-right: 0; +} + +.aside.promobar .foreground.container { + min-height: 0; + display: flex; + flex-direction: column; + padding: 0; + margin: 0; +} + +.aside.promobar .foreground.container .icon-area { + margin-bottom: 0; + height: var(--icon-size-m); +} + +.aside.promobar .foreground.container .icon-area img { + height: var(--icon-size-m); +} + +.aside.notification.extra-small .foreground.container a:last-child { + font-weight: bold; +} + +.aside.notification.extra-small .foreground.container a:not(.con-button):last-of-type { + margin-left: var(--spacing-xs); + color: var(--link-color); +} + +.static-links .aside.notification.extra-small .foreground.container a:not(.con-button):last-of-type { + color: inherit; +} + +.aside.notification.small .foreground.container .text a.con-button { + display: table; + margin-left: 0; +} + +.aside.notification .foreground.container .text .heading-l { + margin-bottom: var(--spacing-xxs); +} + +.aside.notification .foreground.container:not(.no-image) .text .body-s.action-area, +.aside.notification .foreground.container:not(.no-image) .text .body-m.action-area { + margin-bottom: 0; +} + +.aside.notification .foreground.container .icon-area { + height: auto; + max-width: none; + margin-bottom: var(--spacing-xs); +} + +.aside.notification .foreground.container .icon-area img { + max-height: 40px; + height: auto; +} + +.aside.notification.extra-small .foreground.container { + min-height: 50px; + padding-top: var(--spacing-xs); + padding-bottom: var(--spacing-xs); +} + +.aside.notification.extra-small .foreground.container .text { + display: block; +} + +.aside.notification.medium .foreground.container .text, +.aside.notification.large .foreground.container .text { + flex-direction: column; +} + +.aside.notification.small .foreground.container .text { + flex-direction: column; + max-width: 1000px; +} + +.aside.center:not(.notification) .foreground.container .text { + margin: 80px 0; + text-align: center; + padding: 0; +} + +.aside.notification.center.small .foreground.container .text { + text-align: left; +} + +.aside.notification.center.small .foreground.container .text, +.aside.notification.center.extra-small .foreground.container .text { + margin: 0 auto; +} + +.aside.notification.small { + min-height: 88px; +} + +.aside.notification.medium { + min-height: 160px; +} + +.aside.notification.large { + min-height: 250px; +} + +.aside.notification.medium .foreground.container { + max-width: 800px; + gap: var(--spacing-xs); +} + +.aside.notification.medium .foreground.container .text .heading-s { + margin-bottom: var(--spacing-xxs); +} + +.aside.notification.center.small .foreground.container .text p { + text-align: initial; +} + +.aside.notification.large .foreground.container { + max-width: 1000px; + gap: var(--spacing-xs); +} + +.aside.notification .foreground.container [data-align=center], +.aside.notification.center .foreground.container, +.aside.notification.center .foreground.container > * { + text-align: center; + justify-content: center; +} + +.aside.promobar.popup .foreground.container { + width: 100%; + padding: 0; +} + +.aside.center:not(.notification) .foreground.container { + padding: 0; +} + +.aside.notification.large.center .foreground.container, +.aside.notification.large .foreground.container.no-image { + max-width: 800px; +} + +.aside.promobar.popup .promo-text .action-area { + justify-content: flex-end; + padding: 0 var(--spacing-xxs) var(--spacing-xxs) 0; + gap: var(--spacing-xxs); +} + +.aside.notification.center .foreground.container .action-area { + justify-content: center; +} + +.aside.notification.center.small .foreground.container .text, +.aside.notification.center.small .foreground.container .text > * { + justify-content: flex-start; +} + +.aside.split .icon-stack-area { + display: flex; + flex-flow: row wrap; + flex-direction: column; + gap: 12px; + margin: -8px 0 var(--spacing-s); + width: 100%; + padding: 0; + list-style-type: none; +} + +.aside.promobar.popup .promo-text .icon-area, +.aside.promobar.popup .promo-text .icon-area img { + display: flex; + gap: var(--spacing-xxs); + align-items: center; + height: var(--icon-size-xs); +} + +.aside.center:not(.notification) .foreground.container .icon-area { + max-width: 100%; +} + +.aside.center:not(.notification) .foreground.container .text .action-area { + justify-content: center; +} + +.aside:not(.notification) .foreground.container .text .detail-m { + margin-bottom: var(--spacing-xs); +} + +.aside.split .image.format { + display: flex; +} + +.aside.split.bio .foreground.container .text .icon-area { + display: none; +} + +.aside.center:not(.notification) .foreground.container .text .icon-area { + height: var(--icon-size-xxl); +} + +.aside.center:not(.notification) .foreground.container .text .icon-area img { + height: var(--icon-size-xxl); + max-width: 300px; + width: auto; +} + +.aside.promobar .foreground.container > :first-child { + padding: var(--spacing-xs) 0; +} + +.aside.promobar .promo-text[data-align="center"] { + justify-content: center; +} + +.aside.promobar .action-area .con-button { + flex-shrink: 0; +} + +.aside.promobar .promo-text.desktop-up, +.aside.promobar .promo-text.tablet-up { + display: none; +} + +.aside.promobar .promo-text.mobile-up { + display: flex; +} + +.aside.promobar .promo-text { + display: flex; + flex-flow: row nowrap; + gap: var(--spacing-xs); + justify-content: space-between; + width: 100%; + padding: var(--spacing-xs) 0; +} + +.aside.promobar .promo-text .content-area { + display: flex; + flex-flow: row nowrap; + gap: var(--spacing-xs); + align-items: center; +} + +.aside.promobar.popup { + border-radius: var(--spacing-xs); + width: var(--grid-container-width); + margin: auto; + box-shadow: 0 3px 6px #707070; +} + +.aside.promobar.popup .foreground.container .promo-text { + flex-direction: column; + padding: 0; +} + +.aside.promobar.popup .promo-text .content-area { + padding: var(--spacing-xs) var(--spacing-xs) 0 var(--spacing-xs); + flex-direction: column; + align-items: flex-start; + gap: var(--spacing-xxs); +} + +.aside.promobar.popup .promo-text .text-area { + margin-top: var(--spacing-m); +} + +.aside.promobar.popup .promo-text .icon-area+.text-area { + margin-top: 0; +} + +.aside.promobar.popup .promo-text .content-area .text-area { + display: flex; + flex-direction: column; + gap: var(--spacing-xxs); +} + +.aside.promobar.popup .mobile-up.promo-text .detail-xs+.text-area { + gap: var(--spacing-xs); +} + +.aside.promobar.popup .promo-close { + position: absolute; + right: var(--spacing-xxs); + top: var(--spacing-xxs); + height: 20px; + width: 20px; + border: none; + background: none; + cursor: pointer; +} + +.aside.promobar.popup .promo-close svg { + position: absolute; + top: 0; + left: 0; +} + +.aside.promobar.popup .promo-close circle { + fill: var(--color-black); +} + +.aside.promobar.popup .promo-close line { + stroke: var(--color-white); +} + +@media screen and (max-width: 600px) { + .aside.no-media:not(.notification) .foreground.container { + gap: 0; + } + + .aside.split.no-media:not(.notification) .foreground.container .text { + padding: var(--spacing-xxxl) 0; + } + + .aside.promobar.popup .mobile-up.hide-block ~ .promo-close { + display: none; + } +} + +@media screen and (min-width: 600px) { + .aside.small { + min-height: 420px; + } + + .aside.medium { + min-height: 560px; + } + + .aside.large { + min-height: 700px; + } + + .aside .foreground.container { + align-items: center; + flex-direction: row; + margin: 0 auto; + padding: var(--spacing-m) 0; + gap: var(--spacing-xl); + } + + .aside:not(.notification):not(.inline) .foreground.container > :first-child { + padding: 0; + } + + .aside:not(.notification):not(.inline):not(.center) .foreground.container > :last-child { + margin-bottom: 0; + } + + .aside .foreground.container .image { + margin: 0; + } + + .aside .foreground.container .text.image { + justify-content: flex-start; + } + + .aside .background, + .aside.split .split-image { + overflow: hidden; + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; + } + + .aside .foreground.container .text { + margin-bottom: 0; + padding-right: var(--spacing-s); + } + + .aside.split-right .foreground.container .text { + padding-left: var(--spacing-s); + } + + .aside.simple .foreground.container .text { + margin-bottom: 0; + max-width: 318px; + padding-right: 0; + } + + .aside.split .split-image { + overflow: hidden; + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; + } + + .aside.split .tablet-wide img, + .aside.split .tablet-wide video { + aspect-ratio: var(--aspect-ratio-wide); + } + + .aside.split .tablet-standard img, + .aside.split .tablet-standard video { + aspect-ratio: var(--aspect-ratio-standard); + } + + .aside.split-right .split-image img, + .aside.split-right .split-image video { + left: 0; + } + + .aside.split.large { + flex-direction: column; + } + + .aside .split-image .modal-img-link, + .aside.split .split-image img, + .aside.split .split-image video { + width: 60.5vw; + max-width: 56%; + position: absolute; + right: 0; + object-fit: cover; + object-position: center top; + } + + .aside .split-image .modal-img-link, + .aside.split.half .split-image img, + .aside.split.half .split-image video { + width: 50vw; + max-width: 1396px; + object-position: left top; + } + + .aside.split.split-left .split-image img, + .aside.split.split-left .split-image video { + right: 0; + left: auto; + } + + .aside.split.split-right .split-image img, + .aside.split.split-right .split-image video { + left: 0; + right: auto; + } + + [dir="rtl"] .aside.split.split-right .split-image img, + [dir="rtl"] .aside.split.split-right .split-image video { + right: 0; + left: auto; + } + + [dir="rtl"] .aside.split.split-left .split-image img, + [dir="rtl"] .aside.split.split-left .split-image video { + left: 0; + right: auto; + } + + .aside.split .foreground.container { + flex-direction: row; + justify-content: stretch; + max-width: var(--grid-container-width); + margin: 0 auto; + background-color: transparent; + } + + .aside.split .foreground.container .text { + flex: 0 0 31vw; + padding: var(--spacing-xxl) 0; + max-width: 100%; + margin: 0; + } + + .aside.split .foreground.container .image { + object-fit: cover; + flex: 0 0 61%; + display: block; + padding: 0; + } + + .aside.inline .foreground.container .text { + flex: 0 0 calc(60% - var(--spacing-s)); + max-width: none; + } + + .aside.notification .foreground.container .text { + padding-right: 0; + } + + .aside.notification.small .foreground.container .text { + flex-flow: row nowrap; + align-items: center; + flex-grow: 1; + } + + .aside.notification.small .foreground.container .text .body-m { + margin: 0; + } + + .aside.notification.small .foreground.container .text .body-m.action-area { + margin-left: 24px; + } + + [dir = "rtl"] .aside.notification.small .foreground.container .text .body-m.action-area { + margin-left: 0; + margin-right: 24px; + } + + .aside.split.half .foreground.container .text { + flex: 0 0 41.72%; + } + + .aside.split-right .foreground.container { + flex-direction: row-reverse; + } + + .aside.inline .foreground.container .image { + flex: 0 0 calc(40% - var(--spacing-s)); + margin-bottom: 0; + } + + .aside.notification .foreground.container { + flex-direction: row; + } + + .aside.notification.medium .foreground.container, + .aside.notification.large .foreground.container { + gap: var(--spacing-s); + } + + .aside.notification .foreground.container .image { + width: 30%; + max-width: 188px; + margin: 0; + padding: 0; + order: unset; + } + + .aside.notification .foreground.container .text+.image { + margin-right: 0; + } + + .aside.notification .foreground.container .icon-area { + width: auto; + margin-right: var(--spacing-xs); + margin-bottom: 0; + } + + [dir = "rtl"] .aside.notification .foreground.container .icon-area { + margin-left: var(--spacing-xs); + margin-right: 0; + } + + .aside.notification.extra-small .foreground.container.no-image .text { + display: flex; + } + + .aside.notification.extra-small .foreground.container.no-image .text a { + margin-left: 5px; + } + + .aside.promobar.popup .promo-text .action-area { + justify-content: center; + padding: 0 0 var(--spacing-xxs); + } + + .aside.notification.small .foreground.container .text .action-area { + width: auto; + margin-top: 0; + } + + .aside.split.bio .foreground.container .text .icon-area { + display: block; + } + + .aside.notification.small .foreground.container .text .icon-area { + height: 40px; + } + + .aside.center:not(.notification) .foreground.container .text .icon-area img { + max-width: 234px; + } + + .aside.medium.split.bio .foreground.container .text .icon-area, + .aside.large.split.bio .foreground.container .text .icon-area { + height: var(--icon-size-xxl); + margin-bottom: var(--spacing-xs); + } + + .aside.medium.split.bio .foreground.container .text .icon-area img, + .aside.large.split.bio .foreground.container .text .icon-area img { + width: var(--icon-size-xxl); + height: var(--icon-size-xxl); + border-radius: 50%; + } + + .aside.promobar .promo-text .content-area .text-area { + display: flex; + flex-flow: column nowrap; + gap: var(--spacing-xxs); + } + + .aside.promobar .promo-text.mobile-up, + .aside.promobar .promo-text.desktop-up { + display: none; + } + + .aside.promobar .promo-text.tablet-up { + display: flex; + } + + .aside.promobar.popup .promo-text { + gap: var(--spacing-s); + } + + .aside.promobar.popup .promo-text .content-area { + padding: var(--spacing-xxs) 0 0; + align-items: center; + text-align: center; + } +} + +@media (min-width: 600px) and (max-width: 1200px) { + .aside.promobar.popup .tablet-up.hide-block ~ .promo-close { + display: none; + } +} + +@media screen and (min-width: 1200px) { + .aside .foreground.container { + min-height: 420px; + width: var(--grid-container-width); + } + + .aside .foreground.container > div { + object-fit: cover; + padding-left: 0; + } + + .aside .foreground.container .text { + padding: var(--spacing-xxl) 0; + } + + .aside .foreground.container .icon-area { + max-width: 400px; + } + + .aside .foreground.container .text .heading-xl { + margin: 0 0 var(--spacing-xs); + } + + .aside.inline .foreground.container .text { + flex: 0 0 calc(64% - var(--spacing-s)); + } + + .aside.simple .foreground.container .text { + margin-bottom: 0; + max-width: 500px; + } + + .aside.split .foreground.container .text { + flex: 0 0 300px; + } + + .aside.split .foreground.container .image { + flex: 0 0 70%; + max-width: none; + object-fit: cover; + } + + .aside.split .split-image img, + .aside.split .split-image video { + max-width: 1396px; + } + + .aside.split .desktop-wide img, + .aside.split .desktop-wide video { + aspect-ratio: var(--aspect-ratio-wide); + } + + .aside.split .desktop-standard img, + .aside.split .desktop-standard video { + aspect-ratio: var(--aspect-ratio-standard); + } + + .aside.split.half .foreground.container .text { + max-width: 500px; + } + + .aside.inline { + max-width: 800px; + margin-right: auto; + margin-left: auto; + } + + .aside.inline .foreground.container .image { + flex: 0 0 calc(36% - var(--spacing-s)); + } + + .aside.split.icon-stack .foreground.container .text, + .aside.split.bio .foreground.container .text { + padding: var(--spacing-xxl) 0; + } + + .aside.split .icon-stack-area li { + max-width: calc(50% - 6px); + min-width: calc(50% - 6px); + } + + .aside.split .icon-stack-area { + flex-direction: row; + } + + .aside.promobar .foreground.container .icon-area, + .aside.promobar .foreground.container .icon-area img { + height: var(--icon-size-xxl); + } + + .aside.promobar.popup .promo-text .icon-area, + .aside.promobar.popup .promo-text .icon-area img { + height: var(--icon-size-m); + } + + .aside.center:not(.notification) .foreground.container .text .icon-area img { + max-width: 400px; + } + + .aside.center:not(.notification) .foreground.container .text { + max-width: 50%; + } + + .aside.notification .foreground.container { + min-height: 0; + } + + .aside.notification.extra-small .foreground.container { + padding-top: var(--spacing-xxs); + padding-bottom: var(--spacing-xxs); + } + + .aside.notification.medium .foreground.container { + gap: var(--spacing-m); + } + + .aside.notification.large .foreground.container { + gap: var(--spacing-l); + } + + .aside.notification .foreground.container .image { + width: 20%; + } + + .aside.notification .foreground.container .text+.image { + margin-right: 0; + } + + .aside.notification.small .foreground.container .text { + align-items: center; + justify-content: flex-start; + } + + .aside.notification.center.small .foreground.container .text, + .aside.notification.center.small .foreground.container .text > * { + justify-content: center; + } + + .aside.notification.center.small .foreground.container .text p { + text-align: center; + } + + .aside.notification.medium .foreground.container .image { + max-width: 168px; + } + + .aside.notification.large .foreground.container .image { + max-width: 304px; + } + + .aside.notification.medium .foreground.container .text+.image { + margin-right: 0; + } + + .aside.promobar .promo-text .content-area { + gap: var(--spacing-m); + } + + .aside.promobar .promo-text .content-area .text-area { + gap: var(--spacing-xs); + } + + .aside.promobar .promo-text .action-area { + gap: var(--spacing-s); + } + + .aside.promobar .promo-text.mobile-up, + .aside.promobar .promo-text.tablet-up { + display: none; + } + + .aside.promobar .promo-text.desktop-up { + display: flex; + gap: var(--spacing-m); + } + + .aside.promobar.popup { + border-radius: var(--spacing-xl); + width: 85%; + max-width: 1600px; + } + + .aside.promobar.popup .foreground.container .promo-text { + padding: var(--spacing-xs) 0; + flex-direction: row; + gap: var(--spacing-l); + justify-content: center; + max-width: 83.4%; + } + + .aside.promobar.popup .promo-text .content-area, + .aside.promobar.popup .promo-text .action-area { + flex-direction: row; + padding: 0; + gap: var(--spacing-xs); + min-height: 40px; + } + + .aside.promobar.popup .promo-close { + right: var(--spacing-s); + top: calc(50% - 10px); + } + + .aside.promobar.popup .desktop-up.hide-block ~ .promo-close { + display: none; + } + + .aside.promobar.popup .promo-text .text-area { + margin-top: 0; + } +} + +/* Added for frictionless dc0944 */ +.section.hide-on-step-start:not(.hide-sticky-section):not(.close-sticky-section) { + background: none !important; + display: flex; + justify-content: center; + padding: 0 7% 20px; +} + +.aside.frictionless { + background-color: rgb(0, 11, 29); + max-width: 1200px; + border-radius: 50px; + display: flex; + justify-content: center; + align-items: center; + position: relative; +} + +.aside.frictionless .foreground.container { + position: relative; + flex-direction: row; +} + +.aside.frictionless .promo-close { + background: rgb(0, 11, 29); + margin: 0; + width: 20px; + height: 20px +} + +.aside.frictionless .promo-text { + justify-content: center; +} + +.aside.frictionless .promo-text .text-area { + display: flex; + flex-direction: row !important; +} + +.aside.frictionless .promo-text .icon-area { + height: auto !important; +} + +.aside.frictionless .promo-text .icon-area img { + height: 38px !important; +} + +body.dc-bc[data-current-event="start"] .section.hide-on-step-start { + display: none; + background-color: none; +} + +@media screen and (min-width: 1440px) { + .aside.frictionless .promo-close { + position: absolute; + right: 40px; + } +} + +.sticky-banner-disable { + display: none !important; +} diff --git a/libs/mep/dc0994/aside/aside.js b/libs/mep/dc0994/aside/aside.js new file mode 100644 index 00000000000..2283e0e1d93 --- /dev/null +++ b/libs/mep/dc0994/aside/aside.js @@ -0,0 +1,236 @@ +/* + * Copyright 2022 Adobe. All rights reserved. + * This file is licensed to you under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS + * OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ + +/* +* Aside - v5.1 +*/ + +import { decorateBlockText, decorateIconStack, applyHoverPlay, decorateBlockBg } from '../../../utils/decorate.js'; +import { createTag } from '../../../utils/utils.js'; + +// standard/default aside uses same text sizes as the split +const variants = ['split', 'inline', 'notification']; +const sizes = ['extra-small', 'small', 'medium', 'large']; +const [split, inline, notification] = variants; +const [xsmall, small, medium, large] = sizes; +const blockConfig = { + [split]: ['xl', 's', 'm'], + [inline]: ['s', 'm'], + [notification]: { + [xsmall]: ['m', 'm'], + [small]: ['m', 'm'], + [medium]: ['s', 's'], + [large]: ['l', 'm'], + }, +}; +const FORMAT_REGEX = /^format:/i; +const closeSvg = ` + + + + + + `; + +const linkSectionToModuleStep = (el) => el.closest('.section').classList.add('hide-on-step-start'); + +function editCtaToModuleClick(el) { + el.querySelectorAll('a').forEach((cta) => { + if (cta.href.toLowerCase().includes('#module')) { + cta.addEventListener('click', (e) => { + e.preventDefault(); + window.scrollTo(0, 0); + document.querySelector('.CTAButtons')?.click(); + }); + } + }); +} + +function getBlockData(el) { + const variant = variants.find((variantClass) => el.classList.contains(variantClass)); + const size = sizes.find((sizeClass) => el.classList.contains(sizeClass)); + const blockData = variant ? blockConfig[variant] : blockConfig[Object.keys(blockConfig)[0]]; + return variant && size && !Array.isArray(blockData) ? blockData[size] : blockData; +} + +function decorateStaticLinks(el) { + if (!el.classList.contains('notification')) return; + el.querySelectorAll('a:not([class])').forEach((link) => { link.classList.add('static'); }); +} + +function decorateMedia(el) { + if (!(el.classList.contains('medium') || el.classList.contains('large'))) return; + const allMedia = el.querySelectorAll('div > p video, div > p picture'); + [...allMedia].some((media) => { + const parentP = media.closest('p'); + const siblingP = parentP?.nextElementSibling; + if (!siblingP || siblingP.nodeName !== 'P') return false; + const siblingText = siblingP.textContent; + if (!FORMAT_REGEX.test(siblingText)) return false; + const formats = siblingText.split(': ')[1]?.split(/\s+/); + if (formats) { + const formatClasses = []; + formatClasses.push('format'); + if (formats.length === 3) formatClasses.push(`desktop-${formats[2]}`); + if (formats.length >= 2) formatClasses.push(`tablet-${formats[1]}`); + formatClasses.push(`mobile-${formats[0]}`); + media.closest('div').classList.add(...formatClasses); + } + siblingP.remove(); + media.closest('div').insertBefore(media, parentP); + parentP.remove(); + return true; + }); +} + +function formatPromoButton(el) { + if (!el.classList.contains('promobar')) return; + el.querySelectorAll('.action-area').forEach((aa) => { + aa.querySelectorAll('.con-button').forEach((btn) => { + btn.classList.add('button-l'); + if (!el.classList.contains('popup')) return; + if (!btn.classList.contains('outline')) btn.classList.add('fill'); + }); + }); +} + +function addCloseButton(el) { + const closeBtn = createTag('button', { class: 'promo-close', 'aria-label': 'Close' }, closeSvg); + el.querySelector('.foreground').appendChild(closeBtn); + closeBtn.addEventListener('click', (e) => { + e.target.closest('.section').classList.add('close-sticky-section'); + }); +} + +function addPromobar(sourceEl, parent) { + parent.appendChild(sourceEl.cloneNode(true)); +} + +function checkViewportPromobar(foreground) { + const { children, childElementCount: childCount } = foreground; + if (childCount < 2) addPromobar(children[childCount - 1], foreground); + if (childCount < 3) addPromobar(children[childCount - 1], foreground); +} + +function combineTextBocks(textBlocks, iconArea, viewPort, variant) { + const promobarConfig = { + default: { + 'mobile-up': ['s', 's'], + 'tablet-up': ['s', 's'], + 'desktop-up': ['m', 'l'], + }, + popup: { + 'mobile-up': ['s', 's'], + 'tablet-up': ['l', 'm'], + 'desktop-up': ['xxl', 'xl'], + }, + }; + const textStyle = promobarConfig[variant][viewPort]; + const contentArea = createTag('p', { class: 'content-area' }); + const textArea = createTag('p', { class: 'text-area' }); + textBlocks[0].parentElement.prepend(contentArea); + textBlocks.forEach((textBlock) => { + textArea.appendChild(textBlock); + if (textBlock.nodeName === 'P') { + textBlock.classList.add(`body-${textStyle[1]}`); + } else { + textBlock.classList.add(`heading-${textStyle[0]}`); + } + }); + if (iconArea) { + if (iconArea.innerText?.trim()) iconArea.classList.add('detail-xs'); + iconArea.classList.add('icon-area'); + contentArea.appendChild(iconArea); + } + contentArea.appendChild(textArea); +} + +function decoratePromobar(el) { + const viewports = ['mobile-up', 'tablet-up', 'desktop-up']; + const foreground = el.querySelector('.foreground'); + const variant = el.classList.contains('popup') ? 'popup' : 'default'; + if (foreground.childElementCount !== 3) checkViewportPromobar(foreground); + [...foreground.children].forEach((child, index) => { + child.className = viewports[index]; + child.classList.add('promo-text'); + const textBlocks = [...child.children]; + const iconArea = child.querySelector('picture')?.closest('p'); + const actionArea = child.querySelectorAll('em a, strong a, p > a strong'); + if (iconArea) textBlocks.shift(); + if (actionArea.length) textBlocks.pop(); + if (!(textBlocks.length || iconArea || actionArea.length)) child.classList.add('hide-block'); + else if (textBlocks.length) combineTextBocks(textBlocks, iconArea, viewports[index], variant); + }); + if (variant === 'popup' || el.classList.contains('frictionless')) addCloseButton(el); + return foreground; +} + +function decorateLayout(el) { + const elems = el.querySelectorAll(':scope > div'); + if (elems.length > 1) { + decorateBlockBg(el, elems[0]); + } + const foreground = elems[elems.length - 1]; + foreground.classList.add('foreground', 'container'); + if (el.classList.contains('promobar')) return decoratePromobar(el); + if (el.classList.contains('split')) decorateMedia(el); + const text = foreground.querySelector('h1, h2, h3, h4, h5, h6, p')?.closest('div'); + text?.classList.add('text'); + const media = foreground.querySelector(':scope > div:not([class])'); + if (media && !el.classList.contains('notification')) { + media.classList.add('image'); + const video = media.querySelector('video'); + if (video) applyHoverPlay(video); + } + const picture = text?.querySelector('p picture'); + const iconArea = picture ? (picture.closest('p') || createTag('p', null, picture)) : null; + iconArea?.classList.add('icon-area'); + const foregroundImage = foreground.querySelector(':scope > div:not(.text) img')?.closest('div'); + const bgImage = el.querySelector(':scope > div:not(.text):not(.foreground) img')?.closest('div'); + const foregroundMedia = foreground.querySelector(':scope > div:not(.text) video, :scope > div:not(.text) a[href*=".mp4"]')?.closest('div'); + const bgMedia = el.querySelector(':scope > div:not(.text):not(.foreground) video, :scope > div:not(.text):not(.foreground) a[href*=".mp4"]')?.closest('div'); + const image = foregroundImage ?? bgImage; + const asideMedia = foregroundMedia ?? bgMedia ?? image; + const isSplit = el.classList.contains('split'); + const hasMedia = foregroundImage ?? foregroundMedia ?? (isSplit && asideMedia); + if (!hasMedia) el.classList.add('no-media'); + if (asideMedia && !asideMedia.classList.contains('text')) { + asideMedia.classList.add(`${isSplit ? 'split-' : ''}image`); + if (isSplit) { + const position = [...asideMedia.parentNode.children].indexOf(asideMedia); + el.classList.add(`split${!position ? '-right' : '-left'}`); + foreground.parentElement.appendChild(asideMedia); + } + } else if (!iconArea) { + foreground?.classList.add('no-image'); + } + if (el.classList.contains('split') + && (el.classList.contains('medium') || el.classList.contains('large'))) { + decorateIconStack(el); + } + return foreground; +} + +export default function init(el) { + el.classList.add('con-block'); + const blockData = getBlockData(el); + const blockText = decorateLayout(el); + decorateBlockText(blockText, blockData); + decorateStaticLinks(el); + formatPromoButton(el); + if (el.classList.contains('frictionless')) { + if (document.querySelectorAll('.CTAButtons').length) { + linkSectionToModuleStep(el); + editCtaToModuleClick(el); + } else el.closest('.section').classList.add('.sticky-banner-disable'); + } +} From a17d00c35c271a3d4ddb67e6ee7d45c95b9ebd99 Mon Sep 17 00:00:00 2001 From: "milo-pr-merge[bot]" <169241390+milo-pr-merge[bot]@users.noreply.github.com> Date: Thu, 16 May 2024 13:56:15 +0200 Subject: [PATCH 2/3] [Release] Stage to Main (#2309) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * MWPW-147599: CaaS Bulk Publisher not working after MS authentication change (#2248) Potential fix for bulk publisher issues Co-authored-by: Blaine Gunn Co-authored-by: Sheridan Sunier * Preflight Accessibility tab update (#2254) Updating how alt text is used and displayed in preflight Co-authored-by: Ryan Clayton * MWPW-146407: add new card style to caas configurator (#2279) Co-authored-by: Brad Johnson Co-authored-by: Sheridan Sunier * MWPW-141780 - Clean up Accordion block attributes (#2276) remove role attribute on dd elements Co-authored-by: Okan Sahin <39759830+mokimo@users.noreply.github.com> * MWPW-147158: adds support for footer divider at the collection level (#2198) * MWPW-147158: adds support for footer divider at the collection level * Updatest unit-test files * Update windows copy hash * Update OSX copy hash * Updates OSX hash again * Removes console log * Adds console logs for debbuging * Removes console logs * Adds console logs for debbuging again * Removes console log * Updates OSX hash * Adds debuging message to test * Update os-hash check logic * trim() generated hash * Changes the comparison logic for the hash * Reverts last attempt * new attempt to fix test --------- Co-authored-by: Okan Sahin <39759830+mokimo@users.noreply.github.com> * MWPW-147594: Consumers mappings for origin not being sent when using sidekick (#2244) * Fix for origin always being upper cased * Update tools/send-to-caas/send-utils.js changing to const Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Okan Sahin <39759830+mokimo@users.noreply.github.com> * Stage automation, update the body after merging another PR in (#2289) * Stage process improvements * Remove team reviewers * Formatting * Simplify PR bodies --------- Co-authored-by: Robert Bogos <146744221+robert-bogos@users.noreply.github.com> * Remove label requirements & merge workflows (#2288) Remove label & merge workflows Co-authored-by: Robert Bogos <146744221+robert-bogos@users.noreply.github.com> * Quiz entry block (#2294) * Initial quiz-entry block with ml field * MWPW-144810: Quiz Entry - Add option cards and text to the block (#2095) * Quiz entry block (#2103) * MWPW-144810: Quiz Entry - Add option cards and text to the block * MWPW-144810: Add the text to strings.xlsx for title, subtitle, ML field default, card instruction bar and the button * MWPW-146243 - Quiz entry code optimization (#2121) * MWPW-146243 - Quiz entry code optimization * Restores code optimization that was lost in previous PRs Resolves: [MWPW-146243](https://jira.corp.adobe.com/browse/MWPW-146243) * Update utils.js * Update quiz-entry.js Set button to use string values * Update quiz-entry.js Fixed to use new strings object * MWPW-146034 - Quiz entry block accessibility (#2139) * resolved accessibility concerns when the ml input is used * general code refinements for more clarity, specifically for getting string values Resolves: [MWPW-146034](https://jira.corp.adobe.com/browse/MWPW-146034) * MWPW-146036 - Rig up quiz entry button (#2190) * Support for ml filtering * Debug support using ?debug=quiz-entry * Store quizState in local storage and redirect to the quiz Resolves: [MWPW-146036](https://jira.corp.adobe.com/browse/MWPW-146036) * Quiz entry block (#2204) * MWPW-144810: Quiz Entry - Add option cards and text to the block * MWPW-144810: Add the text to strings.xlsx for title, subtitle, ML field default, card instruction bar and the button * MWPW-147031:Add Analytics for Quiz Entry Block, MWPW-146080: Integrate Auto-Complete for Open Text Field on UAR Exposed Front Door * fix eslint * fix code according feedbacks * MWPW-144022: Quiz entry block (#2227) * carousel starts * got buttons working * MWPW-144022: Prototype carousel refinement, keybord controls updated * linting fixes * MWPW-147482 - ML Input Bulletproofing (#2242) * add support for fallback fi codes * add lana logging for ml field failures * fix so the redirect checks for maxQuestions Resolves: [MWPW-147482](https://jira.corp.adobe.com/browse/MWPW-147482) **Test URLs:** - Before: https://main--milo--adobecom.hlx.page/?martech=off - After: https://--milo--adobecom.hlx.page/?martech=off * MWPW-147683 - CSS Cleanup (#2267) * MWPW-147683 - CSS Cleanup * Final pass on the css * Edits to markup where necessary Resolves: [MWPW-147683](https://jira.corp.adobe.com/browse/MWPW-147683) * pr feedback for vars and eslint errors * more PR feedback on icon placement * pr feedback for button border * cleaned up the carousel widths so it's consistent it all times as it was previously 8px short. * pr feedback on the location of the input clear X. * PR feedback - reduced border on input, fixed a card disable bug, addressed card layout in tablet * carousel starts * got buttons working * MWPW-144022: Prototype carousel refinement, keybord controls updated * linting fixes * Tests * working tests update * Small font size fixes that design has asked for * linting * linting * Update quiz-entry.js with default vals * Bring back debug * debugging debug * Update test/blocks/quiz-entry/mocks/mock-data.js Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Update test/blocks/quiz-entry/mocks/mock-data.js Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Update test/blocks/quiz-entry/mocks/mock-data.js Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Update test/blocks/quiz-entry/mocks/mock-data.js Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Update test/blocks/quiz-entry/mocks/mock-data.js Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Update test/blocks/quiz-entry/mocks/mock-data.js Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Update test/blocks/quiz-entry/mocks/mock-data.js Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Update test/blocks/quiz-entry/mocks/mock-data.js Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Update test/blocks/quiz-entry/mocks/mock-data.js Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Update test/blocks/quiz-entry/quiz-entry.test.js Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Update test/blocks/quiz-entry/quiz-entry.test.js Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Update test/blocks/quiz-entry/mocks/mock-data.js Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Update test/blocks/quiz-entry/mocks/mock-data.js Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * added quiz-entry to utils.js (#2296) Co-authored-by: Denys Fedotov * MWPW-148206: Update Spectra ML host from cchome-dev to cchome for PROD --------- Co-authored-by: Jacky Sun <67350368+JackySun9@users.noreply.github.com> Co-authored-by: Brad Johnson Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Denys Fedotov Co-authored-by: Denys Fedotov Co-authored-by: Jacky Sun * MWPW-147472: auto adjust commerce iframe (#2251) * MWPW-147472: auto adjust commerce iframe. * typo fix * fix for potential bfcache issues * improve modal selector query w.r.t hash improve test. --------- Co-authored-by: Mira Fedas <30750556+mirafedas@users.noreply.github.com> * MWPW-141725 Graybox Block (#2282) * Initial graybox overlay * Add title & desc support * Use more variables * Add tests; fix issues found with tests * Add blue design changes + body outline * Fix blue border on device preview. Small bug fixes. * Only enable on -graybox urls or with graybox url param * Update graybox check to use hostname instead of path * Small bug fixes to handle when graybox url param already present * Add check for localhost for unit tests * PR feedback * Add metadata check; code cov tweaks * Change metadata setting * add .page/.live selector * Disable georouting modal when graybox is enabled --------- Co-authored-by: Sunil Kamat <107644736+sukamat@users.noreply.github.com> Co-authored-by: Robert Bogos <146744221+robert-bogos@users.noreply.github.com> * MWPW-148253 Quiz Entry Coverage (#2305) * Initial quiz-entry block with ml field * MWPW-144810: Quiz Entry - Add option cards and text to the block (#2095) * Quiz entry block (#2103) * MWPW-144810: Quiz Entry - Add option cards and text to the block * MWPW-144810: Add the text to strings.xlsx for title, subtitle, ML field default, card instruction bar and the button * MWPW-146243 - Quiz entry code optimization (#2121) * MWPW-146243 - Quiz entry code optimization * Restores code optimization that was lost in previous PRs Resolves: [MWPW-146243](https://jira.corp.adobe.com/browse/MWPW-146243) * Update utils.js * Update quiz-entry.js Set button to use string values * Update quiz-entry.js Fixed to use new strings object * MWPW-146034 - Quiz entry block accessibility (#2139) * resolved accessibility concerns when the ml input is used * general code refinements for more clarity, specifically for getting string values Resolves: [MWPW-146034](https://jira.corp.adobe.com/browse/MWPW-146034) * MWPW-146036 - Rig up quiz entry button (#2190) * Support for ml filtering * Debug support using ?debug=quiz-entry * Store quizState in local storage and redirect to the quiz Resolves: [MWPW-146036](https://jira.corp.adobe.com/browse/MWPW-146036) * Quiz entry block (#2204) * MWPW-144810: Quiz Entry - Add option cards and text to the block * MWPW-144810: Add the text to strings.xlsx for title, subtitle, ML field default, card instruction bar and the button * MWPW-147031:Add Analytics for Quiz Entry Block, MWPW-146080: Integrate Auto-Complete for Open Text Field on UAR Exposed Front Door * fix eslint * fix code according feedbacks * MWPW-144022: Quiz entry block (#2227) * carousel starts * got buttons working * MWPW-144022: Prototype carousel refinement, keybord controls updated * linting fixes * MWPW-147482 - ML Input Bulletproofing (#2242) * add support for fallback fi codes * add lana logging for ml field failures * fix so the redirect checks for maxQuestions Resolves: [MWPW-147482](https://jira.corp.adobe.com/browse/MWPW-147482) **Test URLs:** - Before: https://main--milo--adobecom.hlx.page/?martech=off - After: https://--milo--adobecom.hlx.page/?martech=off * MWPW-147683 - CSS Cleanup (#2267) * MWPW-147683 - CSS Cleanup * Final pass on the css * Edits to markup where necessary Resolves: [MWPW-147683](https://jira.corp.adobe.com/browse/MWPW-147683) * pr feedback for vars and eslint errors * more PR feedback on icon placement * pr feedback for button border * cleaned up the carousel widths so it's consistent it all times as it was previously 8px short. * pr feedback on the location of the input clear X. * PR feedback - reduced border on input, fixed a card disable bug, addressed card layout in tablet * carousel starts * got buttons working * MWPW-144022: Prototype carousel refinement, keybord controls updated * linting fixes * Tests * working tests update * linting * linting * Update quiz-entry.js with default vals * Bring back debug * debugging debug * Improved test coverage * resolve conflicts * restore style * formatting fix --------- Co-authored-by: Cody Lloyd Co-authored-by: Jacky Sun <67350368+JackySun9@users.noreply.github.com> Co-authored-by: Cody Lloyd <119891065+colloyd@users.noreply.github.com> * Revert "MWPW-141725 Graybox Block (#2282)" This reverts commit 7c475418c847186480f820cc6feaac6cc6b084f4. * Revert "MWPW-148253 Quiz Entry Coverage (#2305)" This reverts commit ed796304d59cbd66e6fd443dc43380b4689ac08b. * Revert "Revert "MWPW-141725 Graybox Block (#2282)"" This reverts commit e14572ac393c319de6e2ee1bcb7fe387f2499eaa. * MWPW-148253 Quiz Entry Coverage (#2305) * Initial quiz-entry block with ml field * MWPW-144810: Quiz Entry - Add option cards and text to the block (#2095) * Quiz entry block (#2103) * MWPW-144810: Quiz Entry - Add option cards and text to the block * MWPW-144810: Add the text to strings.xlsx for title, subtitle, ML field default, card instruction bar and the button * MWPW-146243 - Quiz entry code optimization (#2121) * MWPW-146243 - Quiz entry code optimization * Restores code optimization that was lost in previous PRs Resolves: [MWPW-146243](https://jira.corp.adobe.com/browse/MWPW-146243) * Update utils.js * Update quiz-entry.js Set button to use string values * Update quiz-entry.js Fixed to use new strings object * MWPW-146034 - Quiz entry block accessibility (#2139) * resolved accessibility concerns when the ml input is used * general code refinements for more clarity, specifically for getting string values Resolves: [MWPW-146034](https://jira.corp.adobe.com/browse/MWPW-146034) * MWPW-146036 - Rig up quiz entry button (#2190) * Support for ml filtering * Debug support using ?debug=quiz-entry * Store quizState in local storage and redirect to the quiz Resolves: [MWPW-146036](https://jira.corp.adobe.com/browse/MWPW-146036) * Quiz entry block (#2204) * MWPW-144810: Quiz Entry - Add option cards and text to the block * MWPW-144810: Add the text to strings.xlsx for title, subtitle, ML field default, card instruction bar and the button * MWPW-147031:Add Analytics for Quiz Entry Block, MWPW-146080: Integrate Auto-Complete for Open Text Field on UAR Exposed Front Door * fix eslint * fix code according feedbacks * MWPW-144022: Quiz entry block (#2227) * carousel starts * got buttons working * MWPW-144022: Prototype carousel refinement, keybord controls updated * linting fixes * MWPW-147482 - ML Input Bulletproofing (#2242) * add support for fallback fi codes * add lana logging for ml field failures * fix so the redirect checks for maxQuestions Resolves: [MWPW-147482](https://jira.corp.adobe.com/browse/MWPW-147482) **Test URLs:** - Before: https://main--milo--adobecom.hlx.page/?martech=off - After: https://--milo--adobecom.hlx.page/?martech=off * MWPW-147683 - CSS Cleanup (#2267) * MWPW-147683 - CSS Cleanup * Final pass on the css * Edits to markup where necessary Resolves: [MWPW-147683](https://jira.corp.adobe.com/browse/MWPW-147683) * pr feedback for vars and eslint errors * more PR feedback on icon placement * pr feedback for button border * cleaned up the carousel widths so it's consistent it all times as it was previously 8px short. * pr feedback on the location of the input clear X. * PR feedback - reduced border on input, fixed a card disable bug, addressed card layout in tablet * carousel starts * got buttons working * MWPW-144022: Prototype carousel refinement, keybord controls updated * linting fixes * Tests * working tests update * linting * linting * Update quiz-entry.js with default vals * Bring back debug * debugging debug * Improved test coverage * resolve conflicts * restore style * formatting fix --------- Co-authored-by: Cody Lloyd Co-authored-by: Jacky Sun <67350368+JackySun9@users.noreply.github.com> Co-authored-by: Cody Lloyd <119891065+colloyd@users.noreply.github.com> * Merge main into stage to resolve history issues (#2310) * [Release] Stage to Main (#2299) * MWPW-147599: CaaS Bulk Publisher not working after MS authentication change (#2248) Potential fix for bulk publisher issues Co-authored-by: Blaine Gunn Co-authored-by: Sheridan Sunier * Preflight Accessibility tab update (#2254) Updating how alt text is used and displayed in preflight Co-authored-by: Ryan Clayton * MWPW-146407: add new card style to caas configurator (#2279) Co-authored-by: Brad Johnson Co-authored-by: Sheridan Sunier * MWPW-141780 - Clean up Accordion block attributes (#2276) remove role attribute on dd elements Co-authored-by: Okan Sahin <39759830+mokimo@users.noreply.github.com> * MWPW-147158: adds support for footer divider at the collection level (#2198) * MWPW-147158: adds support for footer divider at the collection level * Updatest unit-test files * Update windows copy hash * Update OSX copy hash * Updates OSX hash again * Removes console log * Adds console logs for debbuging * Removes console logs * Adds console logs for debbuging again * Removes console log * Updates OSX hash * Adds debuging message to test * Update os-hash check logic * trim() generated hash * Changes the comparison logic for the hash * Reverts last attempt * new attempt to fix test --------- Co-authored-by: Okan Sahin <39759830+mokimo@users.noreply.github.com> * MWPW-147594: Consumers mappings for origin not being sent when using sidekick (#2244) * Fix for origin always being upper cased * Update tools/send-to-caas/send-utils.js changing to const Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Okan Sahin <39759830+mokimo@users.noreply.github.com> * Stage automation, update the body after merging another PR in (#2289) * Stage process improvements * Remove team reviewers * Formatting * Simplify PR bodies --------- Co-authored-by: Robert Bogos <146744221+robert-bogos@users.noreply.github.com> * Remove label requirements & merge workflows (#2288) Remove label & merge workflows Co-authored-by: Robert Bogos <146744221+robert-bogos@users.noreply.github.com> * Quiz entry block (#2294) * Initial quiz-entry block with ml field * MWPW-144810: Quiz Entry - Add option cards and text to the block (#2095) * Quiz entry block (#2103) * MWPW-144810: Quiz Entry - Add option cards and text to the block * MWPW-144810: Add the text to strings.xlsx for title, subtitle, ML field default, card instruction bar and the button * MWPW-146243 - Quiz entry code optimization (#2121) * MWPW-146243 - Quiz entry code optimization * Restores code optimization that was lost in previous PRs Resolves: [MWPW-146243](https://jira.corp.adobe.com/browse/MWPW-146243) * Update utils.js * Update quiz-entry.js Set button to use string values * Update quiz-entry.js Fixed to use new strings object * MWPW-146034 - Quiz entry block accessibility (#2139) * resolved accessibility concerns when the ml input is used * general code refinements for more clarity, specifically for getting string values Resolves: [MWPW-146034](https://jira.corp.adobe.com/browse/MWPW-146034) * MWPW-146036 - Rig up quiz entry button (#2190) * Support for ml filtering * Debug support using ?debug=quiz-entry * Store quizState in local storage and redirect to the quiz Resolves: [MWPW-146036](https://jira.corp.adobe.com/browse/MWPW-146036) * Quiz entry block (#2204) * MWPW-144810: Quiz Entry - Add option cards and text to the block * MWPW-144810: Add the text to strings.xlsx for title, subtitle, ML field default, card instruction bar and the button * MWPW-147031:Add Analytics for Quiz Entry Block, MWPW-146080: Integrate Auto-Complete for Open Text Field on UAR Exposed Front Door * fix eslint * fix code according feedbacks * MWPW-144022: Quiz entry block (#2227) * carousel starts * got buttons working * MWPW-144022: Prototype carousel refinement, keybord controls updated * linting fixes * MWPW-147482 - ML Input Bulletproofing (#2242) * add support for fallback fi codes * add lana logging for ml field failures * fix so the redirect checks for maxQuestions Resolves: [MWPW-147482](https://jira.corp.adobe.com/browse/MWPW-147482) **Test URLs:** - Before: https://main--milo--adobecom.hlx.page/?martech=off - After: https://--milo--adobecom.hlx.page/?martech=off * MWPW-147683 - CSS Cleanup (#2267) * MWPW-147683 - CSS Cleanup * Final pass on the css * Edits to markup where necessary Resolves: [MWPW-147683](https://jira.corp.adobe.com/browse/MWPW-147683) * pr feedback for vars and eslint errors * more PR feedback on icon placement * pr feedback for button border * cleaned up the carousel widths so it's consistent it all times as it was previously 8px short. * pr feedback on the location of the input clear X. * PR feedback - reduced border on input, fixed a card disable bug, addressed card layout in tablet * carousel starts * got buttons working * MWPW-144022: Prototype carousel refinement, keybord controls updated * linting fixes * Tests * working tests update * Small font size fixes that design has asked for * linting * linting * Update quiz-entry.js with default vals * Bring back debug * debugging debug * Update test/blocks/quiz-entry/mocks/mock-data.js Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Update test/blocks/quiz-entry/mocks/mock-data.js Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Update test/blocks/quiz-entry/mocks/mock-data.js Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Update test/blocks/quiz-entry/mocks/mock-data.js Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Update test/blocks/quiz-entry/mocks/mock-data.js Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Update test/blocks/quiz-entry/mocks/mock-data.js Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Update test/blocks/quiz-entry/mocks/mock-data.js Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Update test/blocks/quiz-entry/mocks/mock-data.js Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Update test/blocks/quiz-entry/mocks/mock-data.js Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Update test/blocks/quiz-entry/quiz-entry.test.js Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Update test/blocks/quiz-entry/quiz-entry.test.js Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Update test/blocks/quiz-entry/mocks/mock-data.js Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Update test/blocks/quiz-entry/mocks/mock-data.js Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * added quiz-entry to utils.js (#2296) Co-authored-by: Denys Fedotov * MWPW-148206: Update Spectra ML host from cchome-dev to cchome for PROD --------- Co-authored-by: Jacky Sun <67350368+JackySun9@users.noreply.github.com> Co-authored-by: Brad Johnson Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Denys Fedotov Co-authored-by: Denys Fedotov Co-authored-by: Jacky Sun --------- Co-authored-by: Sanjay Rai Co-authored-by: Blaine Gunn Co-authored-by: Sheridan Sunier Co-authored-by: Ryan Clayton Co-authored-by: Ryan Clayton Co-authored-by: Brad Johnson Co-authored-by: Sheridan Sunier Co-authored-by: Elan Bartholomew <79870969+elan-tbx@users.noreply.github.com> Co-authored-by: Okan Sahin <39759830+mokimo@users.noreply.github.com> Co-authored-by: cmiqueo <64917520+cmiqueo@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Robert Bogos <146744221+robert-bogos@users.noreply.github.com> Co-authored-by: Cody Lloyd <119891065+colloyd@users.noreply.github.com> Co-authored-by: Jacky Sun <67350368+JackySun9@users.noreply.github.com> Co-authored-by: Denys Fedotov Co-authored-by: Denys Fedotov Co-authored-by: Jacky Sun * Revert "MWPW-141725 Graybox Block (#2282)" This reverts commit 7c475418c847186480f820cc6feaac6cc6b084f4. * Revert "MWPW-148253 Quiz Entry Coverage (#2305)" This reverts commit ed796304d59cbd66e6fd443dc43380b4689ac08b. * Revert "Revert "MWPW-141725 Graybox Block (#2282)"" This reverts commit e14572ac393c319de6e2ee1bcb7fe387f2499eaa. * MWPW-148253 Quiz Entry Coverage (#2305) * Initial quiz-entry block with ml field * MWPW-144810: Quiz Entry - Add option cards and text to the block (#2095) * Quiz entry block (#2103) * MWPW-144810: Quiz Entry - Add option cards and text to the block * MWPW-144810: Add the text to strings.xlsx for title, subtitle, ML field default, card instruction bar and the button * MWPW-146243 - Quiz entry code optimization (#2121) * MWPW-146243 - Quiz entry code optimization * Restores code optimization that was lost in previous PRs Resolves: [MWPW-146243](https://jira.corp.adobe.com/browse/MWPW-146243) * Update utils.js * Update quiz-entry.js Set button to use string values * Update quiz-entry.js Fixed to use new strings object * MWPW-146034 - Quiz entry block accessibility (#2139) * resolved accessibility concerns when the ml input is used * general code refinements for more clarity, specifically for getting string values Resolves: [MWPW-146034](https://jira.corp.adobe.com/browse/MWPW-146034) * MWPW-146036 - Rig up quiz entry button (#2190) * Support for ml filtering * Debug support using ?debug=quiz-entry * Store quizState in local storage and redirect to the quiz Resolves: [MWPW-146036](https://jira.corp.adobe.com/browse/MWPW-146036) * Quiz entry block (#2204) * MWPW-144810: Quiz Entry - Add option cards and text to the block * MWPW-144810: Add the text to strings.xlsx for title, subtitle, ML field default, card instruction bar and the button * MWPW-147031:Add Analytics for Quiz Entry Block, MWPW-146080: Integrate Auto-Complete for Open Text Field on UAR Exposed Front Door * fix eslint * fix code according feedbacks * MWPW-144022: Quiz entry block (#2227) * carousel starts * got buttons working * MWPW-144022: Prototype carousel refinement, keybord controls updated * linting fixes * MWPW-147482 - ML Input Bulletproofing (#2242) * add support for fallback fi codes * add lana logging for ml field failures * fix so the redirect checks for maxQuestions Resolves: [MWPW-147482](https://jira.corp.adobe.com/browse/MWPW-147482) **Test URLs:** - Before: https://main--milo--adobecom.hlx.page/?martech=off - After: https://--milo--adobecom.hlx.page/?martech=off * MWPW-147683 - CSS Cleanup (#2267) * MWPW-147683 - CSS Cleanup * Final pass on the css * Edits to markup where necessary Resolves: [MWPW-147683](https://jira.corp.adobe.com/browse/MWPW-147683) * pr feedback for vars and eslint errors * more PR feedback on icon placement * pr feedback for button border * cleaned up the carousel widths so it's consistent it all times as it was previously 8px short. * pr feedback on the location of the input clear X. * PR feedback - reduced border on input, fixed a card disable bug, addressed card layout in tablet * carousel starts * got buttons working * MWPW-144022: Prototype carousel refinement, keybord controls updated * linting fixes * Tests * working tests update * linting * linting * Update quiz-entry.js with default vals * Bring back debug * debugging debug * Improved test coverage * resolve conflicts * restore style * formatting fix --------- Co-authored-by: Cody Lloyd Co-authored-by: Jacky Sun <67350368+JackySun9@users.noreply.github.com> Co-authored-by: Cody Lloyd <119891065+colloyd@users.noreply.github.com> --------- Co-authored-by: Brad Johnson Co-authored-by: milo-pr-merge[bot] <169241390+milo-pr-merge[bot]@users.noreply.github.com> Co-authored-by: Sanjay Rai Co-authored-by: Blaine Gunn Co-authored-by: Sheridan Sunier Co-authored-by: Ryan Clayton Co-authored-by: Ryan Clayton Co-authored-by: Sheridan Sunier Co-authored-by: Elan Bartholomew <79870969+elan-tbx@users.noreply.github.com> Co-authored-by: cmiqueo <64917520+cmiqueo@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Robert Bogos <146744221+robert-bogos@users.noreply.github.com> Co-authored-by: Cody Lloyd <119891065+colloyd@users.noreply.github.com> Co-authored-by: Jacky Sun <67350368+JackySun9@users.noreply.github.com> Co-authored-by: Denys Fedotov Co-authored-by: Denys Fedotov Co-authored-by: Jacky Sun Co-authored-by: Cody Lloyd * Revert "MWPW-147472: auto adjust commerce iframe" (#2312) Revert "MWPW-147472: auto adjust commerce iframe (#2251)" This reverts commit 481bbcb6bb6cb99b003c4637d3d4b01530df4ebe. * OPT-26580 DC0994_US | Frictionless | Add sticky banner Upload CTA (#2298) * 05-13-24 ivan dc0944 first * Update libs/mep/dc0944/aside/aside.js Co-authored-by: Vivian A Goodrich <101133187+vgoodric@users.noreply.github.com> * 05-13-24 ivan dc0944 add css changes and js optimization * Update libs/mep/dc0944/aside/aside.js Co-authored-by: Robert Bogos <146744221+robert-bogos@users.noreply.github.com> * Update libs/mep/dc0944/aside/aside.js Co-authored-by: Robert Bogos <146744221+robert-bogos@users.noreply.github.com> * Update libs/mep/dc0944/aside/aside.js Co-authored-by: Robert Bogos <146744221+robert-bogos@users.noreply.github.com> * Update libs/mep/dc0944/aside/aside.js Co-authored-by: Robert Bogos <146744221+robert-bogos@users.noreply.github.com> * Update libs/mep/dc0944/aside/aside.js Co-authored-by: Robert Bogos <146744221+robert-bogos@users.noreply.github.com> * 05-14-24 ivan renamed mep test folder dc0994 * 05-14-24 ivan fix sticky banner close btn --------- Co-authored-by: Vivian A Goodrich <101133187+vgoodric@users.noreply.github.com> Co-authored-by: Robert Bogos <146744221+robert-bogos@users.noreply.github.com> Co-authored-by: markpadbe --------- Co-authored-by: Sanjay Rai Co-authored-by: Blaine Gunn Co-authored-by: Sheridan Sunier Co-authored-by: Ryan Clayton Co-authored-by: Ryan Clayton Co-authored-by: Brad Johnson Co-authored-by: Sheridan Sunier Co-authored-by: Elan Bartholomew <79870969+elan-tbx@users.noreply.github.com> Co-authored-by: Okan Sahin <39759830+mokimo@users.noreply.github.com> Co-authored-by: cmiqueo <64917520+cmiqueo@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Robert Bogos <146744221+robert-bogos@users.noreply.github.com> Co-authored-by: Cody Lloyd <119891065+colloyd@users.noreply.github.com> Co-authored-by: Jacky Sun <67350368+JackySun9@users.noreply.github.com> Co-authored-by: Denys Fedotov Co-authored-by: Denys Fedotov Co-authored-by: Jacky Sun Co-authored-by: ilyas Stéphane Türkben Co-authored-by: Mira Fedas <30750556+mirafedas@users.noreply.github.com> Co-authored-by: Chris Peyer Co-authored-by: Sunil Kamat <107644736+sukamat@users.noreply.github.com> Co-authored-by: Cody Lloyd Co-authored-by: Okan Sahin Co-authored-by: milo-pr-merge[bot] <169241390+milo-pr-merge[bot]@users.noreply.github.com> Co-authored-by: Jan Ivan Viloria <158211769+ivanvatadobe@users.noreply.github.com> Co-authored-by: Vivian A Goodrich <101133187+vgoodric@users.noreply.github.com> Co-authored-by: markpadbe --- libs/blocks/graybox/graybox.css | 284 +++++ libs/blocks/graybox/graybox.js | 285 +++++ libs/blocks/graybox/mobileFrames.js | 5 + libs/blocks/quiz-entry/quiz-entry.js | 8 +- libs/blocks/quiz-entry/quizoption.js | 7 - libs/blocks/quiz-entry/utils.js | 5 +- libs/mep/dc0994/aside/aside.css | 1204 +++++++++++++++++++++ libs/mep/dc0994/aside/aside.js | 236 ++++ libs/styles/styles.css | 3 + libs/utils/utils.js | 1 + test/blocks/graybox/graybox.test.js | 89 ++ test/blocks/graybox/mocks/graybox.html | 129 +++ test/blocks/quiz-entry/mocks/mock-data.js | 4 +- test/blocks/quiz-entry/quiz-entry.test.js | 145 ++- test/blocks/quiz-entry/utils.test.js | 149 +++ 15 files changed, 2542 insertions(+), 12 deletions(-) create mode 100644 libs/blocks/graybox/graybox.css create mode 100644 libs/blocks/graybox/graybox.js create mode 100644 libs/blocks/graybox/mobileFrames.js create mode 100644 libs/mep/dc0994/aside/aside.css create mode 100644 libs/mep/dc0994/aside/aside.js create mode 100644 test/blocks/graybox/graybox.test.js create mode 100644 test/blocks/graybox/mocks/graybox.html create mode 100644 test/blocks/quiz-entry/utils.test.js diff --git a/libs/blocks/graybox/graybox.css b/libs/blocks/graybox/graybox.css new file mode 100644 index 00000000000..4d3cac4ad8f --- /dev/null +++ b/libs/blocks/graybox/graybox.css @@ -0,0 +1,284 @@ +:root { + --gb-container-bg: white; + --gb-outline-color: #1473E6; + --gb-container-btn-bg: #505050; + --gb-overlay-color: rgba(0 0 0 / 45%); + --gb-modal-bg: #323232; + --gb-container-border: 4px solid var(--gb-outline-color); + --gb-page-outline-border: 8px solid var(--gb-outline-color); + --gb-toggle-arrow: 3px solid white; +} + +.graybox { + display: none; +} + +.gb-graybox-body { + position: relative; +} + +.gb-graybox-body:not(.gb-no-border)::before { + content: ''; + position: absolute; + top: calc(50% + 8px); + left: 50%; + transform: translate(-50%, -50%); + width: calc(100% - 15.5px); + height: 100%; + border: var(--gb-page-outline-border); + z-index: var(--above-all); + pointer-events: none; +} + +.gb-graybox-body.gb-tablet-preview:not(.gb-no-border)::before, +.gb-graybox-body.gb-phone-preview:not(.gb-no-border)::before { + top: auto; + left: auto; + transform: none; + height: calc(100% - 15.5px); + position: fixed; +} + +.gb-graybox-body .gb-no-click::before { + content: ""; + height: 100%; + pointer-events: all; + position: absolute; + width: 100%; + z-index: var(--above-all); +} + +.gb-no-change { + position: relative; +} + +.gb-overlay { + position: relative; +} + +.gb-graybox-body .gb-no-change::before, +.gb-graybox-body.gb-overlay::before { + background-color: var(--gb-overlay-color); + content: ""; + display: block; + height: 100%; + left: 0; + pointer-events: none; + position: absolute; + top: 0; + width: 100%; + z-index: calc(var(--above-all) - 1); +} + +body.gb-overlay::before { + position: fixed; +} + +/* The elements that should appear above the overlay */ +.gb-graybox-body .gb-changed { + position: relative; + z-index: var(--above-all); +} + +.graybox-container { + position: fixed; + right: 0; + top: 15%; + z-index: calc(var(--above-all) + 1); +} + +.graybox-container .gb-toggle { + background-color: var(--gb-outline-color); + border: var(--gb-container-border); + cursor: pointer; + height: 64px; + left: -40px; + position: absolute; + width: 40px; +} + +.graybox-container .gb-toggle::before { + border-bottom: var(--gb-toggle-arrow); + border-left: var(--gb-toggle-arrow); + border-radius: 2px; + content: " "; + cursor: pointer; + display: block; + height: 8px; + margin-left: 8px; + scale: 85%; + transform: rotate(140deg) scaleX(-1); + transition: transform 0.2s ease-in-out, margin-left 0.2s ease-in-out; + width: 8px; +} + +.graybox-container.open .gb-toggle::before { + margin-left: 3px; + transform: rotate(225deg) scaleX(1); +} + +.graybox-container .graybox-menu { + background-color: var(--gb-container-bg); + border-radius: 3px; + border-top-right-radius: 0; + border: 0; + box-sizing: border-box; + display: grid; + grid-template-rows: 1fr 66px; + overflow: hidden; + position: absolute; + right: 39px; + width: 0; +} + +.graybox-container .graybox-menu.hide-devices { + border-bottom-right-radius: 0; + grid-template-rows: 1fr 0; +} + +.graybox-container.open .graybox-menu { + border: var(--gb-container-border); + min-height: 60px; + min-width: 320px; +} + +.graybox-text { + color: #000; + font-size: 14px; + font-weight: normal; + line-height: 24px; + padding: 16px; +} + +.graybox-text > p:first-child { + font-weight: bold; + font-size: 24px; + margin: 0; +} + +.graybox-devices { + display: grid; + grid-template-columns: 1fr 1fr 1fr; + justify-content: center; + align-content: center; + justify-items: center; + padding: 16px; + column-gap: 10px; + height: 34px; + border-top: var(--gb-container-border); + box-sizing: content-box; +} + +.graybox-devices > a { + box-sizing: border-box; + width: 85px; + text-align: center; + color: var(--gb-container-btn-bg); + border-color: var(--gb-container-btn-bg); + cursor: default; +} + +.graybox-devices > a:hover { + background-color: var(--gb-container-btn-bg); + text-decoration: none; +} + +.dialog-modal.graybox-modal { + z-index: var(--above-all); +} + +.dialog-modal.graybox-modal.mobile > div { + overflow-x: hidden; + border-radius: 88px; +} + +.dialog-modal.graybox-modal.tablet > div { + overflow-x: hidden; + border-radius: 88px; +} + +.dialog-modal.graybox-modal.mobile .graybox-device-border { + position: absolute; + pointer-events: none; + width: 418px; + height: 863px; +} + +.dialog-modal.graybox-modal.tablet .graybox-device-border { + position: absolute; + pointer-events: none; + width: 859px; + height: 1205px; +} + +.dialog-modal.graybox-modal.mobile { + width: 417px; + border-radius: 66px; + background: var(--gb-modal-bg); + overflow-y: hidden; +} + +.dialog-modal.graybox-modal.tablet { + width: 858px; + border-radius: 66px; + background: var(--gb-modal-bg); + border-top-right-radius: 60px 78px; + border-bottom-right-radius: 51px 69px; + border-bottom-left-radius: 55px 84px; + overflow-y: hidden; +} + +.dialog-modal.graybox-modal.mobile iframe { + width: 391px; + height: 852px; + padding-left: 16px; + margin-left: 4px; +} + +.dialog-modal.graybox-modal.tablet iframe { + width: 808px; + height: 1194px; + padding-left: 26px; + margin-left: 6px; + margin-top: 62px; + margin-bottom: -62px; +} + +.dialog-modal.graybox-modal button.dialog-close { + display: none; +} + +.modal-curtain.graybox-curtain.is-open { + background: var(--gb-modal-bg); + z-index: calc(var(--above-all) - 1); +} + +@media (max-height: 910px) { + body.gb-phone-preview::after { + content: "Expand window height to see full preview"; + position: fixed; + right: 10px; + bottom: 2px; + padding: 10px; + background-color: #f0f0f0; + color: #000; + font-size: 16px; + z-index: var(--above-all); + border-radius: 5px; + } +} + +@media (max-height: 1255px) { + body.gb-tablet-preview::after { + content: "Expand window height to see full preview"; + position: fixed; + right: 10px; + bottom: 2px; + padding: 10px; + background-color: #f0f0f0; + color: #000; + font-size: 16px; + z-index: var(--above-all); + border-radius: 5px; + } +} diff --git a/libs/blocks/graybox/graybox.js b/libs/blocks/graybox/graybox.js new file mode 100644 index 00000000000..236aa04ffc0 --- /dev/null +++ b/libs/blocks/graybox/graybox.js @@ -0,0 +1,285 @@ +import { createTag, getMetadata, MILO_EVENTS } from '../../utils/utils.js'; +import { getModal, closeModal } from '../modal/modal.js'; +import { iphoneFrame, ipadFrame } from './mobileFrames.js'; + +const OPTION = { + CHANGED: 'changed', + NO_CLICK: 'no-click', +}; + +const CLASS = { + CHANGED: 'gb-changed', + GRAYBOX_BODY: 'gb-graybox-body', + NO_BORDER: 'gb-no-border', + NO_CHANGE: 'gb-no-change', + NO_CLICK: 'gb-no-click', + NO_OVERLAY: 'gb-no-overlay', + OVERLAY: 'gb-overlay', + PHONE_PREVIEW: 'gb-phone-preview', + TABLET_PREVIEW: 'gb-tablet-preview', +}; + +const METADATA = { + DESC: 'gb-desc', + FOOTER: 'gb-footer', + GNAV: 'gb-gnav', + TITLE: 'gb-title', +}; + +const USER_AGENT = { + iPhone: 'Mozilla/5.0 (iPhone13,2; U; CPU iPhone OS 14_0 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) Version/10.0 Mobile/15E148 Safari/602.1', + iPad: 'Mozilla/5.0 (iPad; CPU OS 13_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1', +}; + +let deviceModal; + +const setMetadata = (metadata) => { + const { selector, val } = metadata; + if (!selector || !val) return; + const propName = selector.startsWith('og:') ? 'property' : 'name'; + let metaEl = document.querySelector(`meta[${propName}="${selector}"]`); + if (!metaEl) { + metaEl = document.createElement('meta'); + metaEl.setAttribute(propName, selector); + document.head.append(metaEl); + } + metaEl.setAttribute('content', val); +}; + +const isMobileDevice = () => /Android|webOS|iPhone|iPad|iPod/i.test(navigator.userAgent); + +const getTableValues = (el) => [...el.childNodes].reduce((rdx, row) => { + if (!row.children) return rdx; + + const key = row.children[0].textContent?.trim().toLowerCase(); + const content = row.children[1]; + let text = content?.textContent.trim(); + /* c8 ignore next 3 */ + if (key !== 'title' && key !== 'desc') { + text = text.toLowerCase(); + } + if (key && content) { + rdx.keys.push(key); + rdx[key] = { content, text }; + } + return rdx; +}, { keys: [] }); + +/* c8 ignore start */ +const getOptions = (text, metadata) => { + const options = text || getMetadata(metadata); + return options?.toLowerCase().split(',').map((opt) => opt.trim()); +}; + +const decorateFooter = (footer, options) => { + const footerOptions = getOptions(options.footer?.text, METADATA.FOOTER); + if (footerOptions?.includes(OPTION.CHANGED)) { + footer.classList.add(CLASS.CHANGED); + } else { + footer.classList.add(CLASS.OVERLAY); + } + if (footerOptions?.includes(OPTION.NO_CLICK)) { + footer.classList.add(CLASS.NO_CLICK); + } +}; + +const footerMutationObserver = (footerEl, callback, options) => { + const footerObserver = new MutationObserver((mutations) => { + mutations.forEach((mutation) => { + if (mutation.target.classList.contains('global-footer')) { + footerObserver.disconnect(); + decorateFooter(footerEl, options); + } + }); + }); + + footerObserver.observe(footerEl, { attributes: true }); +}; + +const checkFooter = (options) => { + const footerEl = document.querySelector('footer'); + if (footerEl?.classList.contains('global-footer')) { + decorateFooter(footerEl, options); + } else if (footerEl) { + footerMutationObserver(footerEl, decorateFooter, options); + } +}; + +const checkGnav = (options, globalNoClick) => { + const gnav = document.querySelector('.global-navigation'); + if (gnav) { + gnav.style.zIndex = '1002'; + const gnavOptions = getOptions(options.gnav?.text, METADATA.GNAV); + if (!(gnavOptions?.includes(OPTION.CHANGED))) { + gnav.classList.add(CLASS.OVERLAY); + if (globalNoClick) { + gnav.classList.add(CLASS.NO_CLICK); + } + } + if (gnavOptions?.includes(OPTION.NO_CLICK)) { + gnav.classList.add(CLASS.NO_CLICK); + } + } +}; +/* c8 ignore stop */ + +const checkNoClick = (grayboxEl, noClickOnGray) => { + if (!noClickOnGray) { + return; + } + /* c8 ignore next 6 */ + if (document.body.classList.contains(CLASS.OVERLAY)) { + document.body.classList.add(CLASS.NO_CLICK); + } else { + document.querySelectorAll(`.${CLASS.NO_CHANGE}`) + .forEach((el) => el.classList.add(CLASS.NO_CLICK)); + } +}; + +const capitalizeFirstLetter = (str) => str.charAt(0).toUpperCase() + str.slice(1); + +function setUserAgent(window, userAgent) { + /* c8 ignore next 3 */ + if (window.navigator.userAgent === userAgent) { + return; + } + + const userAgentProp = { get: () => userAgent }; + try { + Object.defineProperty(window.navigator, 'userAgent', userAgentProp); + /* c8 ignore next 3 */ + } catch (e) { + window.navigator = Object.create(navigator, { userAgent: userAgentProp }); + } +} + +const openDeviceModal = async (e) => { + if (deviceModal) { + closeModal(deviceModal); + deviceModal = null; + } + + if (e.target.classList.contains('graybox-desktop')) { + return; + } + + const isMobile = e.target.classList.contains('graybox-mobile'); + const isTablet = e.target.classList.contains('graybox-tablet'); + const docFrag = new DocumentFragment(); + const iFrameUrl = new URL(window.location.href); + iFrameUrl.searchParams.set('graybox', 'menu-off'); + const deviceBorder = createTag('img', { class: 'graybox-device-border', src: isMobile ? iphoneFrame : ipadFrame }); + const iFrame = createTag('iframe', { src: iFrameUrl.href, width: '100%', height: '100%' }); + + const modal = createTag('div', null, [deviceBorder, iFrame]); + docFrag.append(modal); + + deviceModal = await getModal(null, { class: 'graybox-modal', id: 'graybox-modal', content: docFrag, closeEvent: 'closeGrayboxModal' }); + + // Disable modal.js forcing 100% height + iFrame.style.height = ''; + + if (isMobile) { + document.body.classList.add(CLASS.PHONE_PREVIEW); + deviceModal.classList.add('mobile'); + setUserAgent(iFrame.contentWindow, USER_AGENT.iPhone); + } else if (isTablet) { + document.body.classList.add(CLASS.TABLET_PREVIEW); + deviceModal.classList.add('tablet'); + setUserAgent(iFrame.contentWindow, USER_AGENT.iPad); + } + + const removeBodyPreviewClasses = () => document.body.classList.remove( + CLASS.PHONE_PREVIEW, + CLASS.TABLET_PREVIEW, + ); + + window.addEventListener('milo:modal:closed', removeBodyPreviewClasses, { once: true }); + + const curtain = deviceModal.nextElementSibling; + curtain.classList.add('graybox-curtain'); +}; + +const createGrayboxMenu = (options, { isOpen = false } = {}) => { + const grayboxContainer = createTag('div', { class: 'graybox-container' }); + const grayboxMenu = createTag('div', { class: 'graybox-menu' }, null, { parent: grayboxContainer }); + /* c8 ignore next 3 */ + if (window.innerWidth < 600 || isMobileDevice()) { + grayboxMenu.classList.add('hide-devices'); + } + + const grayboxText = createTag('div', { class: 'graybox-text' }, null, { parent: grayboxMenu }); + const title = options.title?.text || getMetadata(METADATA.TITLE) || 'Review Update'; + const desc = options.desc?.text || getMetadata(METADATA.DESC) || ''; + grayboxText.innerHTML = `

${title}

${desc && `

${desc}

`}`; + + const grayboxDevices = createTag('div', { class: 'graybox-devices' }, null, { parent: grayboxMenu }); + + ['mobile', 'tablet', 'desktop'].forEach((device) => { + const button = createTag( + 'a', + { class: `graybox-${device} con-button` }, + capitalizeFirstLetter(device), + { parent: grayboxDevices }, + ); + button.addEventListener('click', openDeviceModal); + }); + + const toggleBtn = document.createElement('button'); + toggleBtn.className = 'gb-toggle'; + toggleBtn.addEventListener('click', () => { + grayboxContainer.classList.toggle('open'); + }); + + grayboxContainer.appendChild(toggleBtn); + document.body.appendChild(grayboxContainer); + + if (isOpen) { + grayboxContainer.classList.add('open'); + } +}; + +export default function init(grayboxEl) { + const url = new URL(window.location.href); + + const grayboxParam = url.searchParams.get('graybox'); + + /* c8 ignore next 9 */ + const enableGraybox = grayboxParam === 'on' + || url.hostname.includes('graybox.adobe.com') + || url.hostname.includes('localhost') + || url.hostname.includes('-graybox--') + || getMetadata('project') === 'graybox'; + + if (grayboxParam === 'off' || !enableGraybox) { + return; + } + + setMetadata({ selector: 'georouting', val: 'off' }); + + const options = getTableValues(grayboxEl); + const grayboxThePage = () => { + document.body.classList.add(CLASS.GRAYBOX_BODY); + const hasGrayboxChanged = !!document.querySelector(`.${CLASS.CHANGED}`); + if (hasGrayboxChanged) { + document.body.classList.add(CLASS.OVERLAY); + + document.querySelectorAll(`.${CLASS.CHANGED}`).forEach((el) => { + el.classList.add(CLASS.NO_OVERLAY); + if (!el.style.backgroundColor) el.style.backgroundColor = 'white'; + }); + } + const globalNoClick = grayboxEl.classList.contains(OPTION.NO_CLICK); + checkGnav(options, globalNoClick); + checkFooter(options); + checkNoClick(grayboxEl, globalNoClick); + /* c8 ignore next 3 */ + if (url.searchParams.get('graybox') === 'menu-off') { + document.body.classList.add(CLASS.NO_BORDER); + } else { + createGrayboxMenu(options, { isOpen: true }); + } + }; + + document.addEventListener(MILO_EVENTS.DEFERRED, grayboxThePage, { once: true }); +} diff --git a/libs/blocks/graybox/mobileFrames.js b/libs/blocks/graybox/mobileFrames.js new file mode 100644 index 00000000000..094c16ea843 --- /dev/null +++ b/libs/blocks/graybox/mobileFrames.js @@ -0,0 +1,5 @@ +const iphoneFrame = 'data:image/png;base64,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'; + +const ipadFrame = 'data:image/png;base64,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'; + +export { iphoneFrame, ipadFrame }; diff --git a/libs/blocks/quiz-entry/quiz-entry.js b/libs/blocks/quiz-entry/quiz-entry.js index 8559d7f04e4..5e569bfe161 100644 --- a/libs/blocks/quiz-entry/quiz-entry.js +++ b/libs/blocks/quiz-entry/quiz-entry.js @@ -4,6 +4,12 @@ import { mlField, getMLResults } from './mlField.js'; import { GetQuizOption } from './quizoption.js'; import { quizPopover, getSuggestions } from './quizPopover.js'; +export const locationWrapper = { + redirect: (url) => { + window.location = url; + }, +}; + const App = ({ quizPath, maxQuestions, @@ -222,7 +228,7 @@ const App = ({ if (questionCount.current === maxQuestions || currentQuizState.userFlow.length === 1) { if (!debug) { setSelectedQuestion(null); - window.location = quizPath; + locationWrapper.redirect(quizPath); } } else { setSelectedCards({}); diff --git a/libs/blocks/quiz-entry/quizoption.js b/libs/blocks/quiz-entry/quizoption.js index a2774c89b08..42db01b59ba 100644 --- a/libs/blocks/quiz-entry/quizoption.js +++ b/libs/blocks/quiz-entry/quizoption.js @@ -89,13 +89,6 @@ export const GetQuizOption = ({ } }; - useEffect(() => { - const entry = document.querySelector('.quiz-entry'); - if (entry && entry.querySelector('.no-carousel')) { - entry.removeChild(entry.querySelector('.no-carousel')); - } - }, []); - return html`
${index > 0 && html``} diff --git a/libs/blocks/quiz-entry/utils.js b/libs/blocks/quiz-entry/utils.js index 0d04f203645..f5551f1fc47 100644 --- a/libs/blocks/quiz-entry/utils.js +++ b/libs/blocks/quiz-entry/utils.js @@ -78,7 +78,10 @@ export const handleSelections = (prevSelections, selectedQuestion, selections) = // de-dup any existing data if they use the ml field and cards. if (prevSelections.length > 0) { prevSelections.forEach((selection) => { - if (selection.selectedQuestion === selectedQuestion) { + const jsonSelectionSelectedQustion = JSON.stringify(selection.selectedQuestion); + const jsonSelectedQuesion = JSON.stringify(selectedQuestion[0].selectedQuestion); + const isSameQuestion = jsonSelectionSelectedQustion === jsonSelectedQuesion; + if (isSameQuestion) { selection.selectedCards = selections; isNewQuestion = false; } diff --git a/libs/mep/dc0994/aside/aside.css b/libs/mep/dc0994/aside/aside.css new file mode 100644 index 00000000000..e8f2d3c2cb7 --- /dev/null +++ b/libs/mep/dc0994/aside/aside.css @@ -0,0 +1,1204 @@ +.aside { + display: flex; + width: 100%; + position: relative; + align-items: center; + justify-content: center; + overflow: hidden; +} + +.dark .aside, +.aside.dark { + color: var(--color-white); +} + +.aside p { + margin: 0; +} + +.aside.split picture { + display: flex; +} + +.aside .split-image img, +.aside .split-image video { + object-fit: cover; + min-height: 700px; + width: 100%; + height: 100%; +} + +.aside.notification .background img { + min-height: unset; +} + +.aside .foreground.container { + display: flex; + position: relative; + align-items: center; + justify-content: center; + flex-direction: column; + gap: var(--spacing-l); +} + +.aside:not(.notification):not(.inline) .foreground > :first-child { + padding: var(--spacing-xxxl) 0 0; +} + +.aside:not(.notification):not(.inline) .foreground > :last-child { + margin-bottom: var(--spacing-xxxl); +} + +.aside .foreground.container .text { + display: flex; + flex-wrap: wrap; +} + +.aside.split .foreground.container .text { + margin: 0; + max-width: var(--grid-container-width); + padding: var(--spacing-xxxl) 0 var(--spacing-l) 0; +} + +.aside.simple .foreground.container .text { + margin-bottom: 80px; +} + +.aside.notification .foreground.container .text { + max-width: none; + padding-top: 0; + padding-bottom: 0; +} + +.aside .foreground.container .image { + position: relative; + display: flex; +} + +.aside .foreground.container > div { + flex-grow: 1; + flex-basis: 0; + min-width: 0; +} + +.aside.notification .foreground.container > div { + flex-basis: 100%; +} + +.aside.inline .foreground.container .image, +.aside.inline .foreground.container .text { + padding: 0; +} + +.aside.split.large .foreground.container .text { + padding: var(--spacing-l) 0 var(--spacing-xxxl) 0; +} + +.aside.split .icon-stack-area li, +.aside.split .icon-stack-area li a { + display: flex; + align-items: center; + gap: 12px; + font-weight: bold; +} + +.aside.notification .foreground.container .text a { + white-space: nowrap; +} + +.aside:not(.notification) .foreground.container .text > * { + width: 100%; +} + +.aside .foreground.container .text .heading-xl { + margin: 0 0 var(--spacing-xs); +} + +.aside .foreground.container .text .body-m, +.aside .foreground.container .text .body-s { + margin-bottom: var(--spacing-s); +} + +.aside .foreground.container .text .supplemental-text { + padding-top: var(--spacing-s); + margin-bottom: 0; +} + +.aside.promobar .promo-text .action-area { + flex-wrap: nowrap; + gap: var(--spacing-xs); +} + +.aside.promobar .promo-text .action-area, +.aside .foreground.container .text .action-area { + margin-bottom: 0; + display: flex; + gap: var(--spacing-s); + flex-wrap: wrap; + align-items: center; +} + +.aside.notification .icon-area { + display: flex; + align-items: center; +} + +.aside .foreground.container .icon-area { + height: 56px; + max-width: 234px; + margin-bottom: var(--spacing-s); +} + +.aside .foreground.container a.icon-area { + height: auto; + margin-bottom: 0; +} + +.aside.split .split-image img, +.aside.split .split-image video { + position: relative; + min-height: 270px; +} + +.aside.split .split-image video { + display: block; +} + +.aside.split .mobile-square img, +.aside.split .mobile-square video { + aspect-ratio: var(--aspect-ratio-square); +} + +.aside.split .mobile-wide img, +.aside.split .mobile-wide video { + aspect-ratio: var(--aspect-ratio-wide); +} + +.aside.split .mobile-standard img, +.aside.split .mobile-standard video { + aspect-ratio: var(--aspect-ratio-standard); +} + +.aside.split .format img, +.aside.split .format video { + height: auto; +} + +.aside.split .icon-stack-area li img { + width: var(--icon-size-m); + height: auto; +} + +.aside.split .format picture, +.aside.split .format video { + display: flex; + height: 100%; + align-items: center; +} + +.aside .foreground.container .icon-area img { + max-width: 234px; + height: var(--icon-size-l); + width: auto; + object-fit: cover; + object-position: left top; +} + +.aside.simple .foreground.container .image { + display: none; +} + +.aside.split { + flex-direction: column; +} + +.aside.split.large { + flex-direction: column-reverse; +} + +.aside.split .foreground.container { + width: 100%; + max-width: 100%; + flex-direction: column; + z-index: 1; +} + +.aside.split .background { + position: relative; +} + +.aside.split.large .background { + background-color: transparent; +} + +.aside.split .foreground.container .image { + margin: 0; + display: none; +} + +.aside.split .icon-stack-area li picture { + flex-shrink: 0; +} + +.aside.notification .text [class^="heading-"] + .action-area { + margin-top: var(--spacing-xs); +} + +.aside.notification .foreground.container img { + display: block; +} + +.aside .foreground.container .image video, +.aside .foreground.container .image picture, +.aside .foreground.container .image picture img { + width: 100%; + display: flex; +} + +.aside.split .foreground.container .split-image img, +.aside.split .foreground.container .split-image video { + object-fit: cover; + height: 270px; +} + +.aside.inline { + border-radius: 10px; +} + +.aside.inline .foreground.container { + width: 100%; + min-height: 0; + margin: var(--spacing-m); + padding: 0; + gap: var(--spacing-m); +} + +.aside.inline .foreground.container .image { + margin-top: 0; +} + +.aside.inline .heading-s { + margin-bottom: var(--spacing-s); +} + +.aside.notification { + min-height: 0; +} + +.aside.notification .foreground.container { + padding-top: var(--spacing-s); + padding-bottom: var(--spacing-s); + box-sizing: border-box; + justify-content: flex-start; +} + +.aside.notification .foreground.container .image { + max-width: 75px; + margin: 0; + order: -1; +} + +.aside.notification .foreground.container .text a:not(.con-button) { + width: auto; + font-weight: normal; +} + +.aside.notification .foreground.container .text .action-area > a { + margin-right: 0; +} + +.aside.promobar .foreground.container { + min-height: 0; + display: flex; + flex-direction: column; + padding: 0; + margin: 0; +} + +.aside.promobar .foreground.container .icon-area { + margin-bottom: 0; + height: var(--icon-size-m); +} + +.aside.promobar .foreground.container .icon-area img { + height: var(--icon-size-m); +} + +.aside.notification.extra-small .foreground.container a:last-child { + font-weight: bold; +} + +.aside.notification.extra-small .foreground.container a:not(.con-button):last-of-type { + margin-left: var(--spacing-xs); + color: var(--link-color); +} + +.static-links .aside.notification.extra-small .foreground.container a:not(.con-button):last-of-type { + color: inherit; +} + +.aside.notification.small .foreground.container .text a.con-button { + display: table; + margin-left: 0; +} + +.aside.notification .foreground.container .text .heading-l { + margin-bottom: var(--spacing-xxs); +} + +.aside.notification .foreground.container:not(.no-image) .text .body-s.action-area, +.aside.notification .foreground.container:not(.no-image) .text .body-m.action-area { + margin-bottom: 0; +} + +.aside.notification .foreground.container .icon-area { + height: auto; + max-width: none; + margin-bottom: var(--spacing-xs); +} + +.aside.notification .foreground.container .icon-area img { + max-height: 40px; + height: auto; +} + +.aside.notification.extra-small .foreground.container { + min-height: 50px; + padding-top: var(--spacing-xs); + padding-bottom: var(--spacing-xs); +} + +.aside.notification.extra-small .foreground.container .text { + display: block; +} + +.aside.notification.medium .foreground.container .text, +.aside.notification.large .foreground.container .text { + flex-direction: column; +} + +.aside.notification.small .foreground.container .text { + flex-direction: column; + max-width: 1000px; +} + +.aside.center:not(.notification) .foreground.container .text { + margin: 80px 0; + text-align: center; + padding: 0; +} + +.aside.notification.center.small .foreground.container .text { + text-align: left; +} + +.aside.notification.center.small .foreground.container .text, +.aside.notification.center.extra-small .foreground.container .text { + margin: 0 auto; +} + +.aside.notification.small { + min-height: 88px; +} + +.aside.notification.medium { + min-height: 160px; +} + +.aside.notification.large { + min-height: 250px; +} + +.aside.notification.medium .foreground.container { + max-width: 800px; + gap: var(--spacing-xs); +} + +.aside.notification.medium .foreground.container .text .heading-s { + margin-bottom: var(--spacing-xxs); +} + +.aside.notification.center.small .foreground.container .text p { + text-align: initial; +} + +.aside.notification.large .foreground.container { + max-width: 1000px; + gap: var(--spacing-xs); +} + +.aside.notification .foreground.container [data-align=center], +.aside.notification.center .foreground.container, +.aside.notification.center .foreground.container > * { + text-align: center; + justify-content: center; +} + +.aside.promobar.popup .foreground.container { + width: 100%; + padding: 0; +} + +.aside.center:not(.notification) .foreground.container { + padding: 0; +} + +.aside.notification.large.center .foreground.container, +.aside.notification.large .foreground.container.no-image { + max-width: 800px; +} + +.aside.promobar.popup .promo-text .action-area { + justify-content: flex-end; + padding: 0 var(--spacing-xxs) var(--spacing-xxs) 0; + gap: var(--spacing-xxs); +} + +.aside.notification.center .foreground.container .action-area { + justify-content: center; +} + +.aside.notification.center.small .foreground.container .text, +.aside.notification.center.small .foreground.container .text > * { + justify-content: flex-start; +} + +.aside.split .icon-stack-area { + display: flex; + flex-flow: row wrap; + flex-direction: column; + gap: 12px; + margin: -8px 0 var(--spacing-s); + width: 100%; + padding: 0; + list-style-type: none; +} + +.aside.promobar.popup .promo-text .icon-area, +.aside.promobar.popup .promo-text .icon-area img { + display: flex; + gap: var(--spacing-xxs); + align-items: center; + height: var(--icon-size-xs); +} + +.aside.center:not(.notification) .foreground.container .icon-area { + max-width: 100%; +} + +.aside.center:not(.notification) .foreground.container .text .action-area { + justify-content: center; +} + +.aside:not(.notification) .foreground.container .text .detail-m { + margin-bottom: var(--spacing-xs); +} + +.aside.split .image.format { + display: flex; +} + +.aside.split.bio .foreground.container .text .icon-area { + display: none; +} + +.aside.center:not(.notification) .foreground.container .text .icon-area { + height: var(--icon-size-xxl); +} + +.aside.center:not(.notification) .foreground.container .text .icon-area img { + height: var(--icon-size-xxl); + max-width: 300px; + width: auto; +} + +.aside.promobar .foreground.container > :first-child { + padding: var(--spacing-xs) 0; +} + +.aside.promobar .promo-text[data-align="center"] { + justify-content: center; +} + +.aside.promobar .action-area .con-button { + flex-shrink: 0; +} + +.aside.promobar .promo-text.desktop-up, +.aside.promobar .promo-text.tablet-up { + display: none; +} + +.aside.promobar .promo-text.mobile-up { + display: flex; +} + +.aside.promobar .promo-text { + display: flex; + flex-flow: row nowrap; + gap: var(--spacing-xs); + justify-content: space-between; + width: 100%; + padding: var(--spacing-xs) 0; +} + +.aside.promobar .promo-text .content-area { + display: flex; + flex-flow: row nowrap; + gap: var(--spacing-xs); + align-items: center; +} + +.aside.promobar.popup { + border-radius: var(--spacing-xs); + width: var(--grid-container-width); + margin: auto; + box-shadow: 0 3px 6px #707070; +} + +.aside.promobar.popup .foreground.container .promo-text { + flex-direction: column; + padding: 0; +} + +.aside.promobar.popup .promo-text .content-area { + padding: var(--spacing-xs) var(--spacing-xs) 0 var(--spacing-xs); + flex-direction: column; + align-items: flex-start; + gap: var(--spacing-xxs); +} + +.aside.promobar.popup .promo-text .text-area { + margin-top: var(--spacing-m); +} + +.aside.promobar.popup .promo-text .icon-area+.text-area { + margin-top: 0; +} + +.aside.promobar.popup .promo-text .content-area .text-area { + display: flex; + flex-direction: column; + gap: var(--spacing-xxs); +} + +.aside.promobar.popup .mobile-up.promo-text .detail-xs+.text-area { + gap: var(--spacing-xs); +} + +.aside.promobar.popup .promo-close { + position: absolute; + right: var(--spacing-xxs); + top: var(--spacing-xxs); + height: 20px; + width: 20px; + border: none; + background: none; + cursor: pointer; +} + +.aside.promobar.popup .promo-close svg { + position: absolute; + top: 0; + left: 0; +} + +.aside.promobar.popup .promo-close circle { + fill: var(--color-black); +} + +.aside.promobar.popup .promo-close line { + stroke: var(--color-white); +} + +@media screen and (max-width: 600px) { + .aside.no-media:not(.notification) .foreground.container { + gap: 0; + } + + .aside.split.no-media:not(.notification) .foreground.container .text { + padding: var(--spacing-xxxl) 0; + } + + .aside.promobar.popup .mobile-up.hide-block ~ .promo-close { + display: none; + } +} + +@media screen and (min-width: 600px) { + .aside.small { + min-height: 420px; + } + + .aside.medium { + min-height: 560px; + } + + .aside.large { + min-height: 700px; + } + + .aside .foreground.container { + align-items: center; + flex-direction: row; + margin: 0 auto; + padding: var(--spacing-m) 0; + gap: var(--spacing-xl); + } + + .aside:not(.notification):not(.inline) .foreground.container > :first-child { + padding: 0; + } + + .aside:not(.notification):not(.inline):not(.center) .foreground.container > :last-child { + margin-bottom: 0; + } + + .aside .foreground.container .image { + margin: 0; + } + + .aside .foreground.container .text.image { + justify-content: flex-start; + } + + .aside .background, + .aside.split .split-image { + overflow: hidden; + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; + } + + .aside .foreground.container .text { + margin-bottom: 0; + padding-right: var(--spacing-s); + } + + .aside.split-right .foreground.container .text { + padding-left: var(--spacing-s); + } + + .aside.simple .foreground.container .text { + margin-bottom: 0; + max-width: 318px; + padding-right: 0; + } + + .aside.split .split-image { + overflow: hidden; + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; + } + + .aside.split .tablet-wide img, + .aside.split .tablet-wide video { + aspect-ratio: var(--aspect-ratio-wide); + } + + .aside.split .tablet-standard img, + .aside.split .tablet-standard video { + aspect-ratio: var(--aspect-ratio-standard); + } + + .aside.split-right .split-image img, + .aside.split-right .split-image video { + left: 0; + } + + .aside.split.large { + flex-direction: column; + } + + .aside .split-image .modal-img-link, + .aside.split .split-image img, + .aside.split .split-image video { + width: 60.5vw; + max-width: 56%; + position: absolute; + right: 0; + object-fit: cover; + object-position: center top; + } + + .aside .split-image .modal-img-link, + .aside.split.half .split-image img, + .aside.split.half .split-image video { + width: 50vw; + max-width: 1396px; + object-position: left top; + } + + .aside.split.split-left .split-image img, + .aside.split.split-left .split-image video { + right: 0; + left: auto; + } + + .aside.split.split-right .split-image img, + .aside.split.split-right .split-image video { + left: 0; + right: auto; + } + + [dir="rtl"] .aside.split.split-right .split-image img, + [dir="rtl"] .aside.split.split-right .split-image video { + right: 0; + left: auto; + } + + [dir="rtl"] .aside.split.split-left .split-image img, + [dir="rtl"] .aside.split.split-left .split-image video { + left: 0; + right: auto; + } + + .aside.split .foreground.container { + flex-direction: row; + justify-content: stretch; + max-width: var(--grid-container-width); + margin: 0 auto; + background-color: transparent; + } + + .aside.split .foreground.container .text { + flex: 0 0 31vw; + padding: var(--spacing-xxl) 0; + max-width: 100%; + margin: 0; + } + + .aside.split .foreground.container .image { + object-fit: cover; + flex: 0 0 61%; + display: block; + padding: 0; + } + + .aside.inline .foreground.container .text { + flex: 0 0 calc(60% - var(--spacing-s)); + max-width: none; + } + + .aside.notification .foreground.container .text { + padding-right: 0; + } + + .aside.notification.small .foreground.container .text { + flex-flow: row nowrap; + align-items: center; + flex-grow: 1; + } + + .aside.notification.small .foreground.container .text .body-m { + margin: 0; + } + + .aside.notification.small .foreground.container .text .body-m.action-area { + margin-left: 24px; + } + + [dir = "rtl"] .aside.notification.small .foreground.container .text .body-m.action-area { + margin-left: 0; + margin-right: 24px; + } + + .aside.split.half .foreground.container .text { + flex: 0 0 41.72%; + } + + .aside.split-right .foreground.container { + flex-direction: row-reverse; + } + + .aside.inline .foreground.container .image { + flex: 0 0 calc(40% - var(--spacing-s)); + margin-bottom: 0; + } + + .aside.notification .foreground.container { + flex-direction: row; + } + + .aside.notification.medium .foreground.container, + .aside.notification.large .foreground.container { + gap: var(--spacing-s); + } + + .aside.notification .foreground.container .image { + width: 30%; + max-width: 188px; + margin: 0; + padding: 0; + order: unset; + } + + .aside.notification .foreground.container .text+.image { + margin-right: 0; + } + + .aside.notification .foreground.container .icon-area { + width: auto; + margin-right: var(--spacing-xs); + margin-bottom: 0; + } + + [dir = "rtl"] .aside.notification .foreground.container .icon-area { + margin-left: var(--spacing-xs); + margin-right: 0; + } + + .aside.notification.extra-small .foreground.container.no-image .text { + display: flex; + } + + .aside.notification.extra-small .foreground.container.no-image .text a { + margin-left: 5px; + } + + .aside.promobar.popup .promo-text .action-area { + justify-content: center; + padding: 0 0 var(--spacing-xxs); + } + + .aside.notification.small .foreground.container .text .action-area { + width: auto; + margin-top: 0; + } + + .aside.split.bio .foreground.container .text .icon-area { + display: block; + } + + .aside.notification.small .foreground.container .text .icon-area { + height: 40px; + } + + .aside.center:not(.notification) .foreground.container .text .icon-area img { + max-width: 234px; + } + + .aside.medium.split.bio .foreground.container .text .icon-area, + .aside.large.split.bio .foreground.container .text .icon-area { + height: var(--icon-size-xxl); + margin-bottom: var(--spacing-xs); + } + + .aside.medium.split.bio .foreground.container .text .icon-area img, + .aside.large.split.bio .foreground.container .text .icon-area img { + width: var(--icon-size-xxl); + height: var(--icon-size-xxl); + border-radius: 50%; + } + + .aside.promobar .promo-text .content-area .text-area { + display: flex; + flex-flow: column nowrap; + gap: var(--spacing-xxs); + } + + .aside.promobar .promo-text.mobile-up, + .aside.promobar .promo-text.desktop-up { + display: none; + } + + .aside.promobar .promo-text.tablet-up { + display: flex; + } + + .aside.promobar.popup .promo-text { + gap: var(--spacing-s); + } + + .aside.promobar.popup .promo-text .content-area { + padding: var(--spacing-xxs) 0 0; + align-items: center; + text-align: center; + } +} + +@media (min-width: 600px) and (max-width: 1200px) { + .aside.promobar.popup .tablet-up.hide-block ~ .promo-close { + display: none; + } +} + +@media screen and (min-width: 1200px) { + .aside .foreground.container { + min-height: 420px; + width: var(--grid-container-width); + } + + .aside .foreground.container > div { + object-fit: cover; + padding-left: 0; + } + + .aside .foreground.container .text { + padding: var(--spacing-xxl) 0; + } + + .aside .foreground.container .icon-area { + max-width: 400px; + } + + .aside .foreground.container .text .heading-xl { + margin: 0 0 var(--spacing-xs); + } + + .aside.inline .foreground.container .text { + flex: 0 0 calc(64% - var(--spacing-s)); + } + + .aside.simple .foreground.container .text { + margin-bottom: 0; + max-width: 500px; + } + + .aside.split .foreground.container .text { + flex: 0 0 300px; + } + + .aside.split .foreground.container .image { + flex: 0 0 70%; + max-width: none; + object-fit: cover; + } + + .aside.split .split-image img, + .aside.split .split-image video { + max-width: 1396px; + } + + .aside.split .desktop-wide img, + .aside.split .desktop-wide video { + aspect-ratio: var(--aspect-ratio-wide); + } + + .aside.split .desktop-standard img, + .aside.split .desktop-standard video { + aspect-ratio: var(--aspect-ratio-standard); + } + + .aside.split.half .foreground.container .text { + max-width: 500px; + } + + .aside.inline { + max-width: 800px; + margin-right: auto; + margin-left: auto; + } + + .aside.inline .foreground.container .image { + flex: 0 0 calc(36% - var(--spacing-s)); + } + + .aside.split.icon-stack .foreground.container .text, + .aside.split.bio .foreground.container .text { + padding: var(--spacing-xxl) 0; + } + + .aside.split .icon-stack-area li { + max-width: calc(50% - 6px); + min-width: calc(50% - 6px); + } + + .aside.split .icon-stack-area { + flex-direction: row; + } + + .aside.promobar .foreground.container .icon-area, + .aside.promobar .foreground.container .icon-area img { + height: var(--icon-size-xxl); + } + + .aside.promobar.popup .promo-text .icon-area, + .aside.promobar.popup .promo-text .icon-area img { + height: var(--icon-size-m); + } + + .aside.center:not(.notification) .foreground.container .text .icon-area img { + max-width: 400px; + } + + .aside.center:not(.notification) .foreground.container .text { + max-width: 50%; + } + + .aside.notification .foreground.container { + min-height: 0; + } + + .aside.notification.extra-small .foreground.container { + padding-top: var(--spacing-xxs); + padding-bottom: var(--spacing-xxs); + } + + .aside.notification.medium .foreground.container { + gap: var(--spacing-m); + } + + .aside.notification.large .foreground.container { + gap: var(--spacing-l); + } + + .aside.notification .foreground.container .image { + width: 20%; + } + + .aside.notification .foreground.container .text+.image { + margin-right: 0; + } + + .aside.notification.small .foreground.container .text { + align-items: center; + justify-content: flex-start; + } + + .aside.notification.center.small .foreground.container .text, + .aside.notification.center.small .foreground.container .text > * { + justify-content: center; + } + + .aside.notification.center.small .foreground.container .text p { + text-align: center; + } + + .aside.notification.medium .foreground.container .image { + max-width: 168px; + } + + .aside.notification.large .foreground.container .image { + max-width: 304px; + } + + .aside.notification.medium .foreground.container .text+.image { + margin-right: 0; + } + + .aside.promobar .promo-text .content-area { + gap: var(--spacing-m); + } + + .aside.promobar .promo-text .content-area .text-area { + gap: var(--spacing-xs); + } + + .aside.promobar .promo-text .action-area { + gap: var(--spacing-s); + } + + .aside.promobar .promo-text.mobile-up, + .aside.promobar .promo-text.tablet-up { + display: none; + } + + .aside.promobar .promo-text.desktop-up { + display: flex; + gap: var(--spacing-m); + } + + .aside.promobar.popup { + border-radius: var(--spacing-xl); + width: 85%; + max-width: 1600px; + } + + .aside.promobar.popup .foreground.container .promo-text { + padding: var(--spacing-xs) 0; + flex-direction: row; + gap: var(--spacing-l); + justify-content: center; + max-width: 83.4%; + } + + .aside.promobar.popup .promo-text .content-area, + .aside.promobar.popup .promo-text .action-area { + flex-direction: row; + padding: 0; + gap: var(--spacing-xs); + min-height: 40px; + } + + .aside.promobar.popup .promo-close { + right: var(--spacing-s); + top: calc(50% - 10px); + } + + .aside.promobar.popup .desktop-up.hide-block ~ .promo-close { + display: none; + } + + .aside.promobar.popup .promo-text .text-area { + margin-top: 0; + } +} + +/* Added for frictionless dc0944 */ +.section.hide-on-step-start:not(.hide-sticky-section):not(.close-sticky-section) { + background: none !important; + display: flex; + justify-content: center; + padding: 0 7% 20px; +} + +.aside.frictionless { + background-color: rgb(0, 11, 29); + max-width: 1200px; + border-radius: 50px; + display: flex; + justify-content: center; + align-items: center; + position: relative; +} + +.aside.frictionless .foreground.container { + position: relative; + flex-direction: row; +} + +.aside.frictionless .promo-close { + background: rgb(0, 11, 29); + margin: 0; + width: 20px; + height: 20px +} + +.aside.frictionless .promo-text { + justify-content: center; +} + +.aside.frictionless .promo-text .text-area { + display: flex; + flex-direction: row !important; +} + +.aside.frictionless .promo-text .icon-area { + height: auto !important; +} + +.aside.frictionless .promo-text .icon-area img { + height: 38px !important; +} + +body.dc-bc[data-current-event="start"] .section.hide-on-step-start { + display: none; + background-color: none; +} + +@media screen and (min-width: 1440px) { + .aside.frictionless .promo-close { + position: absolute; + right: 40px; + } +} + +.sticky-banner-disable { + display: none !important; +} diff --git a/libs/mep/dc0994/aside/aside.js b/libs/mep/dc0994/aside/aside.js new file mode 100644 index 00000000000..2283e0e1d93 --- /dev/null +++ b/libs/mep/dc0994/aside/aside.js @@ -0,0 +1,236 @@ +/* + * Copyright 2022 Adobe. All rights reserved. + * This file is licensed to you under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS + * OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ + +/* +* Aside - v5.1 +*/ + +import { decorateBlockText, decorateIconStack, applyHoverPlay, decorateBlockBg } from '../../../utils/decorate.js'; +import { createTag } from '../../../utils/utils.js'; + +// standard/default aside uses same text sizes as the split +const variants = ['split', 'inline', 'notification']; +const sizes = ['extra-small', 'small', 'medium', 'large']; +const [split, inline, notification] = variants; +const [xsmall, small, medium, large] = sizes; +const blockConfig = { + [split]: ['xl', 's', 'm'], + [inline]: ['s', 'm'], + [notification]: { + [xsmall]: ['m', 'm'], + [small]: ['m', 'm'], + [medium]: ['s', 's'], + [large]: ['l', 'm'], + }, +}; +const FORMAT_REGEX = /^format:/i; +const closeSvg = ` + + + + + + `; + +const linkSectionToModuleStep = (el) => el.closest('.section').classList.add('hide-on-step-start'); + +function editCtaToModuleClick(el) { + el.querySelectorAll('a').forEach((cta) => { + if (cta.href.toLowerCase().includes('#module')) { + cta.addEventListener('click', (e) => { + e.preventDefault(); + window.scrollTo(0, 0); + document.querySelector('.CTAButtons')?.click(); + }); + } + }); +} + +function getBlockData(el) { + const variant = variants.find((variantClass) => el.classList.contains(variantClass)); + const size = sizes.find((sizeClass) => el.classList.contains(sizeClass)); + const blockData = variant ? blockConfig[variant] : blockConfig[Object.keys(blockConfig)[0]]; + return variant && size && !Array.isArray(blockData) ? blockData[size] : blockData; +} + +function decorateStaticLinks(el) { + if (!el.classList.contains('notification')) return; + el.querySelectorAll('a:not([class])').forEach((link) => { link.classList.add('static'); }); +} + +function decorateMedia(el) { + if (!(el.classList.contains('medium') || el.classList.contains('large'))) return; + const allMedia = el.querySelectorAll('div > p video, div > p picture'); + [...allMedia].some((media) => { + const parentP = media.closest('p'); + const siblingP = parentP?.nextElementSibling; + if (!siblingP || siblingP.nodeName !== 'P') return false; + const siblingText = siblingP.textContent; + if (!FORMAT_REGEX.test(siblingText)) return false; + const formats = siblingText.split(': ')[1]?.split(/\s+/); + if (formats) { + const formatClasses = []; + formatClasses.push('format'); + if (formats.length === 3) formatClasses.push(`desktop-${formats[2]}`); + if (formats.length >= 2) formatClasses.push(`tablet-${formats[1]}`); + formatClasses.push(`mobile-${formats[0]}`); + media.closest('div').classList.add(...formatClasses); + } + siblingP.remove(); + media.closest('div').insertBefore(media, parentP); + parentP.remove(); + return true; + }); +} + +function formatPromoButton(el) { + if (!el.classList.contains('promobar')) return; + el.querySelectorAll('.action-area').forEach((aa) => { + aa.querySelectorAll('.con-button').forEach((btn) => { + btn.classList.add('button-l'); + if (!el.classList.contains('popup')) return; + if (!btn.classList.contains('outline')) btn.classList.add('fill'); + }); + }); +} + +function addCloseButton(el) { + const closeBtn = createTag('button', { class: 'promo-close', 'aria-label': 'Close' }, closeSvg); + el.querySelector('.foreground').appendChild(closeBtn); + closeBtn.addEventListener('click', (e) => { + e.target.closest('.section').classList.add('close-sticky-section'); + }); +} + +function addPromobar(sourceEl, parent) { + parent.appendChild(sourceEl.cloneNode(true)); +} + +function checkViewportPromobar(foreground) { + const { children, childElementCount: childCount } = foreground; + if (childCount < 2) addPromobar(children[childCount - 1], foreground); + if (childCount < 3) addPromobar(children[childCount - 1], foreground); +} + +function combineTextBocks(textBlocks, iconArea, viewPort, variant) { + const promobarConfig = { + default: { + 'mobile-up': ['s', 's'], + 'tablet-up': ['s', 's'], + 'desktop-up': ['m', 'l'], + }, + popup: { + 'mobile-up': ['s', 's'], + 'tablet-up': ['l', 'm'], + 'desktop-up': ['xxl', 'xl'], + }, + }; + const textStyle = promobarConfig[variant][viewPort]; + const contentArea = createTag('p', { class: 'content-area' }); + const textArea = createTag('p', { class: 'text-area' }); + textBlocks[0].parentElement.prepend(contentArea); + textBlocks.forEach((textBlock) => { + textArea.appendChild(textBlock); + if (textBlock.nodeName === 'P') { + textBlock.classList.add(`body-${textStyle[1]}`); + } else { + textBlock.classList.add(`heading-${textStyle[0]}`); + } + }); + if (iconArea) { + if (iconArea.innerText?.trim()) iconArea.classList.add('detail-xs'); + iconArea.classList.add('icon-area'); + contentArea.appendChild(iconArea); + } + contentArea.appendChild(textArea); +} + +function decoratePromobar(el) { + const viewports = ['mobile-up', 'tablet-up', 'desktop-up']; + const foreground = el.querySelector('.foreground'); + const variant = el.classList.contains('popup') ? 'popup' : 'default'; + if (foreground.childElementCount !== 3) checkViewportPromobar(foreground); + [...foreground.children].forEach((child, index) => { + child.className = viewports[index]; + child.classList.add('promo-text'); + const textBlocks = [...child.children]; + const iconArea = child.querySelector('picture')?.closest('p'); + const actionArea = child.querySelectorAll('em a, strong a, p > a strong'); + if (iconArea) textBlocks.shift(); + if (actionArea.length) textBlocks.pop(); + if (!(textBlocks.length || iconArea || actionArea.length)) child.classList.add('hide-block'); + else if (textBlocks.length) combineTextBocks(textBlocks, iconArea, viewports[index], variant); + }); + if (variant === 'popup' || el.classList.contains('frictionless')) addCloseButton(el); + return foreground; +} + +function decorateLayout(el) { + const elems = el.querySelectorAll(':scope > div'); + if (elems.length > 1) { + decorateBlockBg(el, elems[0]); + } + const foreground = elems[elems.length - 1]; + foreground.classList.add('foreground', 'container'); + if (el.classList.contains('promobar')) return decoratePromobar(el); + if (el.classList.contains('split')) decorateMedia(el); + const text = foreground.querySelector('h1, h2, h3, h4, h5, h6, p')?.closest('div'); + text?.classList.add('text'); + const media = foreground.querySelector(':scope > div:not([class])'); + if (media && !el.classList.contains('notification')) { + media.classList.add('image'); + const video = media.querySelector('video'); + if (video) applyHoverPlay(video); + } + const picture = text?.querySelector('p picture'); + const iconArea = picture ? (picture.closest('p') || createTag('p', null, picture)) : null; + iconArea?.classList.add('icon-area'); + const foregroundImage = foreground.querySelector(':scope > div:not(.text) img')?.closest('div'); + const bgImage = el.querySelector(':scope > div:not(.text):not(.foreground) img')?.closest('div'); + const foregroundMedia = foreground.querySelector(':scope > div:not(.text) video, :scope > div:not(.text) a[href*=".mp4"]')?.closest('div'); + const bgMedia = el.querySelector(':scope > div:not(.text):not(.foreground) video, :scope > div:not(.text):not(.foreground) a[href*=".mp4"]')?.closest('div'); + const image = foregroundImage ?? bgImage; + const asideMedia = foregroundMedia ?? bgMedia ?? image; + const isSplit = el.classList.contains('split'); + const hasMedia = foregroundImage ?? foregroundMedia ?? (isSplit && asideMedia); + if (!hasMedia) el.classList.add('no-media'); + if (asideMedia && !asideMedia.classList.contains('text')) { + asideMedia.classList.add(`${isSplit ? 'split-' : ''}image`); + if (isSplit) { + const position = [...asideMedia.parentNode.children].indexOf(asideMedia); + el.classList.add(`split${!position ? '-right' : '-left'}`); + foreground.parentElement.appendChild(asideMedia); + } + } else if (!iconArea) { + foreground?.classList.add('no-image'); + } + if (el.classList.contains('split') + && (el.classList.contains('medium') || el.classList.contains('large'))) { + decorateIconStack(el); + } + return foreground; +} + +export default function init(el) { + el.classList.add('con-block'); + const blockData = getBlockData(el); + const blockText = decorateLayout(el); + decorateBlockText(blockText, blockData); + decorateStaticLinks(el); + formatPromoButton(el); + if (el.classList.contains('frictionless')) { + if (document.querySelectorAll('.CTAButtons').length) { + linkSectionToModuleStep(el); + editCtaToModuleClick(el); + } else el.closest('.section').classList.add('.sticky-banner-disable'); + } +} diff --git a/libs/styles/styles.css b/libs/styles/styles.css index 335733b636b..4514987e6e8 100644 --- a/libs/styles/styles.css +++ b/libs/styles/styles.css @@ -126,6 +126,9 @@ --icon-size-s: 32px; --icon-size-xs: 24px; --icon-size-xxs: 16px; + + /* z-index */ + --above-all: 9000; /* Used for page tools that overlay page content */ } :root:lang(ar) { diff --git a/libs/utils/utils.js b/libs/utils/utils.js index 2e22650ee23..86dc6c3dc52 100644 --- a/libs/utils/utils.js +++ b/libs/utils/utils.js @@ -34,6 +34,7 @@ const MILO_BLOCKS = [ 'featured-article', 'global-footer', 'global-navigation', + 'graybox', 'footer', 'gnav', 'how-to', diff --git a/test/blocks/graybox/graybox.test.js b/test/blocks/graybox/graybox.test.js new file mode 100644 index 00000000000..d7cc4c8808c --- /dev/null +++ b/test/blocks/graybox/graybox.test.js @@ -0,0 +1,89 @@ +import { readFile } from '@web/test-runner-commands'; +import { expect } from '@esm-bundle/chai'; +import { loadStyle, MILO_EVENTS } from '../../../libs/utils/utils.js'; +import { waitForElement, waitForRemoval } from '../../helpers/waitfor.js'; + +const { default: init } = await import('../../../libs/blocks/graybox/graybox.js'); +await loadStyle('../../../libs/blocks/graybox/graybox.css'); + +describe('Graybox', () => { + before(async () => { + document.body.innerHTML = await readFile({ path: './mocks/graybox.html' }); + await init(document.querySelector('.graybox')); + document.dispatchEvent(new Event(MILO_EVENTS.DEFERRED)); + }); + + it('Displays a graybox dialog', async () => { + const dialogEl = document.querySelector('.graybox-container'); + expect(dialogEl).to.exist; + expect(dialogEl.classList.contains('open')).to.be.true; + }); + + it('Displays a mobile iframe on device button click', async () => { + const dialogEl = document.querySelector('.graybox-container'); + const mobileBtn = dialogEl.querySelector('.graybox-mobile'); + mobileBtn.click(); + await waitForElement('iframe'); + let iframeEl = document.querySelector('iframe'); + expect(iframeEl).to.exist; + + const desktopBtn = dialogEl.querySelector('.graybox-desktop'); + desktopBtn.click(); + await waitForRemoval('iframe'); + iframeEl = document.querySelector('iframe'); + expect(iframeEl).not.to.exist; + + const tabletBtn = dialogEl.querySelector('.graybox-tablet'); + tabletBtn.click(); + await waitForElement('iframe'); + iframeEl = document.querySelector('iframe'); + expect(iframeEl).to.exist; + + desktopBtn.click(); + await waitForRemoval('iframe'); + iframeEl = document.querySelector('iframe'); + expect(iframeEl).not.to.exist; + }); + + it('Can open and close the dialog', async () => { + const dialogEl = document.querySelector('.graybox-container'); + expect(dialogEl.classList.contains('open')).to.be.true; + const toggleBtn = document.querySelector('.gb-toggle'); + toggleBtn.click(); + expect(dialogEl.classList.contains('open')).to.be.false; + toggleBtn.click(); + expect(dialogEl.classList.contains('open')).to.be.true; + }); + + it('Puts an overlay on the entire page', async () => { + expect(document.body.classList.contains('gb-overlay')).to.be.true; + const beforeStyle = window.getComputedStyle(document.body, '::before'); + expect(beforeStyle.backgroundColor).to.equal('rgba(0, 0, 0, 0.45)'); + }); + + it('Does not put an overlay on gb-changed blocks', async () => { + const gbChangedEl = document.querySelector('.gb-changed'); + const gbChangedElStyle = window.getComputedStyle(gbChangedEl); + expect(gbChangedEl?.classList.contains('gb-no-overlay')).to.be.true; + expect(gbChangedElStyle.backgroundColor).to.equal('rgb(255, 255, 255)'); + }); + + it('Does not put an overlay on gb-no-change sections', async () => { + const gbChangedSection = document.querySelector('.section.gb-changed'); + const gbChangedSectionStyle = window.getComputedStyle(gbChangedSection); + expect(gbChangedSection?.classList.contains('gb-no-overlay')).to.be.true; + expect(gbChangedSectionStyle.backgroundColor).to.equal('rgb(255, 255, 255)'); + }); + + it('Can use gb-no-change inside of a gb-changed section', async () => { + const noChangeEl = document.querySelector('.gb-no-change'); + const beforeStyle = window.getComputedStyle(noChangeEl, '::before'); + expect(beforeStyle.backgroundColor).to.equal('rgba(0, 0, 0, 0.45)'); + }); + + it('Can use gb-no-click to disable clicks', async () => { + const noClickEl = document.querySelector('.gb-no-click'); + const noClickElStyle = window.getComputedStyle(noClickEl, '::before'); + expect(noClickElStyle.pointerEvents).to.equal('all'); + }); +}); diff --git a/test/blocks/graybox/mocks/graybox.html b/test/blocks/graybox/mocks/graybox.html new file mode 100644 index 00000000000..38ff28cc80e --- /dev/null +++ b/test/blocks/graybox/mocks/graybox.html @@ -0,0 +1,129 @@ + + +
+
+
+
+
title
+
Project Review - 3/7/24
+
+
+
desc
+
Chuck Norris once roundhouse kicked someone so hard that his foot broke the speed of light, went back in time, and killed Amelia Earhart while she was flying over the Pacific Ocean
+
+
+
+
+
+ + + +
+
+
+
+

Marquee standard small dark

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation.

+

Call to action

+
+
+ + + +
+
+
+

Random text outside of the marquee block.

+

That's what's so funny! I switched glasses when your back was turned! Ha ha! You fool! You fell victim to one of the classic blunders - The most famous of which is "never get involved in a land war in Asia" - but only slightly less well-known is this: "Never go against a Sicilian when death is on the line"! Ha ha ha ha ha ha ha! Ha ha ha ha ha ha ha! Ha ha ha...

+

+ + + +

+

You're the Dread Pirate Roberts, admit it. How may do you think you could handle? You mean you wish to surrender to me? Very well, I accept. But how can you be sure? Will this do? You truly love each other and so you might have been truly happy. Not one couple in a century has that chance, no matter what the story books say.

+
+
+
+ + + +
+
+
+
+

“3D is a crucial part of how we explore the brand in a digital workflow. Adobe Substance 3D Stager takes the barrier of entry out of 3D design by enabling us to skip physical mockups and look at feedback faster. We’ve been able to bring digital design entirely in-house.”

+

Benny Lee

+

Global Manager of Experiential Design, Coca-Cola Company

+
+
+
+

The ability to destroy a planet is insignificant next to the power of the Force. Don't try to frighten us with your sorcerer's ways, Lord Vader. Your sad devotion to that ancient religion has not helped you conjure up the stolen data tapes, or given you clairvoyance enough to find the Rebel's hidden fort. I find your lack of faith disturbing. Enough of this! Vader, release him! As you wish.

+

Did you hear that? They've shut down the main reactor. We'll be destroyed for sure. This is madness! We're doomed! There'll be no escape for the Princess this time. What's that? Artoo! Artoo-Detoo, where are you? At last! Where have you been? They're heading in this direction.

+
+
+

This Section is graybox-changed

+
+
+
+

+ + + +

+

Body S Regular 2-line 36 CC

+
+
+
+
+
+
This text block has gb-no-chage inside of a gb-changed section.
+
+
+
+
+

How to compress a PDF online

+

Note that there is no JSONLD schema saved and the image (svg in this case) is part of the header

+

https://main--milo--adobecom.hlx.page/assets/img/compress-pdf-how-to-400x240.svg

+
+
+
+
+
    +
  • Click the Select a file button above or drag and drop files into the drop zone.
  • +
  • Select the PDF file you want to make smaller.
  • +
  • After uploading, Acrobat will automatically reduce the PDF size.
  • +
  • Download your compressed PDF file or sign in to share it.
  • +
+
+
+
+ +
+
+
+
+
+

“This was our opportunity to be one of the first teams to delve into Adobe Experience Platform, and we wanted to show people just how powerful it can be.”

+

Ron Nagy

+

Sr. Evangelist, Adobe@Adobe

+
+
+
+
+
+
+

Text - This is graybox-changed!

+

Kick things off with hundreds of premium and free presets you can access with your Lightroom subscription.

+

Learn more Explore the premium collection

+
+
+
+
+
+
+ diff --git a/test/blocks/quiz-entry/mocks/mock-data.js b/test/blocks/quiz-entry/mocks/mock-data.js index 01d7a933d6c..e317479c83a 100644 --- a/test/blocks/quiz-entry/mocks/mock-data.js +++ b/test/blocks/quiz-entry/mocks/mock-data.js @@ -100,7 +100,7 @@ const resultsMock = { options: 'photo', title: 'Photography', text: 'Edit or organize my photos', - icon: '', + icon: 'https://milo.adobe.com/drafts/quiz/quiz-ai/search.svg', image: 'https://main--milo--adobecom.hlx.page/drafts/colloyd/quiz-entry/images/photography.png', }, { @@ -664,7 +664,7 @@ const resultsMock = { }, { options: 'video', - next: 'q-rather,q-video', + next: 'RESET', type: 'card', endpoint: '', 'api-key': '', diff --git a/test/blocks/quiz-entry/quiz-entry.test.js b/test/blocks/quiz-entry/quiz-entry.test.js index 993ee21594c..d1de93beb24 100644 --- a/test/blocks/quiz-entry/quiz-entry.test.js +++ b/test/blocks/quiz-entry/quiz-entry.test.js @@ -3,7 +3,7 @@ import { readFile } from '@web/test-runner-commands'; import { expect } from '@esm-bundle/chai'; import sinon from 'sinon'; import init from '../../../libs/blocks/quiz-entry/quiz-entry.js'; -import { getSuggestions } from '../../../libs/blocks/quiz-entry/quizPopover.js'; // Correct the path as needed +import { getSuggestions } from '../../../libs/blocks/quiz-entry/quizPopover.js'; let fetchStub; let quizEntryElement; @@ -156,4 +156,147 @@ describe('Quiz Entry Component', () => { await new Promise((resolve) => setTimeout(resolve, 100)); expect(continueButton.classList.contains('disabled')).to.be.false; }); + it('should navigate the carousel using keyboard commands', async () => { + const options = document.querySelectorAll('.quiz-option'); + const option = document.querySelector('.quiz-option'); + option.click(); + await new Promise((resolve) => setTimeout(resolve, 100)); + const carousel = document.querySelector('.quiz-options-container'); + const rightArrowEvent = new KeyboardEvent('keydown', { key: 'ArrowRight' }); + const leftArrowEvent = new KeyboardEvent('keydown', { key: 'ArrowLeft' }); + carousel.dispatchEvent(rightArrowEvent); + await new Promise((resolve) => setTimeout(resolve, 100)); + carousel.dispatchEvent(leftArrowEvent); + await new Promise((resolve) => setTimeout(resolve, 100)); + const leftArrow = document.querySelector('.carousel-arrow.arrow-prev'); + expect(leftArrow).to.not.exist; + + const tabKeyEvent = new KeyboardEvent('keydown', { key: 'Tab' }); + option.dispatchEvent(tabKeyEvent); + await new Promise((resolve) => setTimeout(resolve, 100)); + expect(option.classList.contains('selected')).to.be.true; + + const spaceKeyEvent = new KeyboardEvent('keydown', { key: ' ', keyCode: 32 }); + carousel.dispatchEvent(spaceKeyEvent); + await new Promise((resolve) => setTimeout(resolve, 100)); + + const enterKeyEvent = new KeyboardEvent('keydown', { + key: 'Enter', + code: 'Enter', + keyCode: 13, + }); + carousel.dispatchEvent(enterKeyEvent); + await new Promise((resolve) => setTimeout(resolve, 100)); + expect(options[1].classList.contains('selected')).to.be.false; + }); +}); + +describe('RTL Quiz Entry', () => { + beforeEach(async () => { + window.lana = { log: sinon.stub() }; + fetchStub = sinon.stub(window, 'fetch'); + fetchStub.resolves({ + ok: true, + json: () => Promise.resolve({ suggested_completions: ['designer desk', 'design logos'] }), + }); + document.body.innerHTML = await readFile({ path: './mocks/index.html' }); + document.documentElement.setAttribute('dir', 'rtl'); + quizEntryElement = document.querySelector('.quiz-entry'); + await init(quizEntryElement, quizConfig); + await new Promise((resolve) => setTimeout(resolve, 100)); + }); + + afterEach(() => { + sinon.restore(); + }); + + it('should navigate the carousel using keyboard commands', async () => { + const options = document.querySelectorAll('.quiz-option'); + const option = document.querySelector('.quiz-option'); + option.click(); + await new Promise((resolve) => setTimeout(resolve, 100)); + const carousel = document.querySelector('.quiz-options-container'); + const rightArrowEvent = new KeyboardEvent('keydown', { key: 'ArrowRight' }); + const leftArrowEvent = new KeyboardEvent('keydown', { key: 'ArrowLeft' }); + carousel.dispatchEvent(rightArrowEvent); + await new Promise((resolve) => setTimeout(resolve, 100)); + carousel.dispatchEvent(leftArrowEvent); + await new Promise((resolve) => setTimeout(resolve, 100)); + const leftArrow = document.querySelector('.carousel-arrow.arrow-prev'); + expect(leftArrow).to.exist; + + const tabKeyEvent = new KeyboardEvent('keydown', { key: 'Tab' }); + option.dispatchEvent(tabKeyEvent); + await new Promise((resolve) => setTimeout(resolve, 100)); + expect(option.classList.contains('selected')).to.be.false; + + const spaceKeyEvent = new KeyboardEvent('keydown', { key: ' ', keyCode: 32 }); + carousel.dispatchEvent(spaceKeyEvent); + await new Promise((resolve) => setTimeout(resolve, 100)); + + const enterKeyEvent = new KeyboardEvent('keydown', { + key: 'Enter', + code: 'Enter', + keyCode: 13, + }); + carousel.dispatchEvent(enterKeyEvent); + await new Promise((resolve) => setTimeout(resolve, 100)); + expect(options[1].classList.contains('selected')).to.be.false; + }); +}); + +describe('ML Result Trigger', () => { + beforeEach(async () => { + window.lana = { log: sinon.stub() }; + fetchStub = sinon.stub(window, 'fetch'); + const mockApiResponse = { + statusCode: 200, + data: { + data: [ + { + ficode: 'illustrator_cc', + prob: '0.33', + }, + { + ficode: 'indesign_cc', + prob: '0.27', + }, + { + ficode: 'free_spark', + prob: '0.22', + }, + ], + jobName: '', + }, + }; + fetchStub.resolves({ + ok: true, + json: () => Promise.resolve(mockApiResponse.data), + }); + document.body.innerHTML = await readFile({ path: './mocks/index.html' }); + quizEntryElement = document.querySelector('.quiz-entry'); + await init(quizEntryElement, quizConfig); + await new Promise((resolve) => setTimeout(resolve, 100)); + }); + + afterEach(() => { + sinon.restore(); + }); + + it('Should trigger results fetching scenario', async () => { + const mlInputField = document.querySelector('#quiz-input'); + const testInput = 'design'; + const inputEvent = new Event('input', { bubbles: true }); + mlInputField.value = testInput; + mlInputField.dispatchEvent(inputEvent); + await new Promise((resolve) => setTimeout(resolve, 100)); + + const enterKeyEvent = new KeyboardEvent('keypress', { + key: 'Enter', + code: 'Enter', + keyCode: 13, + }); + mlInputField.dispatchEvent(enterKeyEvent); + expect(mlInputField.value).to.equal('design'); + }); }); diff --git a/test/blocks/quiz-entry/utils.test.js b/test/blocks/quiz-entry/utils.test.js new file mode 100644 index 00000000000..700f349907f --- /dev/null +++ b/test/blocks/quiz-entry/utils.test.js @@ -0,0 +1,149 @@ +/* eslint-disable no-promise-executor-return */ +import { readFile } from '@web/test-runner-commands'; +import { expect } from '@esm-bundle/chai'; +import sinon from 'sinon'; +import { handleNext, getQuizJson, handleSelections, getQuizEntryData } from '../../../libs/blocks/quiz-entry/utils.js'; // Correct the path as needed + +let fetchStub; +const { default: mockData } = await import('./mocks/mock-data.js'); +const mockQuestionsData = mockData.questions; +const mockStringsData = mockData.strings; +const quizConfig = { + quizPath: '/drafts/quiz/', + maxQuestions: 1, + analyticsQuiz: 'uarv4', + analyticsType: 'cc:app-reco', + questionData: undefined, + stringsData: undefined, +}; +const selectedQuestion = { + questions: 'q-category', + 'max-selections': '3', + 'min-selections': '1', +}; +const userInputSelections = { photo: true }; +const userInputSelectionsNot = { '3d': true }; +const userInputSelectionsReset = { video: true }; + +const userFlow = []; +const nextFlow = { nextFlow: ['q-rather', 'q-photo'] }; +const nextFlowNot = { nextFlow: ['q-3d'] }; +const nextFlowReset = { nextFlow: [] }; +const prevSelections = []; +const selections = ['photo']; +const nextSelectionsExpected = { + nextSelections: [ + { + selectedCards: [ + 'photo', + ], + selectedQuestion: { + 'max-selections': '3', + 'min-selections': '1', + questions: 'q-category', + }, + }, + ], +}; + +describe('Quiz Entry Utils', () => { + beforeEach(async () => { + window.lana = { log: sinon.stub() }; + fetchStub = sinon.stub(window, 'fetch'); + fetchStub.resolves({ + ok: true, + json: () => Promise.resolve(mockData), + }); + }); + + afterEach(() => { + sinon.restore(); + }); + + it('should handle the next flow of questions', async () => { + const nextQuestion = handleNext( + mockQuestionsData, + selectedQuestion, + userInputSelections, + userFlow, + ); + expect(nextQuestion).to.deep.equal(nextFlow); + }); + + it('should handle the next flow of questions with not()', async () => { + const nextQuestion = handleNext( + mockQuestionsData, + selectedQuestion, + userInputSelectionsNot, + userFlow, + ); + expect(nextQuestion).to.deep.equal(nextFlowNot); + }); + + it('should handle the next flow of questions with reset()', async () => { + const nextQuestion = handleNext( + mockQuestionsData, + selectedQuestion, + userInputSelectionsReset, + userFlow, + ); + expect(nextQuestion).to.deep.equal(nextFlowReset); + }); + + it('should fetch quiz data', async () => { + const [questions, strings] = await getQuizJson('./mocks/'); + expect(questions.questions).to.deep.equal(mockQuestionsData); + expect(strings.strings).to.deep.equal(mockStringsData); + }); +}); + +describe('Quiz Entry Utils failed request', () => { + beforeEach(async () => { + window.lana = { log: sinon.stub() }; + fetchStub = sinon.stub(window, 'fetch'); + fetchStub.resolves({ ok: false }); + }); + + afterEach(() => { + sinon.restore(); + }); + + it('should log an error when fetching quiz data fails', async () => { + await getQuizJson('./mocks/'); + expect(window.lana.log.called).to.be.true; + }); + it('should return nextSelections on handleSelections', async () => { + const nextSelections = handleSelections(prevSelections, selectedQuestion, selections); + expect(nextSelections).to.deep.equal(nextSelectionsExpected); + }); + + it('should de-dup any existing data if they use the ml field and cards.', async () => { + const prevSelectionsLength = [{ + selectedQuestion: { + 'max-selections': '3', + 'min-selections': '1', + questions: 'q-category', + }, + }]; + + const selectedQuestionPrev = [{ + selectedQuestion: { + 'max-selections': '3', + 'min-selections': '1', + questions: 'q-category', + }, + }]; + + const nextSelections = handleSelections(prevSelectionsLength, selectedQuestionPrev, selections); + await new Promise((resolve) => setTimeout(resolve, 100)); + expect(nextSelections).to.deep.equal(nextSelections); + }); + + it('should return quizPath, maxQuestions, analyticsQuiz, analyticsType, questionData', async () => { + document.body.innerHTML = await readFile({ path: './mocks/index.html' }); + const el = document.querySelector('.quiz-entry'); + + const quizEntryData = await getQuizEntryData(el); + expect(quizEntryData).to.deep.equal(quizConfig); + }); +}); From a22f8161e7a9d830c577311ee2b6a06ade35edf5 Mon Sep 17 00:00:00 2001 From: James Tsay <65299136+TsayAdobe@users.noreply.github.com> Date: Thu, 16 May 2024 06:16:13 -0700 Subject: [PATCH 3/3] MWPW-147527 Fix JP text issue in Review component (#2268) * Fix JP text issue in Review component * Clear ESLint --- .../review/components/review/RatingSummary.js | 27 +++++++--- test/blocks/review/mocks/body_jp.html | 54 +++++++++++++++++++ test/blocks/review/mocks/head.html | 3 ++ test/blocks/review/review_jp.test.js | 49 +++++++++++++++++ 4 files changed, 126 insertions(+), 7 deletions(-) create mode 100644 test/blocks/review/mocks/body_jp.html create mode 100644 test/blocks/review/mocks/head.html create mode 100644 test/blocks/review/review_jp.test.js diff --git a/libs/blocks/review/components/review/RatingSummary.js b/libs/blocks/review/components/review/RatingSummary.js index dd4ab4010dc..8bd6e07716a 100644 --- a/libs/blocks/review/components/review/RatingSummary.js +++ b/libs/blocks/review/components/review/RatingSummary.js @@ -1,4 +1,5 @@ -import { html } from '../../../../deps/htm-preact.js'; +/* eslint-disable react-hooks/rules-of-hooks */ +import { html, useRef } from '../../../../deps/htm-preact.js'; function RatingSummary({ averageRating = 0, @@ -11,17 +12,29 @@ function RatingSummary({ if (!averageRating) return html`
`; + const spanAverage = useRef(html` + ${averageRatingRounded} + `); + const spanMax = useRef(html` + ${maxRating} + `); + const spanTotalReviews = useRef(html` + ${totalReviews} + `); + const spanVote = useRef(html` + + ${totalReviews === 1 ? reviewString : reviewStringPlural} + + `); // placeholder return html`
- ${averageRatingRounded} + ${spanAverage.current} / - ${maxRating} + ${spanMax.current} - - ${totalReviews} - - ${totalReviews === 1 ? reviewString : reviewStringPlural} - + ${spanTotalReviews.current} + ${spanVote.current}
`; } diff --git a/test/blocks/review/mocks/body_jp.html b/test/blocks/review/mocks/body_jp.html new file mode 100644 index 00000000000..0336efec49f --- /dev/null +++ b/test/blocks/review/mocks/body_jp.html @@ -0,0 +1,54 @@ +
+
+
+
+
Review url
+
https://main--helixdemo--nkthakur48.hlx.page/data/review
+
+
+
Title
+
私たちのツールをぜひ評価してください。いただいた評価が開発チームの原動力となります。
+
+
+
Hide title
+
true
+
+
+
Rating verb
+
投票する, 件の評価
+
+
+
Rating noun
+
星, 星
+
+
+
Comment placeholder
+
フィードバックをお聞かせください
+
+
+
Comment field label
+
レビューのフィードバック
+
+
+
Submit text
+
送信
+
+
+
Thank you text
+
アンケートにご協力いただき、誠にありがとうございました。
+
+
+
Tooltips
+
悪い, 平均以下, 良い, 非常に良い, 優れている
+
+
+
Tooltip delay
+
5
+
+
+
Initial Value
+
0
+
+
+
+
diff --git a/test/blocks/review/mocks/head.html b/test/blocks/review/mocks/head.html new file mode 100644 index 00000000000..026913447a5 --- /dev/null +++ b/test/blocks/review/mocks/head.html @@ -0,0 +1,3 @@ + + + diff --git a/test/blocks/review/review_jp.test.js b/test/blocks/review/review_jp.test.js new file mode 100644 index 00000000000..b6e3eb17e51 --- /dev/null +++ b/test/blocks/review/review_jp.test.js @@ -0,0 +1,49 @@ +import sinon from 'sinon'; +import { readFile } from '@web/test-runner-commands'; +import { expect } from '@esm-bundle/chai'; +import { waitForElement, delay } from '../../helpers/waitfor.js'; +import { getConfig, updateConfig, loadArea } from '../../../libs/utils/utils.js'; + +describe('Review Component for JP', () => { + beforeEach(async () => { + const config = getConfig(); + updateConfig({ ...config, base: '/libs', codeRoot: '/libs', locale: { ietf: 'ja-JP', tk: '', prefix: 'jp' } }); + document.head.innerHTML = await readFile({ path: './mocks/head.html' }); + document.body.innerHTML = await readFile({ path: './mocks/body_jp.html' }); + window.s_adobe = { visitor: { getMarketingCloudVisitorID: () => 'abcd' } }; + sinon.stub(window, 'fetch').resolves( + new Response(JSON.stringify({ + total: 4, + offset: 0, + limit: 4, + data: [ + { country: 'all', total: '17', average: '3.5' }, + { country: 'en', total: '6', average: '3.3' }, + { country: 'fr', total: '3', average: '3.3' }, + { country: 'de', total: '3', average: '3.3' }, + ], + ':type': 'sheet', + }), { + status: 200, + headers: { 'Content-type': 'application/json' }, + }), + ); + await loadArea(); + }); + + afterEach(() => { + sinon.restore(); + }); + + it('should show JP text correctly', async () => { + const review = await waitForElement('.hlx-ReviewWrapper'); + const ratingInputs = review.querySelectorAll('.hlx-Review-ratingFields input'); + await delay(125); + await ratingInputs[2].dispatchEvent(new Event('click')); + await delay(125); + const title = review.querySelector('.hlx-reviewTitle'); + expect(title.textContent).to.equal('私たちのツールをぜひ評価してください。いただいた評価が開発チームの原動力となります。'); + const vote = review.querySelector('.hlx-ReviewStats'); + expect(vote.textContent).to.equal('3.5/5-17 件の評価'); + }); +});