Skip to content

Commit

Permalink
Merge branch 'stage' into dc0944stickybanner
Browse files Browse the repository at this point in the history
  • Loading branch information
robert-bogos authored May 14, 2024
2 parents 98985e3 + 6cb99ae commit d8fc08c
Show file tree
Hide file tree
Showing 3 changed files with 212 additions and 52 deletions.
138 changes: 106 additions & 32 deletions libs/blocks/preflight/panels/accessibility.js
Original file line number Diff line number Diff line change
@@ -1,58 +1,132 @@
import { html, signal, useEffect } from '../../../deps/htm-preact.js';

const DEF_ICON = 'purple';
const DEF_DESC = 'Checking...';
const pass = 'green';
const fail = 'red';
const decorativeImages = signal([]);
const altTextImages = signal([]);
const altResult = signal({ title: 'Image alt value', description: DEF_DESC });
const groups = [
{ title: 'Images with alt text', imgArray: altTextImages },
{ title: 'Decorative images (empty alt text)', imgArray: decorativeImages, closed: true },
];
const filterOptions = [
{ value: '', content: 'All' },
{ value: 'show-main', content: 'Main content', selected: true },
{ value: 'show-gnav', content: 'Gnav' },
{ value: 'show-footer', content: 'Footer' },
];

const content = signal({});
const altResult = signal({ icon: DEF_ICON, title: 'Image alt value', description: DEF_DESC });
function filterGrid(e) {
const imgGrid = e.target.parentElement.parentElement;
filterOptions.forEach((option) => {
if (imgGrid.classList.contains(option.value)) {
imgGrid.classList.remove(option.value);
}
});
if (e.target.value) imgGrid.classList.add(e.target.value);
}

function toggleGrid(e) {
e.preventDefault();
const clickArea = e.target.nodeName === 'SPAN' ? e.target.parentElement.parentElement : e.target.parentElement;
clickArea.classList.toggle('is-closed');
}

function dropdownOptions(props) {
const selected = props.option.selected === true;
return html`
<option value="${props.option.value}" selected="${selected}">${props.option.content}</option>
`;
}

async function checkAlt() {
const main = document.querySelector('main');
const images = main.querySelectorAll('img');
if (altResult.value.checked) return;
// If images are not scoped, tracking pixel/images are picked up.
const images = document.querySelectorAll('header img, main img, footer img');
const result = { ...altResult.value };
const imagesWithoutAlt = [];
if (!images) return;

images.forEach((img) => {
const alt = img.getAttribute('alt');
if (!alt || alt.trim() === '') {
imagesWithoutAlt.push(img.getAttribute('src'));
let parent = '';

if (img.closest('header')) parent = 'gnav';
if (img.closest('main')) parent = 'main-content';
if (img.closest('footer')) parent = 'footer';
if (alt === '') {
img.dataset.altCheck = 'decorative';
decorativeImages.value = [...decorativeImages.value,
{
src: img.getAttribute('src'),
altCheck: img.dataset.altCheck,
parent,
}];
}
if (alt) {
altTextImages.value = [...altTextImages.value,
{
src: img.getAttribute('src'),
alt,
parent,
}];
}
img.dataset.pageLocation = parent;
});
if (!imagesWithoutAlt.length) {
result.icon = pass;
result.description = 'Reason: All images are valid';
} else {
result.icon = fail;
result.description = 'Reason: Alt text missing for the following images:';
}
content.value = imagesWithoutAlt;
altResult.value = result;
result.description = 'All images listed below. Please validate each alt text has been set appropriately. Decorative images have been highlighted in yellow on the page.';
altResult.value = { ...result, checked: true };
}

function AccessibilityItem({ icon, title, description }) {
function AccessibilityItem({ title, description }) {
return html`
<div class="access-item">
<div class="result-icon ${icon}"></div>
<div class=seo-item-text>
<p class=seo-item-title>${title}</p>
<p class=seo-item-description>${description}</p>
<div class=access-item-text>
<p class=access-item-title>${title}</p>
<p class=access-item-description>${description}</p>
</div>
</div>`;
}

function ImageGroups({ group }) {
const setFilterView = filterOptions.find((option) => option.selected === true);
const { imgArray, closed } = group;
return html`
<div class='grid-heading ${closed === true ? 'is-closed' : ''}'>
<a href='#' onClick=${(e) => toggleGrid(e)} class='grid-toggle'>
<span class="preflight-group-expand"></span>
${group.title}
</a>
</div>
${imgArray.value.length > 0 && html`
<div class="access-image-grid ${setFilterView.value}">
<div class="access-image-grid-item filter">
Filter images by:
<select onChange=${(e) => filterGrid(e)} class="image-filter">
${filterOptions.map((option) => html`<${dropdownOptions} option=${option} />`)}
</select>
</div>
${imgArray.value.map((img) => html`
<div class="access-image-grid-item in-${img.parent}">
<img src="${img.src}" />
<span>${!img.altCheck ? `Alt=${img.alt}` : `Marked as ${img.altCheck}`}</span>
<span>Located in ${img.parent}</span>
</div>`)}
</div>`}
${!imgArray.value.length && html`
<div class="access-image-grid">
<div class="access-image-grid-item full-width">No images found</div>
</div>
`}
`;
}

export default function Accessibility() {
useEffect(() => { checkAlt(); }, []);

return html`
<div class="access-columns">
<${AccessibilityItem} icon=${altResult.value.icon} title=${altResult.value.title} description=${altResult.value.description} />
${content.value.length > 0 && html`
<p class="access-image-header">Images</p>
<div class="access-image-grid">
${Object.keys(content.value).map((key) => html`<div class="access-image-grid-item">
<img src="${content.value[key]}"></img></div>`)}
</div>
`}
<${AccessibilityItem} title=${altResult.value.title} description=${altResult.value.description} />
${groups.map((group) => html`<${ImageGroups} group=${group} />`)}
</div>`;
}
122 changes: 105 additions & 17 deletions libs/blocks/preflight/preflight.css
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
:root {
--notch-size: 12px;
--action-color: #FF1593;
}

#preflight .fragment,
Expand Down Expand Up @@ -237,7 +238,7 @@ span.preflight-time {
}

.preflight-action {
background: #FF1593;
background: var(--action-color);
color: #FFF;
font-weight: 700;
outline: transparent solid 0;
Expand Down Expand Up @@ -420,39 +421,126 @@ span.preflight-time {
gap: 48px;
}

.access-columns .grid-heading {
margin-bottom: 20px;
}

.access-columns .grid-heading + .access-columns .grid-heading {
margin-top: 20px;
}

.access-columns .grid-heading.is-closed {
transform: none;
}

.access-columns .grid-toggle {
color: #fff;
font-weight: 700;
text-transform: uppercase;
display: grid;
grid-template-columns: 42px 1fr;
align-items: center;
}

.access-item {
display: grid;
grid-template-columns: auto 1fr;
gap: 12px;
}

.access-item-title {
margin: 0;
font-weight: 700;
font-size: 32px;
line-height: 1;
}

.access-item-description {
margin: 10px 0 48px;
}

.access-image-grid {
display: grid;
grid-template-columns: repeat(5, 1fr);
grid-gap: 20px;
max-width: 100%;
margin: 20px;
margin-left: 72px;
grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
grid-gap: 10px;
margin-bottom: 35px;
width: 100%;
}

.access-image-grid:last-child {
margin-bottom: 0;
}

.access-columns .grid-heading.is-closed + .access-image-grid {
display: none;
}

.access-image-grid-item {
border: solid white 4px;
position: relative;
overflow: hidden;
width: 128px;
height: 128px;
height: auto;
background: rgb(0 0 0 / 20%);
display: flex;
flex-flow: column;
align-items: center;
padding: 10px;
border-radius: 6px;
box-sizing: border-box;
}

.access-image-grid-item img {
.access-image-grid-item.full-width {
width: 100%;
height: 100%;
object-fit: cover;
max-width: initial;
}

.access-image-header {
text-transform: uppercase;
font-weight: 700;
margin-left: 72px;
.access-image-grid .filter {
grid-column: 1 / 5;
align-items: start;
background: none;
display: block;
font-size: 16px;
}

img[data-alt-check] {
border: 5px solid rgb(255 234 2);
box-sizing: border-box;
filter: drop-shadow(8px 8px 18px rgb(199 182 2));
}

img[data-alt-check]::after {
content: attr(data-alt-check);
color: red;
}

.access-image-grid-item span {
font-size: 16px;
font-weight: bold;
margin-top: 10px;
line-height: 1.3rem;
}

.access-image-grid-item span:last-child {
font-weight: initial;
opacity: 0.8;
margin-top: 0;
}

.show-main .access-image-grid-item.in-gnav,
.show-main .access-image-grid-item.in-footer,
.show-gnav .access-image-grid-item.in-main-content,
.show-gnav .access-image-grid-item.in-footer,
.show-footer .access-image-grid-item.in-main-content,
.show-footer .access-image-grid-item.in-gnav {
display: none;
}

.preflight .image-filter {
padding: 3px;
margin-left: 5px;
border-radius: 4px;
}

.preflight .image-filter:focus-visible {
outline-color: var(--action-color);
}

.preflight .martech {
Expand Down
4 changes: 1 addition & 3 deletions tools/send-to-caas/bulk-publish-to-caas.js
Original file line number Diff line number Diff line change
Expand Up @@ -115,9 +115,7 @@ const processData = async (data, accessToken) => {

let domain = `https://${host}`;

if (usePreview) {
domain = `https://main--${repo}--${owner}.hlx.page`;
} else if (publishToFloodgate !== 'default') {
if (usePreview || publishToFloodgate !== 'default') {
domain = `https://main--${repo}--${owner}.hlx.live`;
}

Expand Down

0 comments on commit d8fc08c

Please sign in to comment.