Correcciones de accesibilidad en el código de su tema de Magento
Validiscan corrige los fallos de accesibilidad web en las plantillas .phtml, el XML de layout y las hojas de estilos LESS o CSS de su tema de Magento 2. Nada llega a su tienda en producción hasta que su desarrollador fusione o aplique los cambios y despliegue el tema.
Última actualización:
En esta página: 6 respuestas
¿Qué cambia Validiscan en un tema de Magento?
Validiscan solo cambia los archivos de su tema de frontend de Magento 2, la carpeta que contiene su theme.xml, normalmente en app/design/frontend. Un cambio en cualquier otro archivo no supera la validación y nunca se entrega, y ninguna corrección instala una extensión ni añade un script que reescriba sus páginas en el navegador del visitante.
Las plantillas y los estilos que su tema no sobrescribe proceden de su tema padre, como Luma o Blank, o de los módulos de Magento. Las recetas no copian esos archivos en su tema: cuando un fallo procede de un archivo que su tema no sobrescribe, la receta no hace ningún cambio y el hallazgo queda en manos de una persona. El contenido y los ajustes que usted gestiona en Magento Admin, como las páginas y los bloques CMS, el contenido de Page Builder, la configuración regional de una vista de tienda o los ajustes de HTML Head, no son archivos del tema, así que las correcciones no los cambian. Los elementos incrustados de terceros, como los widgets de pago o de chat, no están incluidos en un proyecto.
Detalles: las carpetas, cómo es un cambio y dónde añaden las recetas sus estilos
Validiscan solo cambia los archivos de su tema de frontend de Magento 2, la carpeta que contiene su theme.xml, normalmente en app/design/frontend: las plantillas .phtml y .html, el XML de layout, el código fuente LESS y las hojas de estilos compiladas de web/css, los scripts de web/js y el archivo de traducción al alemán de i18n. Un cambio en cualquier otro archivo, como el código propio de Magento, una extensión o los archivos generados por una compilación, no supera la validación, y un cambio que no la supera no se puede aprobar, de modo que nunca se entrega.
Cada cambio es una edición corriente de un archivo del tema que su desarrollador puede leer línea por línea. Las reglas de estilo nuevas que añade una corrección van en un bloque al final de la hoja de estilos, entre comentarios que nombran la receta, por ejemplo /* validiscan:. Los cambios más pequeños, como un valor de color corregido o un outline: none eliminado, se hacen donde ya está el código. Las palabras que una corrección añade a una plantilla .phtml pasan por la función de traducción de Magento __() y se escapan igual que el texto propio del tema; en los archivos HTML que el tema guarda en Magento_Cms/content, las recetas usan en su lugar la directiva trans de Magento. Magento guarda las páginas y los bloques CMS en Magento Admin, así que un cambio en uno de estos archivos solo llega a su tienda allí donde su proyecto cargue ese archivo en sus páginas o bloques CMS. Ninguna corrección instala una extensión ni añade un script que reescriba sus páginas en el navegador del visitante, como hace un overlay.
Las recetas del contorno de foco, las zonas táctiles, el enlace para saltar al contenido y los botones nuevos añaden sus reglas de estilo al final de la hoja de estilos principal del tema: su _extend.less o _theme.less en web/css/source, con un _extend.less nuevo cuando un tema basado en Luma o Blank no tiene ninguno de los dos, y también en un web/css/styles-m.css compilado cuando el tema incluye uno. En un tema que no está basado en Luma ni en Blank y no tiene allí fuentes LESS ni ese archivo compilado, las recetas del contorno de foco, las zonas táctiles y los botones no hacen ningún cambio, y la receta del enlace para saltar al contenido añade el enlace sin estilos.
¿Cómo accede Validiscan a su tema de Magento?
Mediante un repositorio de GitHub o un ZIP de la carpeta del tema subido en el portal del cliente, porque Validiscan prepara cada corrección en una copia del código fuente de su tema de Magento. La vía depende de dónde esté el código: un repositorio recibe un pull request y un ZIP, un paquete de parches.
| Vía de acceso | Lo que usted da | Los cambios vuelven como |
|---|---|---|
| A través de su repositorio de GitHub | Acceso al repositorio, que puede contener solo el tema o todo su proyecto de Magento, mediante la GitHub App de Validiscan o un token de acceso | Un pull request |
| Desde un ZIP de la carpeta del tema | La carpeta de su tema en app/, como un único archivo ZIP de hasta 100 MB, que sube en el portal del cliente un administrador de su organización | Un paquete de parches |
A través de su repositorio de GitHub
Si el código de su tema está en un repositorio de GitHub, usted da a Validiscan acceso a ese repositorio. Instala en él la GitHub App de Validiscan o entrega a Validiscan un token de acceso para él. La configuración de Validiscan especifica los permisos de la App como acceso de lectura y escritura al contenido y a los pull requests del repositorio, y acceso de lectura a sus metadatos, y nada más.
El repositorio puede contener solo el tema o todo su proyecto de Magento. Las recetas encuentran el tema por su theme.xml en app/, o en la raíz de un repositorio que contiene solo el tema, junto a su registration.php. Si el repositorio contiene varios temas de frontend, una receta trabaja en el tema en el que se encontró el elemento con el fallo, y no cambia nada cuando no puede saber de qué tema se trata. Un tema situado en otro lugar de un proyecto, por ejemplo como un paquete de Composer en vendor, queda fuera de las rutas que una corrección puede cambiar. Los cambios llegan como un pull request.
Desde un ZIP de la carpeta del tema
Sin un repositorio de GitHub, su desarrollador crea un ZIP del tema. El portal del cliente da esta instrucción: «Pida a su desarrollador un ZIP de la carpeta de su tema en app/design/frontend». Después, un administrador de su organización sube el archivo en el portal del cliente, como un único archivo ZIP de hasta 100 MB. Validiscan prepara los cambios en esa copia de su tema y se los devuelve como un paquete de parches.
Sin ninguna de las dos vías, Validiscan no tiene código que cambiar y no se prepara ninguna corrección.
¿Cómo llegan los cambios a su tienda?
En Magento, los cambios llegan como un pull request o como un paquete de parches, y su desarrollador decide cuándo salen a producción. Validiscan solo entrega cambios que ha revisado y aprobado y no modifica su tienda en producción; la entrega como copia sin publicar del tema usa la biblioteca de temas de Shopify y existe solo para Shopify.
- Validiscan entrega los cambios que ha revisado y aprobado: un pull request en una rama nueva o un paquete de parches para su desarrollador.
- Su desarrollador revisa los cambios. En un pull request, la lista de comprobación pide un entorno de vista previa o de preproducción, no la tienda en producción, y una comprobación de las páginas afectadas, también solo con el teclado.
- Su desarrollador fusiona el pull request o aplica el paquete de parches.
- Su desarrollador compila las hojas de estilos y despliega el tema: los cambios en LESS surten efecto cuando se despliegan los archivos estáticos del tema.
- Cuando los cambios están en producción, un escaneo de verificación vuelve a comprobar las páginas afectadas.
Un pull request
Con acceso a su repositorio, Validiscan crea una rama nueva llamada validiscan/, registra cada corrección en un commit propio y abre un pull request con una tabla resumen, una explicación de cada cambio y una lista de comprobación para la revisión. No se sube nada a su rama predeterminada. La lista de comprobación pide a su desarrollador que despliegue la rama en un entorno de vista previa o de preproducción, no en la tienda en producción, y que compruebe allí las páginas afectadas, también solo con el teclado, antes de fusionarla.
Un paquete de parches
A partir del ZIP subido, Validiscan prepara un archivo zip y se lo envía a su desarrollador. Contiene PATCH.md, con cada cambio y cómo aplicarlo; todos los cambios en un único archivo de parche que se aplica con git apply; un archivo de parche por corrección; los archivos modificados completos y un README.md. Su desarrollador aplica los cambios, los prueba y despliega el tema. Qué contienen un pull request y un paquete de parches
Compilar los estilos
Un tema basado en Luma o Blank guarda sus estilos como código fuente LESS, y Magento los compila en el CSS que sirve. La herramienta de Magento para el despliegue de archivos estáticos, bin/, compila los archivos LESS y publica el resultado, como describe la documentación de Adobe sobre el preprocesamiento de CSS y LESS. Por tanto, los cambios en LESS surten efecto cuando su desarrollador despliega los archivos estáticos del tema modificado. Cuando el tema incluye además un web/css/styles-m.css compilado, Magento sirve ese archivo tal cual, así que las recetas hacen el mismo cambio allí y los dos archivos se mantienen sincronizados. Dónde van las correcciones en un tema de Magento y qué puede deshacer una actualización del tema
¿Qué cambian las recetas en un tema de Magento?
Cada una de las 20 recetas de Validiscan para temas de Magento es un cambio determinista para un tipo de fallo: el mismo código recibe siempre el mismo cambio. Una receta hace un cambio solo donde el código del tema muestra cuál es el cambio correcto; donde no lo muestra, no cambia nada.
Estructura de la página y navegación
-
Idioma de la página según la configuración regional de su tienda html-lang Cuando la sobrescritura de la plantilla raíz en su tema imprime su propio
lango ninguno, la plantilla vuelve a imprimir los atributos propios de Magento, de modo que cada página recibe unlangválido.Magento establece el idioma de una página a partir de la configuración regional de su vista de tienda, por ejemplo
enpara la configuración regionalen_US, y lo imprime mediante su plantilla raíz. Cuando su tema sobrescribe esa plantilla e imprime su propiolang, normalmente el código de configuración regionalen_US, que no es una etiqueta de idioma válida, o ningúnlang, la plantilla vuelve a imprimir los atributos propios de Magento, de modo que cada página recibe unlangválido. Unlangestablecido en el XML de layout con la forma de la configuración regional, comode_DE, pasa a serde-DE. Una página cuyo contenido está en un idioma distinto del de su vista de tienda, como una página legal en alemán en una tienda en inglés, queda en sus manos: sírvala desde una vista de tienda en ese idioma, o marque el idioma en el propio contenido.- Reglas que cubre
-
-
html-has-langAUTO se comprueba mediante vs-lang -
html-lang-validAUTO se comprueba mediante vs-lang -
vs-langAUTO
-
- Tipos de archivo que modifica
-
.phtml
fixes the vs-lang finding in root.phtml and validates Datos de ejemplo app/design/frontend/Validiscan/fixture/Magento_Theme/templates/root.phtml Cambios en app/design/frontend/Validiscan/fixture/Magento_Theme/templates/root.phtml (líneas añadidas: 1; eliminadas: 1)
Cambios en app/design/frontend/Validiscan/fixture/Magento_Theme/templates/root.phtml (líneas añadidas: 1; eliminadas: 1) Línea anterior Línea nueva Cambio Código 15 15 ?> 16 16 <!doctype html> 17 17 <!-- VALIDISCAN-SEEDED vs-lang: root.phtml prints the Magento locale code (en_US) instead of a BCP 47 language tag --> 18 Eliminada <html lang="<?= $block->escapeHtmlAttr($htmlLocale) ?>"> 18 Añadida <html <?= /* @noEscape */ $htmlAttributes ?>> 19 19 <head <?= /* @noEscape */ $headAttributes ?>> 20 20 <?= /* @noEscape */ $requireJs ?> 21 21 <?= /* @noEscape */ $headContent ?> -
Enlace para saltar al contenido, área principal y menús con nombre skip-link-main El enlace de Luma para saltar al contenido y el área
<main>vuelven donde su tema los perdió, y las áreas de navegación sin nombre reciben uno cuando el código muestra su finalidad.El tema Luma de Magento tiene un enlace «Skip to Content» en la parte superior de cada página que lleva al comienzo del contenido principal, y ese contenido es el área
<main>de la página. Un tema puede perder ambos. Cuando el tema ha quitado el enlace en su XML de layout, la receta deshace esa eliminación. Cuando la plantilla de cabecera del propio tema nunca imprime el enlace, la receta lo añade allí con las clases de Luma; si las hojas de estilos del tema lo dejaran sin estilo, la receta añade estilos que lo mantienen oculto hasta que recibe el foco del teclado. Cuando el XML de layout renderiza el contenido principal como otro elemento, como un<div>, vuelve a ser<main>. Las áreas de navegación sin nombre reciben uno que dice qué contienen, como «Main menu», «Footer links» o «Breadcrumbs»; un área cuya finalidad no muestra el código, o que compartiría su nombre con otra, queda en manos de una persona. El contenido que está fuera de la cabecera, del área principal y del pie de página, como una barra de promociones, no se mueve: moverlo es un cambio en su layout que hace su desarrollador en el XML de layout.- Reglas que cubre
-
-
bypassAUTO se comprueba mediante vs-headings-landmarks -
landmark-one-mainAUTO se comprueba mediante vs-headings-landmarks -
regionAUTO -
skip-linkAUTO -
vs-headings-landmarksAUTO -
landmark-uniqueASSISTED
-
- Tipos de archivo que modifica
-
.css.less.phtml.xml
fixes the vs-headings-landmarks finding and validates Datos de ejemplo app/design/frontend/Validiscan/fixture/Magento_Cms/layout/cms_index_index.xml Cambios en app/design/frontend/Validiscan/fixture/Magento_Cms/layout/cms_index_index.xml (líneas añadidas: 1; eliminadas: 1)
Cambios en app/design/frontend/Validiscan/fixture/Magento_Cms/layout/cms_index_index.xml (líneas añadidas: 1; eliminadas: 1) Línea anterior Línea nueva Cambio Código 6 6 <div>, so the home page has no <main> landmark (and, with the page title hidden by 7 7 display:none in _theme.less, no h1 either). 8 8 Fixed variant: keep htmlTag="main"; hide the title visually only (clip), not with display:none. --> 9 Eliminada <referenceContainer name="main.content" htmlTag="div" htmlId="maincontent" htmlClass="page-main"/> 9 Añadida <referenceContainer name="main.content" htmlTag="main" htmlId="maincontent" htmlClass="page-main"/> 10 10 <referenceBlock name="breadcrumbs" remove="true"/> 11 11 </body> 12 12 </page> app/design/frontend/Validiscan/fixture/Magento_Theme/templates/html/footer.phtml Cambios en app/design/frontend/Validiscan/fixture/Magento_Theme/templates/html/footer.phtml (líneas añadidas: 1; eliminadas: 1)
Cambios en app/design/frontend/Validiscan/fixture/Magento_Theme/templates/html/footer.phtml (líneas añadidas: 1; eliminadas: 1) Línea anterior Línea nueva Cambio Código 19 19 ?> 20 20 <!-- VALIDISCAN-SEEDED list + landmark-unique: list items wrapped in a div inside the ul; second unlabelled nav --> 21 21 <?php /* Fixed variant: <nav class="footer-nav" aria-label="Footer links"> with the <li> elements directly in the <ul>. */ ?> 22 Eliminada <nav class="footer-nav"> 22 Añadida <nav class="footer-nav" aria-label="<?= $escaper->escapeHtmlAttr(__('Footer links')) ?>"> 23 23 <ul class="footer links"> 24 24 <div class="footer-col"> 25 25 <?php foreach ($links as $link): ?> app/design/frontend/Validiscan/fixture/Magento_Theme/templates/html/header.phtml Cambios en app/design/frontend/Validiscan/fixture/Magento_Theme/templates/html/header.phtml (líneas añadidas: 1; eliminadas: 0)
Cambios en app/design/frontend/Validiscan/fixture/Magento_Theme/templates/html/header.phtml (líneas añadidas: 1; eliminadas: 0) Línea anterior Línea nueva Cambio Código 13 13 <header class="page-header"> 14 14 <div class="panel wrapper"> 15 15 <div class="panel header"> 16 Añadida <a class="action skip contentarea" href="#contentarea"><span><?= $escaper->escapeHtml(__('Skip to Content')) ?></span></a> 16 17 <!-- VALIDISCAN-SEEDED vs-headings-landmarks: the skip link was removed from the header panel --> 17 18 <?php /* Fixed variant: <a class="action skip contentarea" href="#contentarea"><span>Skip to Content</span></a> */ ?> 18 19 <?php if ($linksMoved): ?> app/design/frontend/Validiscan/fixture/Magento_Theme/templates/html/topmenu.phtml Cambios en app/design/frontend/Validiscan/fixture/Magento_Theme/templates/html/topmenu.phtml (líneas añadidas: 1; eliminadas: 1)
Cambios en app/design/frontend/Validiscan/fixture/Magento_Theme/templates/html/topmenu.phtml (líneas añadidas: 1; eliminadas: 1) Línea anterior Línea nueva Cambio Código 15 15 <div class="section-item-content nav-sections-item-content" id="store.menu" data-role="content"> 16 16 <!-- VALIDISCAN-SEEDED aria-required-children + landmark-unique: menubar whose children are plain list items; nav without a label --> 17 17 <?php /* Fixed variant: <nav ... aria-label="Main menu"> and a plain <ul> (no menubar role). */ ?> 18 Eliminada <nav class="navigation" data-action="navigation"> 18 Añadida <nav class="navigation" data-action="navigation" aria-label="<?= $escaper->escapeHtmlAttr(__('Main menu')) ?>"> 19 19 <ul role="menubar" data-mage-init='{"menu":{"responsive":true,"expanded":true,"position":{"my":"left top","at":"left bottom"}}}'> 20 20 <?php foreach ($items as $item): ?> 21 21 <li class="level0 <?= $escaper->escapeHtmlAttr($item['class']) ?> level-top"><a href="<?= $escaper->escapeUrl($item['url']) ?>" class="level-top"><span><?= $escaper->escapeHtml($item['label']) ?></span></a></li> app/design/frontend/Validiscan/fixture/web/css/source/_theme.less Cambios en app/design/frontend/Validiscan/fixture/web/css/source/_theme.less (líneas añadidas: 24; eliminadas: 0)
Cambios en app/design/frontend/Validiscan/fixture/web/css/source/_theme.less (líneas añadidas: 24; eliminadas: 0) Línea anterior Línea nueva Cambio Código 1264 1264 height: 18px; 1265 1265 stroke-width: 3; 1266 1266 } 1267 Añadida 1268 Añadida /* validiscan:skip-link-main */ 1269 Añadida .action.skip:not(:focus) { 1270 Añadida position: absolute; 1271 Añadida width: 1px; 1272 Añadida height: 1px; 1273 Añadida margin: -1px; 1274 Añadida padding: 0; 1275 Añadida overflow: hidden; 1276 Añadida clip: rect(0 0 0 0); 1277 Añadida white-space: nowrap; 1278 Añadida border: 0; 1279 Añadida } 1280 Añadida .action.skip:focus { 1281 Añadida position: absolute; 1282 Añadida top: 4px; 1283 Añadida left: 4px; 1284 Añadida z-index: 100; 1285 Añadida padding: 8px 12px; 1286 Añadida background: #fff; 1287 Añadida color: #1a1a1a; 1288 Añadida text-decoration: underline; 1289 Añadida } 1290 Añadida /* /validiscan:skip-link-main */ app/design/frontend/Validiscan/fixture/web/css/styles-m.css Cambios en app/design/frontend/Validiscan/fixture/web/css/styles-m.css (líneas añadidas: 24; eliminadas: 0)
Cambios en app/design/frontend/Validiscan/fixture/web/css/styles-m.css (líneas añadidas: 24; eliminadas: 0) Línea anterior Línea nueva Cambio Código 1232 1232 height: 18px; 1233 1233 stroke-width: 3; 1234 1234 } 1235 Añadida 1236 Añadida /* validiscan:skip-link-main */ 1237 Añadida .action.skip:not(:focus) { 1238 Añadida position: absolute; 1239 Añadida width: 1px; 1240 Añadida height: 1px; 1241 Añadida margin: -1px; 1242 Añadida padding: 0; 1243 Añadida overflow: hidden; 1244 Añadida clip: rect(0 0 0 0); 1245 Añadida white-space: nowrap; 1246 Añadida border: 0; 1247 Añadida } 1248 Añadida .action.skip:focus { 1249 Añadida position: absolute; 1250 Añadida top: 4px; 1251 Añadida left: 4px; 1252 Añadida z-index: 100; 1253 Añadida padding: 8px 12px; 1254 Añadida background: #fff; 1255 Añadida color: #1a1a1a; 1256 Añadida text-decoration: underline; 1257 Añadida } 1258 Añadida /* /validiscan:skip-link-main */ -
Un título en cada página document-title-template Se eliminan los títulos vacíos que su tema establece en el XML de layout, de modo que vuelve a aplicarse el título de página propio de Magento.
Magento da a cada página un título propio, como el nombre del producto o de la categoría, o «Search results for:» y el término de búsqueda, con el prefijo o el sufijo definidos para su tienda. Un tema puede sobrescribirlo con un
<title>vacío en el XML de layout, y entonces la página se queda sin título. La receta elimina esos títulos vacíos, de modo que vuelve a aplicarse el título propio de Magento. Los títulos con texto son redacción suya y se dejan como están. Si ningún archivo de layout del tema vacía el título, la receta no cambia nada: el título procede entonces de la propia página y de los ajustes de HTML Head de Magento Admin.- Reglas que cubre
-
-
document-titleAUTO
-
- Tipos de archivo que modifica
-
.xml
removes the blank search results title and validates Datos de ejemplo app/design/frontend/Validiscan/fixture/Magento_CatalogSearch/layout/catalogsearch_result_index.xml Cambios en app/design/frontend/Validiscan/fixture/Magento_CatalogSearch/layout/catalogsearch_result_index.xml (líneas añadidas: 0; eliminadas: 1)
Cambios en app/design/frontend/Validiscan/fixture/Magento_CatalogSearch/layout/catalogsearch_result_index.xml (líneas añadidas: 0; eliminadas: 1) Línea anterior Línea nueva Cambio Código 4 4 <!-- VALIDISCAN-SEEDED document-title: a "hide the SEO title" customisation sets an empty page title, 5 5 so the rendered <title></title> is empty. The visible h1 is set separately by the page.main.title block. 6 6 Fixed variant: <title>Search results for: 'jacket'</title>. --> 7 Eliminada <title> </title> 8 7 </head> 9 8 <body> 10 9 <referenceBlock name="search_result_list" template="Magento_Catalog::product/list.phtml"/> -
Encabezados sin niveles omitidos heading-levels Un encabezado que se salta un nivel sube con los encabezados que lo siguen en su plantilla, cuando el nivel del encabezado anterior se puede leer; un título de página oculto con
display: nonepasa a ocultarse solo visualmente.Un encabezado que se salta un nivel, como un h4 justo después de un h2, sube al nivel siguiente, y los encabezados que lo siguen en la misma plantilla, en su nivel o en uno más profundo, suben con él. Las clases se conservan, así que los estilos que el tema define por clase siguen aplicándose; su desarrollador comprueba los estilos que el tema define por la etiqueta del encabezado. Cuando el nivel del encabezado anterior no se puede leer ni en el escaneo ni en la misma plantilla, el encabezado queda en manos de una persona. Magento imprime el título de cada página como su h1. Un tema que oculta el título de una página con
display: noneelimina el único h1 de la página, así que la receta lo oculta solo visualmente, como ocultan el texto los propios estilos de Magento, y el h1 permanece en el esquema que usan los lectores de pantalla. Un título eliminado en el XML de layout queda en manos de una persona, porque restituirlo cambiaría el aspecto de la página.- Reglas que cubre
-
-
heading-orderAUTO se comprueba mediante vs-headings-landmarks -
page-has-heading-oneAUTO se comprueba mediante vs-headings-landmarks -
vs-headings-landmarksAUTO
-
- Tipos de archivo que modifica
-
.css.html.less
keeps the hidden home page title as the h1 and validates Datos de ejemplo app/design/frontend/Validiscan/fixture/web/css/source/_theme.less Cambios en app/design/frontend/Validiscan/fixture/web/css/source/_theme.less (líneas añadidas: 6; eliminadas: 1)
Cambios en app/design/frontend/Validiscan/fixture/web/css/source/_theme.less (líneas añadidas: 6; eliminadas: 1) Línea anterior Línea nueva Cambio Código 1093 1093 1094 1094 // VALIDISCAN-SEEDED vs-headings-landmarks: the home page title is display:none, so the page has no h1. 1095 1095 .cms-index-index .page-title-wrapper { 1096 Eliminada display: none; 1096 Añadida position: absolute; 1097 Añadida width: 1px; 1098 Añadida height: 1px; 1099 Añadida overflow: hidden; 1100 Añadida clip: rect(0 0 0 0); 1101 Añadida white-space: nowrap; 1097 1102 } 1098 1103 1099 1104 // VALIDISCAN-SEEDED color-contrast: #929292 on white is 3.1:1. app/design/frontend/Validiscan/fixture/web/css/styles-m.css Cambios en app/design/frontend/Validiscan/fixture/web/css/styles-m.css (líneas añadidas: 6; eliminadas: 1)
Cambios en app/design/frontend/Validiscan/fixture/web/css/styles-m.css (líneas añadidas: 6; eliminadas: 1) Línea anterior Línea nueva Cambio Código 1070 1070 } 1071 1071 1072 1072 .cms-index-index .page-title-wrapper { 1073 Eliminada display: none; 1073 Añadida position: absolute; 1074 Añadida width: 1px; 1075 Añadida height: 1px; 1076 Añadida overflow: hidden; 1077 Añadida clip: rect(0 0 0 0); 1078 Añadida white-space: nowrap; 1074 1079 } 1075 1080 1076 1081 .block-promo .info, moves the journal headings from h4 to h3 and validates Datos de ejemplo app/design/frontend/Validiscan/fixture/Magento_Cms/content/home.html Cambios en app/design/frontend/Validiscan/fixture/Magento_Cms/content/home.html (líneas añadidas: 3; eliminadas: 3)
Cambios en app/design/frontend/Validiscan/fixture/Magento_Cms/content/home.html (líneas añadidas: 3; eliminadas: 3) Línea anterior Línea nueva Cambio Código 152 152 <!-- VALIDISCAN-SEEDED vs-headings-landmarks (h2 followed by h4) + vs-link-purpose ("Read more" links to three different pages) --> 153 153 <div class="journal-items"> 154 154 <article class="journal-item"> 155 Eliminada <h4 class="journal-title">Layering for wet autumn days</h4> 155 Añadida <h3 class="journal-title">Layering for wet autumn days</h3> 156 156 <p>How a light shell over a warm mid-layer keeps you dry on the way to work.</p> 157 157 <a class="journal-link" href="/magento/juno-jacket.html">Read more</a> 158 158 </article> 159 159 <article class="journal-item"> 160 Eliminada <h4 class="journal-title">Caring for technical shells</h4> 160 Añadida <h3 class="journal-title">Caring for technical shells</h3> 161 161 <p>Washing, drying and re-proofing: three steps that keep a rain shell working for years.</p> 162 162 <a class="journal-link" href="/magento/nadia-elements-shell.html">Read more</a> 163 163 </article> 164 164 <article class="journal-item"> 165 Eliminada <h4 class="journal-title">Running through the dark season</h4> 165 Añadida <h3 class="journal-title">Running through the dark season</h3> 166 166 <p>Reflective details, lights and route planning for early morning runs.</p> 167 167 <a class="journal-link" href="/magento/ingrid-running-jacket.html">Read more</a> 168 168 </article>
Uso del teclado y foco
-
Un contorno de foco visible focus-visible-styles Un contorno para el foco del teclado, en el color de marca del tema, ajustado hasta un contraste de al menos 3:1 con el fondo de la página.
La hoja de estilos del tema recibe un contorno para el foco del teclado: de 2 píxeles, continuo, a 2 píxeles del elemento, en el color de marca del tema. El color procede de una variable de color de marca o primario; si no la hay, del botón primario y, en su defecto, del color de los enlaces, y se ajusta hasta que tiene un contraste de al menos 3:1 con el fondo de la página. Las zonas con un fondo propio, como una barra superior oscura, reciben un color de contorno que tiene ese contraste allí. Las reglas del tema que quitan el contorno de los enlaces, los botones y otros controles al recibir el foco se eliminan, salvo que muestren el foco de otra manera, como un borde o una sombra.
- Reglas que cubre
-
-
vs-focus-visibleAUTO
-
- Tipos de archivo que modifica
-
.css.less
adds the outline, removes the outline: none rule and validates Datos de ejemplo app/design/frontend/Validiscan/fixture/web/css/source/_theme.less Cambios en app/design/frontend/Validiscan/fixture/web/css/source/_theme.less (líneas añadidas: 10; eliminadas: 12)
Cambios en app/design/frontend/Validiscan/fixture/web/css/source/_theme.less (líneas añadidas: 10; eliminadas: 12) Línea anterior Línea nueva Cambio Código 1079 1079 color: #fff; 1080 1080 } 1081 1081 1082 Eliminada // VALIDISCAN-SEEDED vs-focus-visible: the theme removes the focus ring from links and actions. 1083 Eliminada .navigation a:focus, 1084 Eliminada .header.links a:focus, 1085 Eliminada .product-item-link:focus, 1086 Eliminada .footer a:focus, 1087 Eliminada .action:focus, 1088 Eliminada .logo:focus, 1089 Eliminada .block-promo:focus, 1090 Eliminada .journal-link:focus { 1091 Eliminada outline: none; 1092 Eliminada } 1093 Eliminada 1094 1082 // VALIDISCAN-SEEDED vs-headings-landmarks: the home page title is display:none, so the page has no h1. 1095 1083 .cms-index-index .page-title-wrapper { 1096 1084 display: none; 1264 1252 height: 18px; 1265 1253 stroke-width: 3; 1266 1254 } 1255 Añadida 1256 Añadida /* validiscan:focus-visible-styles */ 1257 Añadida :focus-visible { 1258 Añadida outline: 2px solid #1979c3; 1259 Añadida outline-offset: 2px; 1260 Añadida } 1261 Añadida .panel.wrapper :focus-visible { 1262 Añadida outline-color: #a1d0f3; 1263 Añadida } 1264 Añadida /* /validiscan:focus-visible-styles */ app/design/frontend/Validiscan/fixture/web/css/styles-m.css Cambios en app/design/frontend/Validiscan/fixture/web/css/styles-m.css (líneas añadidas: 10; eliminadas: 11)
Cambios en app/design/frontend/Validiscan/fixture/web/css/styles-m.css (líneas añadidas: 10; eliminadas: 11) Línea anterior Línea nueva Cambio Código 1058 1058 color: #fff; 1059 1059 } 1060 1060 1061 Eliminada .navigation a:focus, 1062 Eliminada .header.links a:focus, 1063 Eliminada .product-item-link:focus, 1064 Eliminada .footer a:focus, 1065 Eliminada .action:focus, 1066 Eliminada .logo:focus, 1067 Eliminada .block-promo:focus, 1068 Eliminada .journal-link:focus { 1069 Eliminada outline: none; 1070 Eliminada } 1071 Eliminada 1072 1061 .cms-index-index .page-title-wrapper { 1073 1062 display: none; 1074 1063 } 1232 1221 height: 18px; 1233 1222 stroke-width: 3; 1234 1223 } 1224 Añadida 1225 Añadida /* validiscan:focus-visible-styles */ 1226 Añadida :focus-visible { 1227 Añadida outline: 2px solid #1979c3; 1228 Añadida outline-offset: 2px; 1229 Añadida } 1230 Añadida .panel.wrapper :focus-visible { 1231 Añadida outline-color: #a1d0f3; 1232 Añadida } 1233 Añadida /* /validiscan:focus-visible-styles */ -
Un orden de tabulación que sigue el orden de la página remove-positive-tabindex Una vez que un elemento notificado lleva un
tabindexmayor que 0, todotabindexpositivo fijo de las plantillas del tema se elimina o se pone a 0.Un
tabindexmayor que 0 lleva un elemento al principio del orden del teclado. Estos valores solo funcionan en relación unos con otros en toda la página, así que, una vez que se demuestra que un elemento notificado lleva uno en las plantillas del tema, la receta elimina todotabindexpositivo fijo de las plantillas del tema, también en elementos que el hallazgo no enumeraba. Los enlaces, los botones y los campos de formulario pierden el atributo; los demás elementos recibentabindex="0", de modo que siguen siendo alcanzables y la tecla Tab recorre la página en su orden. Untabindexque calcula el código PHP queda en manos de una persona. La comprobaciónvs-focus-orderde Validiscan también notifica el foco que salta por la página por otros motivos, como un contenido que sus estilos colocan en otro lugar; es MANUAL, así que sus hallazgos vienen con orientación, no con este cambio.- Reglas que cubre
-
-
tabindexAUTO -
vs-focus-orderMANUAL
-
- Tipos de archivo que modifica
-
.phtml
removes tabindex 1-4 from the login form and the CAPTCHA and validates Datos de ejemplo app/design/frontend/Validiscan/fixture/Magento_Customer/templates/form/captcha-math.phtml Cambios en app/design/frontend/Validiscan/fixture/Magento_Customer/templates/form/captcha-math.phtml (líneas añadidas: 1; eliminadas: 1)
Cambios en app/design/frontend/Validiscan/fixture/Magento_Customer/templates/form/captcha-math.phtml (líneas añadidas: 1; eliminadas: 1) Línea anterior Línea nueva Cambio Código 14 14 <div class="field captcha required" role="group" aria-labelledby="captcha-question" data-captcha-type="math"> 15 15 <label for="captcha_user_login" class="label" id="captcha-question"><span><?= $escaper->escapeHtml(__('Security question: what is %1 + %2?', $a, $b)) ?></span></label> 16 16 <div class="control captcha"> 17 Eliminada <input name="captcha[user_login]" type="text" class="input-text required-entry" id="captcha_user_login" autocomplete="off" inputmode="numeric" tabindex="3" data-captcha-answer-hash="<?= $escaper->escapeHtmlAttr(md5((string) ($a + $b))) ?>"> 17 Añadida <input name="captcha[user_login]" type="text" class="input-text required-entry" id="captcha_user_login" autocomplete="off" inputmode="numeric" data-captcha-answer-hash="<?= $escaper->escapeHtmlAttr(md5((string) ($a + $b))) ?>"> 18 18 </div> 19 19 </div> app/design/frontend/Validiscan/fixture/Magento_Customer/templates/form/login.phtml Cambios en app/design/frontend/Validiscan/fixture/Magento_Customer/templates/form/login.phtml (líneas añadidas: 3; eliminadas: 3)
Cambios en app/design/frontend/Validiscan/fixture/Magento_Customer/templates/form/login.phtml (líneas añadidas: 3; eliminadas: 3) Línea anterior Línea nueva Cambio Código 27 27 <div class="field email required"> 28 28 <label class="label" for="email"><span><?= $escaper->escapeHtml(__('Email')) ?></span></label> 29 29 <div class="control"> 30 Eliminada <input name="login[username]" value="<?= $escaper->escapeHtmlAttr($username) ?>" autocomplete="off" id="email" type="email" class="input-text mage-error" title="<?= $escaper->escapeHtmlAttr(__('Email')) ?>" aria-invalid="true" tabindex="1" onpaste="return false;" data-mage-init='{"mage/trim-input":{}}'> 30 Añadida <input name="login[username]" value="<?= $escaper->escapeHtmlAttr($username) ?>" autocomplete="off" id="email" type="email" class="input-text mage-error" title="<?= $escaper->escapeHtmlAttr(__('Email')) ?>" aria-invalid="true" onpaste="return false;" data-mage-init='{"mage/trim-input":{}}'> 31 31 <div for="email" generated="true" class="mage-error" id="email-error"><?= $escaper->escapeHtml(__('Please enter a valid email address (Ex: johndoe@domain.com).')) ?></div> 32 32 </div> 33 33 </div> 35 35 <div class="field password required"> 36 36 <label for="pass" class="label"><span><?= $escaper->escapeHtml(__('Password')) ?></span></label> 37 37 <div class="control"> 38 Eliminada <input name="login[password]" type="password" autocomplete="off" class="input-text" id="pass" title="<?= $escaper->escapeHtmlAttr(__('Password')) ?>" tabindex="2" onpaste="return false;" oncopy="return false;"> 38 Añadida <input name="login[password]" type="password" autocomplete="off" class="input-text" id="pass" title="<?= $escaper->escapeHtmlAttr(__('Password')) ?>" onpaste="return false;" oncopy="return false;"> 39 39 </div> 40 40 </div> 41 41 <!-- VALIDISCAN-SEEDED vs-accessible-auth: arithmetic CAPTCHA with no alternative --> 42 42 <?= $block->getChildHtml('form_additional_info') /* math CAPTCHA module: div.field.captcha, input#captcha_user_login tabindex="3" */ ?> 43 43 <div class="actions-toolbar"> 44 Eliminada <div class="primary"><button type="submit" class="action login primary" name="send" id="send2" tabindex="4"><span><?= $escaper->escapeHtml(__('Sign In')) ?></span></button></div> 44 Añadida <div class="primary"><button type="submit" class="action login primary" name="send" id="send2"><span><?= $escaper->escapeHtml(__('Sign In')) ?></span></button></div> 45 45 <div class="secondary"><a class="action remind" href="<?= $escaper->escapeUrl($block->getUrl('contact')) ?>"><span><?= $escaper->escapeHtml(__('Forgot Your Password? Contact us')) ?></span></a></div> 46 46 </div> 47 47 </fieldset>
Zoom y zonas táctiles
-
Zoom permitido en los móviles meta-viewport-zoom La etiqueta viewport del tema pierde
user-scalable=noy cualquiermaximum-scaleinferior a 2, para que los visitantes puedan hacer zoom en la página en el móvil; un valor que calcula el código PHP se enumera para su desarrollador.La receta elimina
user-scalable=noy cualquiermaximum-scaleinferior a 2 de la etiqueta viewport en el XML de layout del tema, comodefault_head_blocks.xml, donde Luma la declara, o en sus plantillas, para que los visitantes puedan hacer zoom en la página en el móvil. Para la regla de buenas prácticasmeta-viewport-largeel límite es 5. Los demás ajustes del viewport se mantienen como estaban. Un valor de viewport que calcula el código PHP se enumera para que lo compruebe su desarrollador. Si la etiqueta que bloquea el zoom no procede del tema, por ejemplo de los ajustes de HTML Head de Magento Admin o de un módulo, la receta no cambia nada.- Reglas que cubre
-
-
meta-viewportAUTO -
meta-viewport-largeAUTO
-
- Tipos de archivo que modifica
-
.xml
removes the zoom block from default_head_blocks.xml and validates Datos de ejemplo app/design/frontend/Validiscan/fixture/Magento_Theme/layout/default_head_blocks.xml Cambios en app/design/frontend/Validiscan/fixture/Magento_Theme/layout/default_head_blocks.xml (líneas añadidas: 1; eliminadas: 1)
Cambios en app/design/frontend/Validiscan/fixture/Magento_Theme/layout/default_head_blocks.xml (líneas añadidas: 1; eliminadas: 1) Línea anterior Línea nueva Cambio Código 3 3 <head> 4 4 <!-- VALIDISCAN-SEEDED meta-viewport: pinch zoom disabled (Luma 2.0-2.3 default kept by the theme). 5 5 Fixed variant: content="width=device-width, initial-scale=1". --> 6 Eliminada <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1.0, user-scalable=no"/> 6 Añadida <meta name="viewport" content="width=device-width, initial-scale=1"/> 7 7 <meta name="format-detection" content="telephone=no"/> 8 8 <css src="css/styles-m.css"/> 9 9 <css src="css/styles-l.css" media="screen and (min-width: 768px)"/> -
Zonas táctiles más grandes target-size-padding Los botones y enlaces que el escaneo encontró demasiado pequeños reciben un tamaño mínimo de 24 × 24 píxeles, mediante clases a las que puede dirigirse la hoja de estilos del tema.
Los botones y enlaces que el escaneo encontró demasiado pequeños, como los iconos de redes sociales o los botones de cantidad, reciben un tamaño mínimo de 24 × 24 píxeles en un bloque al final de la hoja de estilos del tema. El bloque reutiliza los selectores con los que el tema los hizo pequeños, o sus propias clases, y establece un ancho y un alto mínimos, que prevalecen sobre un ancho o un alto menores. Los iconos del interior y la maquetación que los rodea se mantienen como están. Un enlace u otro elemento en línea sin una regla
displaypasa ainline-flex, porque los elementos en línea ignoran un tamaño mínimo. Un control sin una clase a la que pueda dirigirse la hoja de estilos queda en manos de una persona.- Reglas que cubre
-
-
vs-target-sizeAUTO
-
- Tipos de archivo que modifica
-
.css.less
sizes the three flagged controls and validates Datos de ejemplo app/design/frontend/Validiscan/fixture/web/css/source/_theme.less Cambios en app/design/frontend/Validiscan/fixture/web/css/source/_theme.less (líneas añadidas: 9; eliminadas: 0)
Cambios en app/design/frontend/Validiscan/fixture/web/css/source/_theme.less (líneas añadidas: 9; eliminadas: 0) Línea anterior Línea nueva Cambio Código 1264 1264 height: 18px; 1265 1265 stroke-width: 3; 1266 1266 } 1267 Añadida 1268 Añadida /* validiscan:target-size-padding */ 1269 Añadida .social-link, 1270 Añadida .actions-secondary .action, 1271 Añadida .qty-step { 1272 Añadida min-width: 24px; 1273 Añadida min-height: 24px; 1274 Añadida } 1275 Añadida /* /validiscan:target-size-padding */ app/design/frontend/Validiscan/fixture/web/css/styles-m.css Cambios en app/design/frontend/Validiscan/fixture/web/css/styles-m.css (líneas añadidas: 9; eliminadas: 0)
Cambios en app/design/frontend/Validiscan/fixture/web/css/styles-m.css (líneas añadidas: 9; eliminadas: 0) Línea anterior Línea nueva Cambio Código 1232 1232 height: 18px; 1233 1233 stroke-width: 3; 1234 1234 } 1235 Añadida 1236 Añadida /* validiscan:target-size-padding */ 1237 Añadida .social-link, 1238 Añadida .actions-secondary .action, 1239 Añadida .qty-step { 1240 Añadida min-width: 24px; 1241 Añadida min-height: 24px; 1242 Añadida } 1243 Añadida /* /validiscan:target-size-padding */
Movimiento, carruseles y sonido
-
Menos movimiento cuando el visitante lo pide reduced-motion-guard Cuando el dispositivo del visitante pide reducir el movimiento, se desactivan las animaciones, las transiciones de 5 segundos o más y el desplazamiento suave que inician las hojas de estilos del tema.
Cuando el dispositivo del visitante está configurado para reducir el movimiento, un bloque al final de cada hoja de estilos del tema desactiva las animaciones, las transiciones de 5 segundos o más y el desplazamiento suave que inicia esa hoja de estilos, selector por selector. Cuando los propios scripts del tema en
web/jsinician un carrusel con el avance automático activado, el carrusel empieza sin avance automático para esos visitantes. Una regla anidada dentro de otra regla LESS se enumera para su desarrollador. Las animaciones del código propio de Magento o de las extensiones no están en los archivos del tema y necesitan su propia protección.- Reglas que cubre
-
-
vs-motionAUTO
-
- Tipos de archivo que modifica
-
.css.less
guards the badge and slider animations and validates Datos de ejemplo app/design/frontend/Validiscan/fixture/web/css/source/_theme.less Cambios en app/design/frontend/Validiscan/fixture/web/css/source/_theme.less (líneas añadidas: 9; eliminadas: 0)
Cambios en app/design/frontend/Validiscan/fixture/web/css/source/_theme.less (líneas añadidas: 9; eliminadas: 0) Línea anterior Línea nueva Cambio Código 1264 1264 height: 18px; 1265 1265 stroke-width: 3; 1266 1266 } 1267 Añadida 1268 Añadida /* validiscan:reduced-motion-guard */ 1269 Añadida @media (prefers-reduced-motion: reduce) { 1270 Añadida .product-label, 1271 Añadida .slick-track { 1272 Añadida animation: none; 1273 Añadida } 1274 Añadida } 1275 Añadida /* /validiscan:reduced-motion-guard */ app/design/frontend/Validiscan/fixture/web/css/styles-m.css Cambios en app/design/frontend/Validiscan/fixture/web/css/styles-m.css (líneas añadidas: 9; eliminadas: 0)
Cambios en app/design/frontend/Validiscan/fixture/web/css/styles-m.css (líneas añadidas: 9; eliminadas: 0) Línea anterior Línea nueva Cambio Código 1232 1232 height: 18px; 1233 1233 stroke-width: 3; 1234 1234 } 1235 Añadida 1236 Añadida /* validiscan:reduced-motion-guard */ 1237 Añadida @media (prefers-reduced-motion: reduce) { 1238 Añadida .product-label, 1239 Añadida .slick-track { 1240 Añadida animation: none; 1241 Añadida } 1242 Añadida } 1243 Añadida /* /validiscan:reduced-motion-guard */ -
Carruseles que se mueven solo cuando el visitante lo pide slider-pause-control Sin botón de pausa en Magento: el avance automático se desactiva en los carruseles de Page Builder de los archivos del tema, que solo cambian cuando el visitante usa los puntos o las flechas.
En Magento esta receta no añade ningún botón de pausa. El carrusel de Page Builder funciona con los propios scripts de Magento, y un tema no puede darle un botón de pausa sin sobrescribir el código de Magento. La receta usa en su lugar el ajuste del propio carrusel: en todos los carruseles de Page Builder de los archivos del tema que avanzan automáticamente, el avance automático se desactiva, como hace el interruptor «Autoplay» de Page Builder, y se activan las flechas cuando el carrusel no tendría de otro modo ninguna forma de pasar de una diapositiva a otra. Las animaciones CSS infinitas que mueven un carrusel por sí solas se eliminan. Las diapositivas solo cambian entonces cuando el visitante usa los puntos o las flechas: nada se mueve por sí solo, así que no hay nada que poner en pausa. Un carrusel almacenado en la base de datos de Magento no es un archivo del tema: usted desactiva su avance automático con el ajuste «Autoplay» de Page Builder. Un carrusel que los propios scripts del tema inician con avance automático, como uno de Slick o de Swiper, necesita un botón de pausa conectado a ese script, y eso queda en manos de una persona.
- Reglas que cubre
-
-
vs-carouselAUTO
-
- Tipos de archivo que modifica
-
.css.html.less
turns off the Page Builder autoplay and the track animation, and validates Datos de ejemplo app/design/frontend/Validiscan/fixture/Magento_Cms/content/home.html Cambios en app/design/frontend/Validiscan/fixture/Magento_Cms/content/home.html (líneas añadidas: 1; eliminadas: 1)
Cambios en app/design/frontend/Validiscan/fixture/Magento_Cms/content/home.html (líneas añadidas: 1; eliminadas: 1) Línea anterior Línea nueva Cambio Código 3 3 class="pagebuilder-slider slick-slider" 4 4 data-content-type="slider" 5 5 data-appearance="default" 6 Eliminada data-autoplay="true" 6 Añadida data-autoplay="false" 7 7 data-autoplay-speed="3000" 8 8 data-fade="false" 9 9 data-infinite-loop="true" app/design/frontend/Validiscan/fixture/web/css/source/_theme.less Cambios en app/design/frontend/Validiscan/fixture/web/css/source/_theme.less (líneas añadidas: 0; eliminadas: 1)
Cambios en app/design/frontend/Validiscan/fixture/web/css/source/_theme.less (líneas añadidas: 0; eliminadas: 1) Línea anterior Línea nueva Cambio Código 1176 1176 .slick-track { 1177 1177 display: flex; 1178 1178 width: 300%; 1179 Eliminada animation: nw-slider-autoplay 9s ease-in-out infinite; 1180 1179 } 1181 1180 .slick-slide { 1182 1181 flex: 0 0 33.3333%; app/design/frontend/Validiscan/fixture/web/css/styles-m.css Cambios en app/design/frontend/Validiscan/fixture/web/css/styles-m.css (líneas añadidas: 0; eliminadas: 1)
Cambios en app/design/frontend/Validiscan/fixture/web/css/styles-m.css (líneas añadidas: 0; eliminadas: 1) Línea anterior Línea nueva Cambio Código 1147 1147 .slick-track { 1148 1148 display: flex; 1149 1149 width: 300%; 1150 Eliminada animation: nw-slider-autoplay 9s ease-in-out infinite; 1151 1150 } 1152 1151 .slick-slide { 1153 1152 flex: 0 0 33.3333%; -
Sin texto que parpadee ni se desplace remove-blink-marquee Los elementos
<blink>y<marquee>de las plantillas del tema pasan a ser elementos estáticos ytext-decoration: blinksale de las hojas de estilos del tema, de modo que ningún texto se mueve ni parpadea por sí solo.Los elementos
<blink>y<marquee>de las plantillas del tema pasan a ser elementos estáticos con el mismo contenido, las mismas clases y los mismos ids: un<span>para blink y un<div>para marquee. Los atributos propios del marquee, como su velocidad y su dirección de desplazamiento, se eliminan, y también el estilotext-decoration: blinkde las hojas de estilos del tema, de modo que ningún texto se mueve ni parpadea por sí solo.- Reglas que cubre
-
-
blinkAUTO -
marqueeAUTO
-
- Tipos de archivo que modifica
-
.html.phtml
makes an added ticker static and validates Datos de ejemplo app/design/frontend/Validiscan/fixture/Magento_Cms/content/home.html Cambios en app/design/frontend/Validiscan/fixture/Magento_Cms/content/home.html (líneas añadidas: 2; eliminadas: 2)
Cambios en app/design/frontend/Validiscan/fixture/Magento_Cms/content/home.html (líneas añadidas: 2; eliminadas: 2) Línea anterior Línea nueva Cambio Código 1 Eliminada <marquee class="news-ticker" behavior="scroll" direction="left" scrollamount="4"> 1 Añadida <div class="news-ticker"> 2 2 <p>Autumn sale: 20% off all jackets</p> 3 Eliminada </marquee> 3 Añadida </div> 4 4 <!-- VALIDISCAN-SEEDED vs-carousel + vs-motion + aria-hidden-focus: Page Builder slider autoplays (data-autoplay and a CSS animation) with no pause control; hidden slides keep focusable links; dots have no names --> 5 5 <div 6 6 class="pagebuilder-slider slick-slider" app/design/frontend/Validiscan/fixture/Magento_Theme/templates/html/top-promo.phtml Cambios en app/design/frontend/Validiscan/fixture/Magento_Theme/templates/html/top-promo.phtml (líneas añadidas: 1; eliminadas: 1)
Cambios en app/design/frontend/Validiscan/fixture/Magento_Theme/templates/html/top-promo.phtml (líneas añadidas: 1; eliminadas: 1) Línea anterior Línea nueva Cambio Código 5 5 // Fixed variant: moved into the header (header.container) and styled with line-height 1.5, no fixed height. 6 6 ?> 7 7 <!-- VALIDISCAN-SEEDED region + vs-text-spacing: the promo text sits outside every landmark in a fixed 26px-high box --> 8 Eliminada <div class="top-promo"><p class="top-promo-text"><blink><?= $block->escapeHtml(__('Free shipping on orders over €75')) ?></blink><br><?= $block->escapeHtml(__('Free 30-day returns on every jacket')) ?></p></div> 8 Añadida <div class="top-promo"><p class="top-promo-text"><span><?= $block->escapeHtml(__('Free shipping on orders over €75')) ?></span><br><?= $block->escapeHtml(__('Free 30-day returns on every jacket')) ?></p></div> -
Sin sonido que empiece por sí solo mute-autoplay Un vídeo de las plantillas del tema que se reproduce por sí solo se silencia y el audio deja de empezar por sí solo, salvo que el código PHP active la reproducción automática; en Magento la receta no se usa para los hallazgos de
vs-media.Un vídeo de las plantillas del tema que se reproduce por sí solo recibe
mutedyplaysinline, de modo que sigue reproduciéndose en silencio y dentro de la página en los móviles. El audio deja de empezar por sí solo. Los reproductores incrustados de YouTube y Vimeo que empiezan por sí solos pasan a empezar sin sonido. La reproducción automática que activa el código PHP queda en manos de una persona. En un escaneo de Validiscan, el sonido que empieza por sí solo lo notifica la comprobación multimediavs-media, que sustituye a la regla de axe-core que cubre esta receta.vs-media, que también cubre los subtítulos y las transcripciones, es MANUAL, así que en Magento un hallazgo así viene con orientación en lugar de con este cambio.- Reglas que cubre
-
-
no-autoplay-audioAUTO se comprueba mediante vs-media
-
- Tipos de archivo que modifica
-
.phtml
mutes the autoplaying product video and validates Datos de ejemplo app/design/frontend/Validiscan/fixture/Magento_Catalog/templates/product/view/details.phtml Cambios en app/design/frontend/Validiscan/fixture/Magento_Catalog/templates/product/view/details.phtml (líneas añadidas: 1; eliminadas: 1)
Cambios en app/design/frontend/Validiscan/fixture/Magento_Catalog/templates/product/view/details.phtml (líneas añadidas: 1; eliminadas: 1) Línea anterior Línea nueva Cambio Código 44 44 <h3 class="data item title"><?= $escaper->escapeHtml(__('Product video')) ?></h3> 45 45 <!-- VALIDISCAN-SEEDED vs-media: product video without a captions track --> 46 46 <?php /* Fixed variant: <track kind="captions" src="...juno-jacket-care.en.vtt" srclang="en" label="English" default>. */ ?> 47 Eliminada <video class="product-video-player" autoplay loop controls preload="none" width="560" height="315" poster="<?= $escaper->escapeUrl($product->getData('care_video_poster')) ?>"> 47 Añadida <video class="product-video-player" autoplay loop controls preload="none" width="560" height="315" poster="<?= $escaper->escapeUrl($product->getData('care_video_poster')) ?>" muted playsinline> 48 48 <source src="<?= $escaper->escapeUrl($videoUrl) ?>" type="video/mp4"> 49 49 </video> 50 50 <p><?= $escaper->escapeHtml($product->getData('care_video_caption')) ?></p>
Formularios, carrito y contenido incrustado
-
Etiquetas conectadas a sus campos label-association Un texto de etiqueta que ya está en la página antes de un campo se conecta con él, como
<label>o mediantearia-labelledby.Un campo de formulario cuyo texto de etiqueta ya está en la página, antes del campo, se conecta con ese texto. Un
<label>sinforrecibe uno que apunta al campo. Un texto de etiqueta en un<span>o un<strong>, como un texto «Sort By» con la clasesorter-labelde Luma junto al menú de ordenación de una página de categoría, pasa a ser un<label>con las mismas clases. Un texto de etiqueta en un elemento de bloque, como<div class="label">, conserva su elemento HTML y se conecta mediantearia-labelledby. El texto debe estar en un contenedor sin ningún otro campo, de modo que no pueda pertenecer a otro. Los lectores de pantalla leen entonces la etiqueta cuando el campo recibe el foco. Un campo que solo tiene un placeholder queda en manos de una persona, porque redactar una etiqueta es una decisión de contenido.- Reglas que cubre
-
-
labelAUTO se comprueba mediante vs-forms-ecommerce -
select-nameASSISTED -
vs-forms-ecommerceAUTO
-
- Tipos de archivo que modifica
-
.phtml
turns the "Sort By" text into the sorter label and validates Datos de ejemplo app/design/frontend/Validiscan/fixture/Magento_Catalog/templates/product/list/toolbar.phtml Cambios en app/design/frontend/Validiscan/fixture/Magento_Catalog/templates/product/list/toolbar.phtml (líneas añadidas: 1; eliminadas: 1)
Cambios en app/design/frontend/Validiscan/fixture/Magento_Catalog/templates/product/list/toolbar.phtml (líneas añadidas: 1; eliminadas: 1) Línea anterior Línea nueva Cambio Código 12 12 <div class="toolbar-sorter sorter"> 13 13 <!-- VALIDISCAN-SEEDED select-name + vs-forms-ecommerce: the "Sort By" text is a span, not a label for the select --> 14 14 <?php /* Fixed variant: <label class="sorter-label" for="sorter">Sort By</label>. */ ?> 15 Eliminada <span class="sorter-label"><?= $escaper->escapeHtml(__('Sort By')) ?></span> 15 Añadida <label class="sorter-label" for="sorter"><?= $escaper->escapeHtml(__('Sort By')) ?></label> 16 16 <select id="sorter" data-role="sorter" class="sorter-options"> 17 17 <?php foreach ($block->getAvailableOrders() as $key => $order): ?> 18 18 <option value="<?= $escaper->escapeHtmlAttr($key) ?>"<?= $block->isOrderCurrent($key) ? ' selected' : '' ?>><?= $escaper->escapeHtml(__($order)) ?></option> -
Campos de cuenta, dirección y contacto que los navegadores pueden rellenar autocomplete-tokens Los campos de las plantillas del tema que piden datos propios del cliente, en los formularios de dirección, cuenta, inicio de sesión, contacto y boletín informativo, reciben el valor de
autocompletecorrespondiente a lo que piden, salvo que lo escriba el código de la plantilla.Los campos de las plantillas del tema que piden datos propios del cliente, en los formularios de dirección, cuenta, inicio de sesión, contacto y boletín informativo, reciben el valor de
autocompletecorrespondiente a lo que piden, como correo electrónico, nombre, número de teléfono, dirección de la calle, código postal o contraseña. El valor se deduce del tipo, el nombre, el id, la etiqueta, el placeholder y el título del campo, con las mismas reglas que la comprobación de formularios de Validiscan, y los campos de facturación y de envío reciben su sección, como enshipping given-name. Cuando se notifica un campo de un formulario, se tratan todos los campos de ese formulario. Las contraseñas recibennew-passworden los formularios de registro y de restablecimiento y en los formularios con más de un campo de contraseña, ycurrent-passworden los demás. Los campos de cupón, búsqueda, destinatario de un regalo, comentario, cantidad y CAPTCHA nunca reciben un valor. Un valor que escribe el código de la plantilla, o un valor válido que parece erróneo para el campo, queda en manos de una persona.- Reglas que cubre
-
-
autocomplete-validAUTO se comprueba mediante vs-forms-ecommerce -
vs-forms-ecommerceAUTO
-
- Tipos de archivo que modifica
-
.phtml
adds tokens to the newsletter, login and contact forms and validates Datos de ejemplo app/design/frontend/Validiscan/fixture/Magento_Contact/templates/form.phtml Cambios en app/design/frontend/Validiscan/fixture/Magento_Contact/templates/form.phtml (líneas añadidas: 3; eliminadas: 3)
Cambios en app/design/frontend/Validiscan/fixture/Magento_Contact/templates/form.phtml (líneas añadidas: 3; eliminadas: 3) Línea anterior Línea nueva Cambio Código 21 21 <!-- VALIDISCAN-SEEDED vs-forms-ecommerce: name, email and phone lack autocomplete; required only via the CSS asterisk --> 22 22 <div class="field name required"> 23 23 <label class="label" for="name"><span><?= $escaper->escapeHtml(__('Name')) ?></span></label> 24 Eliminada <div class="control"><input name="name" id="name" title="<?= $escaper->escapeHtmlAttr(__('Name')) ?>" value="<?= $escaper->escapeHtmlAttr($viewModel->getUserName()) ?>" class="input-text" type="text"></div> 24 Añadida <div class="control"><input name="name" id="name" title="<?= $escaper->escapeHtmlAttr(__('Name')) ?>" value="<?= $escaper->escapeHtmlAttr($viewModel->getUserName()) ?>" class="input-text" type="text" autocomplete="name"></div> 25 25 </div> 26 26 <div class="field email required"> 27 27 <label class="label" for="email"><span><?= $escaper->escapeHtml(__('Email')) ?></span></label> 28 Eliminada <div class="control"><input name="email" id="email" title="<?= $escaper->escapeHtmlAttr(__('Email')) ?>" value="<?= $escaper->escapeHtmlAttr($viewModel->getUserEmail()) ?>" class="input-text" type="email"></div> 28 Añadida <div class="control"><input name="email" id="email" title="<?= $escaper->escapeHtmlAttr(__('Email')) ?>" value="<?= $escaper->escapeHtmlAttr($viewModel->getUserEmail()) ?>" class="input-text" type="email" autocomplete="email"></div> 29 29 </div> 30 30 <div class="field telephone"> 31 31 <label class="label" for="telephone"><span><?= $escaper->escapeHtml(__('Phone Number')) ?></span></label> 32 Eliminada <div class="control"><input name="telephone" id="telephone" title="<?= $escaper->escapeHtmlAttr(__('Phone Number')) ?>" value="<?= $escaper->escapeHtmlAttr($viewModel->getUserTelephone()) ?>" class="input-text" type="tel"></div> 32 Añadida <div class="control"><input name="telephone" id="telephone" title="<?= $escaper->escapeHtmlAttr(__('Phone Number')) ?>" value="<?= $escaper->escapeHtmlAttr($viewModel->getUserTelephone()) ?>" class="input-text" type="tel" autocomplete="tel"></div> 33 33 </div> 34 34 <div class="field comment required"> 35 35 <label class="label" for="comment"><span><?= $escaper->escapeHtml(__('What’s on your mind?')) ?></span></label> app/design/frontend/Validiscan/fixture/Magento_Customer/templates/form/login.phtml Cambios en app/design/frontend/Validiscan/fixture/Magento_Customer/templates/form/login.phtml (líneas añadidas: 2; eliminadas: 2)
Cambios en app/design/frontend/Validiscan/fixture/Magento_Customer/templates/form/login.phtml (líneas añadidas: 2; eliminadas: 2) Línea anterior Línea nueva Cambio Código 27 27 <div class="field email required"> 28 28 <label class="label" for="email"><span><?= $escaper->escapeHtml(__('Email')) ?></span></label> 29 29 <div class="control"> 30 Eliminada <input name="login[username]" value="<?= $escaper->escapeHtmlAttr($username) ?>" autocomplete="off" id="email" type="email" class="input-text mage-error" title="<?= $escaper->escapeHtmlAttr(__('Email')) ?>" aria-invalid="true" tabindex="1" onpaste="return false;" data-mage-init='{"mage/trim-input":{}}'> 30 Añadida <input name="login[username]" value="<?= $escaper->escapeHtmlAttr($username) ?>" autocomplete="email" id="email" type="email" class="input-text mage-error" title="<?= $escaper->escapeHtmlAttr(__('Email')) ?>" aria-invalid="true" tabindex="1" onpaste="return false;" data-mage-init='{"mage/trim-input":{}}'> 31 31 <div for="email" generated="true" class="mage-error" id="email-error"><?= $escaper->escapeHtml(__('Please enter a valid email address (Ex: johndoe@domain.com).')) ?></div> 32 32 </div> 33 33 </div> 35 35 <div class="field password required"> 36 36 <label for="pass" class="label"><span><?= $escaper->escapeHtml(__('Password')) ?></span></label> 37 37 <div class="control"> 38 Eliminada <input name="login[password]" type="password" autocomplete="off" class="input-text" id="pass" title="<?= $escaper->escapeHtmlAttr(__('Password')) ?>" tabindex="2" onpaste="return false;" oncopy="return false;"> 38 Añadida <input name="login[password]" type="password" autocomplete="current-password" class="input-text" id="pass" title="<?= $escaper->escapeHtmlAttr(__('Password')) ?>" tabindex="2" onpaste="return false;" oncopy="return false;"> 39 39 </div> 40 40 </div> 41 41 <!-- VALIDISCAN-SEEDED vs-accessible-auth: arithmetic CAPTCHA with no alternative --> app/design/frontend/Validiscan/fixture/Magento_Newsletter/templates/subscribe.phtml Cambios en app/design/frontend/Validiscan/fixture/Magento_Newsletter/templates/subscribe.phtml (líneas añadidas: 1; eliminadas: 1)
Cambios en app/design/frontend/Validiscan/fixture/Magento_Newsletter/templates/subscribe.phtml (líneas añadidas: 1; eliminadas: 1) Línea anterior Línea nueva Cambio Código 18 18 <!-- VALIDISCAN-SEEDED vs-forms-ecommerce (label): newsletter email only has a placeholder, no label and no autocomplete --> 19 19 <div class="field newsletter"> 20 20 <div class="control"> 21 Eliminada <input name="email" type="email" id="newsletter" placeholder="<?= $escaper->escapeHtmlAttr(__('Enter your email address')) ?>" data-mage-init='{"mage/trim-input":{}}' data-validate="{required:true, 'validate-email':true}"> 21 Añadida <input name="email" type="email" id="newsletter" placeholder="<?= $escaper->escapeHtmlAttr(__('Enter your email address')) ?>" data-mage-init='{"mage/trim-input":{}}' data-validate="{required:true, 'validate-email':true}" autocomplete="email"> 22 22 </div> 23 23 </div> 24 24 <div class="actions"> -
Cambios de precio, de existencias y del carrito anunciados live-region-cart-variant Los contenedores de las plantillas del tema que reescriben los scripts de Magento, como el bloque de precio y el contador del minicarrito, pasan a ser regiones dinámicas; los scripts no se modifican.
Los propios scripts de Magento reescriben el texto de contenedores fijos cuando un cliente elige una talla o un color, o añade un producto al carrito. La receta convierte esos contenedores de las plantillas del tema en regiones dinámicas, de modo que los lectores de pantalla leen el valor nuevo sin que el cliente tenga que moverse hasta allí. El bloque de precio y el contador del minicarrito se leen completos cuando cambian; el mensaje de existencias y los mensajes de la página, como el aviso de que se ha añadido un producto al carrito, reciben
role="status". Los scripts en sí no se modifican. Cuando el tema marca toda la página como región dinámica, lo que hace que los lectores de pantalla lean en voz alta cada cambio, esa marca se elimina. Cuando esa marca la añade el script de una extensión mientras la página se ejecuta, queda en manos de una persona.- Reglas que cubre
-
-
vs-live-updatesAUTO
-
- Tipos de archivo que modifica
-
.phtml
makes the price box and the stock message live regions and validates Datos de ejemplo app/design/frontend/Validiscan/fixture/Magento_Catalog/templates/product/price/final_price.phtml Cambios en app/design/frontend/Validiscan/fixture/Magento_Catalog/templates/product/price/final_price.phtml (líneas añadidas: 1; eliminadas: 1)
Cambios en app/design/frontend/Validiscan/fixture/Magento_Catalog/templates/product/price/final_price.phtml (líneas añadidas: 1; eliminadas: 1) Línea anterior Línea nueva Cambio Código 13 13 // Fixed variant: the product-page box carries aria-live="polite" aria-atomic="true" and the stock 14 14 // message (product/view/type/default.phtml) is role="status". 15 15 ?> 16 Eliminada <div class="price-box price-final_price" data-role="priceBox" data-product-id="<?= (int) $product->getId() ?>" data-price-box="product-id-<?= (int) $product->getId() ?>"<?php if ($isProductPage): ?> data-base-price="<?= (float) $amount ?>"<?php endif; ?>> 16 Añadida <div class="price-box price-final_price" data-role="priceBox" data-product-id="<?= (int) $product->getId() ?>" data-price-box="product-id-<?= (int) $product->getId() ?>"<?php if ($isProductPage): ?> data-base-price="<?= (float) $amount ?>"<?php endif; ?> aria-live="polite" aria-atomic="true"> 17 17 <span class="normal-price"><span class="price-container price-final_price tax weee"><span id="product-price-<?= (int) $product->getId() ?>" data-price-amount="<?= (float) $amount ?>" data-price-type="finalPrice" class="price-wrapper"><span class="price"><?= $escaper->escapeHtml($block->renderAmount($block->getPriceType('final_price')->getAmount(), ['display_label' => false])) ?></span></span></span></span> 18 18 </div> app/design/frontend/Validiscan/fixture/Magento_Catalog/templates/product/view/type/default.phtml Cambios en app/design/frontend/Validiscan/fixture/Magento_Catalog/templates/product/view/type/default.phtml (líneas añadidas: 1; eliminadas: 1)
Cambios en app/design/frontend/Validiscan/fixture/Magento_Catalog/templates/product/view/type/default.phtml (líneas añadidas: 1; eliminadas: 1) Línea anterior Línea nueva Cambio Código 11 11 ?> 12 12 <div class="product-info-stock-sku"> 13 13 <?php if ($block->displayProductStockStatus()): ?> 14 Eliminada <div class="stock available" title="<?= $escaper->escapeHtmlAttr(__('Availability')) ?>"><span><?= $escaper->escapeHtml(__('In stock')) ?></span></div> 14 Añadida <div class="stock available" title="<?= $escaper->escapeHtmlAttr(__('Availability')) ?>" role="status"><span><?= $escaper->escapeHtml(__('In stock')) ?></span></div> 15 15 <?php endif; ?> 16 16 <div class="product attribute sku"><strong class="type"><?= $escaper->escapeHtml(__('SKU')) ?></strong> <div class="value" itemprop="sku"><?= $escaper->escapeHtml($product->getSku()) ?></div></div> 17 17 </div> -
Títulos para mapas y vídeos incrustados iframe-title Un marco incrustado sin título recibe un título traducible que dice qué muestra, cuando el código lo revela.
Un marco incrustado sin título, como un mapa, un vídeo de YouTube o de Vimeo, un calendario, un formulario o un widget de reseñas, recibe un título traducible que dice qué muestra. La receta lee lo que muestra el marco a partir de su dirección, incluidas las partes fijas de una dirección que construye el código PHP, y de sus clases, su id y su nombre. Un marco cuyo contenido no revela el código no recibe ningún título de la receta y queda en manos de una persona.
- Reglas que cubre
-
-
frame-titleAUTO
-
- Tipos de archivo que modifica
-
.phtml
titles the store map on the contact page and validates Datos de ejemplo app/design/frontend/Validiscan/fixture/Magento_Contact/templates/form.phtml Cambios en app/design/frontend/Validiscan/fixture/Magento_Contact/templates/form.phtml (líneas añadidas: 1; eliminadas: 1)
Cambios en app/design/frontend/Validiscan/fixture/Magento_Contact/templates/form.phtml (líneas añadidas: 1; eliminadas: 1) Línea anterior Línea nueva Cambio Código 48 48 <p>Nordwind Outfitters (fixture)<br>Musterstraße 12<br>10115 Berlin, Germany</p> 49 49 <p><?= $escaper->escapeHtml(__('Monday to Saturday, 10:00 to 19:00')) ?></p> 50 50 <!-- VALIDISCAN-SEEDED frame-title: the store map iframe has no title --> 51 Eliminada <iframe src="<?= $escaper->escapeUrl($block->getBaseUrl() . 'media/wysiwyg/store-map.html') ?>" width="480" height="260" loading="lazy"></iframe> 51 Añadida <iframe src="<?= $escaper->escapeUrl($block->getBaseUrl() . 'media/wysiwyg/store-map.html') ?>" width="480" height="260" loading="lazy" title="<?= $escaper->escapeHtmlAttr(__('Store location map')) ?>"></iframe> 52 52 </div> 53 53 </div>
Contraste, imágenes y controles que requieren criterio
El contraste del texto, las alternativas textuales de las imágenes y los nombres de los controles sin nombre suelen requerir criterio: qué color encaja con su marca, qué palabras describen una imagen. Las reglas que los notifican tienen el nivel ASSISTED, como muestran las listas de más abajo. Para un hallazgo de una regla ASSISTED, la IA redacta un cambio solo si usted ha aceptado la redacción con IA, y Validiscan revisa cada cambio antes de entregarlo.
Las cuatro recetas siguientes no son la corrección estándar de ninguna regla. Cada una cubre solo los casos acotados en los que el código del tema por sí solo demuestra cuál debe ser el cambio. En un proyecto, button-semantics se aplica a los hallazgos de la comprobación de carruseles vs-carousel, que es AUTO: el motor de correcciones la prueba cuando la receta de carruseles de más arriba no corrige un hallazgo así. En Magento, las otras tres cubren solo reglas de nivel ASSISTED: un hallazgo de esas reglas sigue la vía ASSISTED, y estas tres recetas no se le aplican.
-
Colores de texto con contraste suficiente contrast-tokens Un color de texto que no supera la comprobación de contraste y está definido en un solo lugar pasa al color más próximo del mismo matiz que la supera sobre todos los fondos medidos; la receta no se aplica en un proyecto.
Cuando un texto no supera la comprobación de contraste y su color está definido en un solo lugar del tema, ese lugar pasa al color más próximo del mismo matiz que alcanza el contraste requerido sobre todos los fondos que el escaneo midió para él. Un solo lugar puede ser una variable LESS o una propiedad personalizada de CSS que se usa solo para el color del texto, o una única regla
color. Cuando el tema incluye unstyles-m.csscompilado, recibe el mismo cambio. Un color que se usa en varios lugares, también como fondo o borde, o en reglas cuyo fondo el escaneo no midió, queda en manos de una persona.- Reglas que cubre
-
-
color-contrastASSISTED
-
- Tipos de archivo que modifica
-
.css.less
darkens the single #929292 token and validates Datos de ejemplo app/design/frontend/Validiscan/fixture/web/css/source/_theme.less Cambios en app/design/frontend/Validiscan/fixture/web/css/source/_theme.less (líneas añadidas: 1; eliminadas: 1)
Cambios en app/design/frontend/Validiscan/fixture/web/css/source/_theme.less (líneas añadidas: 1; eliminadas: 1) Línea anterior Línea nueva Cambio Código 1099 1099 // VALIDISCAN-SEEDED color-contrast: #929292 on white is 3.1:1. 1100 1100 .block-promo .info, 1101 1101 .toolbar-amount { 1102 Eliminada color: #929292; 1102 Añadida color: #767676; 1103 1103 } 1104 1104 1105 1105 // VALIDISCAN-SEEDED vs-reflow: the promo row keeps a 1100px minimum width at every breakpoint. app/design/frontend/Validiscan/fixture/web/css/styles-m.css Cambios en app/design/frontend/Validiscan/fixture/web/css/styles-m.css (líneas añadidas: 1; eliminadas: 1)
Cambios en app/design/frontend/Validiscan/fixture/web/css/styles-m.css (líneas añadidas: 1; eliminadas: 1) Línea anterior Línea nueva Cambio Código 1075 1075 1076 1076 .block-promo .info, 1077 1077 .toolbar-amount { 1078 Eliminada color: #929292; 1078 Añadida color: #767676; 1079 1079 } 1080 1080 1081 1081 .block-promo-wrapper { -
Imágenes decorativas ocultas a los lectores de pantalla decorative-image-alt Solo las imágenes que la plantilla demuestra decorativas reciben un
altvacío oaria-hidden; la receta no se aplica en un proyecto.Una imagen se marca como decorativa solo cuando la plantilla demuestra que no aporta nada: está dentro de un enlace o un botón que ya tiene texto o un nombre, como un recuadro de promoción con su propio encabezado; es un icono, de 48 píxeles como máximo o con una clase o un nombre de archivo de icono, junto a su propia etiqueta de texto; o es un espaciador o un separador. Un
<img>recibe entonces unaltvacío, y un icono SVG recibearia-hidden="true", de modo que los lectores de pantalla lo omiten en lugar de leer en voz alta el nombre de un archivo. Cualquier otra imagen se trata como contenido, y su alternativa textual necesita palabras que elige una persona.- Reglas que cubre
-
-
image-altASSISTED -
role-img-altASSISTED -
svg-img-altASSISTED
-
- Tipos de archivo que modifica
-
.html
marks the promo tile image decorative and validates Datos de ejemplo app/design/frontend/Validiscan/fixture/Magento_Cms/content/home.html Cambios en app/design/frontend/Validiscan/fixture/Magento_Cms/content/home.html (líneas añadidas: 1; eliminadas: 1)
Cambios en app/design/frontend/Validiscan/fixture/Magento_Cms/content/home.html (líneas añadidas: 1; eliminadas: 1) Línea anterior Línea nueva Cambio Código 111 111 <div class="block-promo-wrapper block-promo-hp"> 112 112 <!-- VALIDISCAN-SEEDED image-alt: promo image without an alt attribute --> 113 113 <a class="block-promo home-main" href="/magento/women/tops-women/jackets-women.html"> 114 Eliminada <img src="/magento/media/wysiwyg/home/home-main.svg" width="400" height="240" /> 114 Añadida <img src="/magento/media/wysiwyg/home/home-main.svg" width="400" height="240" alt="" /> 115 115 <span class="content" 116 116 ><!-- VALIDISCAN-SEEDED color-contrast: .info text is #929292 on white (3.1:1) --><span 117 117 class="info" -
Nombres para botones y enlaces que solo muestran un icono icon-accessible-name Los botones y enlaces que solo muestran un icono y cuya finalidad revela el código reciben un
aria-label, con la redacción del tema Luma de Magento cuando Luma tiene una; la receta no se aplica en un proyecto.Los botones y enlaces que solo muestran un icono, como los de búsqueda, minicarrito, cuenta, lista de deseos, comparar, menú, cerrar, anterior y siguiente, y las opciones de un banner de cookies, reciben un
aria-labelque dice qué hacen, con la redacción del tema Luma de Magento cuando Luma tiene una, como «Search», «My Cart» o «Allow Cookies». La finalidad se deduce de las clases, el id, los atributos data y el destino del enlace del control, de su icono y del formulario o el banner de cookies que lo rodea. Un control cuya finalidad no revela el código, como un enlace a una red social construido en un bucle a partir de una dirección guardada como dato, o un enlace cuyo único contenido es la foto de un producto, queda en manos de una persona, porque su nombre depende del contenido de su tienda.- Reglas que cubre
-
-
button-nameASSISTED -
link-nameASSISTED -
vs-cookie-bannerASSISTED
-
- Tipos de archivo que modifica
-
.phtml
names the icon-only search button and validates Datos de ejemplo app/design/frontend/Validiscan/fixture/Magento_Search/templates/form.mini.phtml Cambios en app/design/frontend/Validiscan/fixture/Magento_Search/templates/form.mini.phtml (líneas añadidas: 1; eliminadas: 1)
Cambios en app/design/frontend/Validiscan/fixture/Magento_Search/templates/form.mini.phtml (líneas añadidas: 1; eliminadas: 1) Línea anterior Línea nueva Cambio Código 20 20 <div class="actions"> 21 21 <!-- VALIDISCAN-SEEDED button-name: icon-only search button without text, title or aria-label --> 22 22 <?php /* Fixed variant: <button type="submit" title="Search" class="action search"><span class="sr-only">Search</span>(icon, aria-hidden)</button>; the form gets role="search" aria-label="Site search". */ ?> 23 Eliminada <button type="submit" class="action search"><svg class="icon" viewBox="0 0 24 24"><circle cx="11" cy="11" r="7"/><path d="M20 20l-4-4"/></svg></button> 23 Añadida <button type="submit" class="action search" aria-label="<?= $escaper->escapeHtmlAttr(__('Search')) ?>"><svg class="icon" viewBox="0 0 24 24"><circle cx="11" cy="11" r="7"/><path d="M20 20l-4-4"/></svg></button> 24 24 </div> 25 25 </form> 26 26 </div> names the minicart link and leaves the product photo link for review Datos de ejemplo app/design/frontend/Validiscan/fixture/Magento_Checkout/templates/cart/minicart.phtml Cambios en app/design/frontend/Validiscan/fixture/Magento_Checkout/templates/cart/minicart.phtml (líneas añadidas: 1; eliminadas: 1)
Cambios en app/design/frontend/Validiscan/fixture/Magento_Checkout/templates/cart/minicart.phtml (líneas añadidas: 1; eliminadas: 1) Línea anterior Línea nueva Cambio Código 13 13 ?> 14 14 <!-- VALIDISCAN-SEEDED link-name + aria-valid-attr-value: the "My Cart" text was removed from the minicart link (only an icon and an empty counter remain) and aria-expanded carries the invalid value "closed" --> 15 15 <div data-block="minicart" class="minicart-wrapper"> 16 Eliminada <a class="action showcart" href="<?= $escaper->escapeUrl($block->getShoppingCartUrl()) ?>" data-bind="scope: 'minicart_content'" aria-haspopup="true" aria-expanded="closed"> 16 Añadida <a class="action showcart" href="<?= $escaper->escapeUrl($block->getShoppingCartUrl()) ?>" data-bind="scope: 'minicart_content'" aria-haspopup="true" aria-expanded="closed" aria-label="<?= $escaper->escapeHtmlAttr(__('My Cart')) ?>"> 17 17 <svg class="icon" viewBox="0 0 24 24"><path d="M3 4h2l2.4 11.2a2 2 0 0 0 2 1.6h7.7a2 2 0 0 0 2-1.5L21 8H6"/><circle cx="10" cy="20" r="1.5"/><circle cx="17" cy="20" r="1.5"/></svg> 18 18 <span class="counter qty empty"><span class="counter-number"></span></span> 19 19 </a>
Detalles: los niveles, el tema de prueba, las comprobaciones de cada cambio y el texto en los idiomas de su tienda
Una receta es un cambio determinista para un tipo de fallo: el mismo código recibe siempre el mismo cambio. Validiscan tiene 20 recetas para temas de Magento. Cada una hace un cambio solo donde el código del tema muestra cuál es el cambio correcto. Donde no lo muestra, la receta no cambia nada. No adivina.
Debajo de cada receta encontrará las reglas que cubre, con el nivel de cada regla en el catálogo de Validiscan para Magento. AUTO significa que una receta es la corrección estándar de la regla. ASSISTED significa que los hallazgos de la regla suelen requerir criterio. MANUAL significa que la regla requiere la decisión de una persona y viene con orientación. En un proyecto, las recetas se aplican a los hallazgos de reglas de nivel AUTO. Cuando una receta enumera también una regla de nivel ASSISTED o MANUAL, un hallazgo de esa regla sigue en su lugar la vía ASSISTED o MANUAL. Una regla que se comprueba mediante otra comprobación no se ejecuta por sí sola en un escaneo; la otra comprobación informa del mismo fallo.
Los tipos de archivo y el antes y el después de cada receta proceden de las pruebas propias de Validiscan. Se ejecutan en el tema de prueba de Magento de Validiscan, un tema hijo del tema Luma de Magento con fallos de accesibilidad introducidos a propósito. Magento no se puede renderizar en el entorno de pruebas, así que ninguna prueba renderiza una página: cada prueba compara el cambio con un diff almacenado y comprueba el código fuente modificado, por ejemplo que coincide con la versión corregida del tema de prueba. Los archivos de su tema serán distintos.
Antes de que Validiscan revise un cambio, se comprueban los archivos modificados. Cada ruta debe estar dentro del tema, como se ha descrito más arriba. Las plantillas .phtml pasan la comprobación de sintaxis propia de PHP, que lee el archivo sin ejecutarlo. El XML de layout se comprueba como XML, las hojas de estilos pasan una comprobación de estructura, y las plantillas HTML y el JavaScript se analizan.
Cuando una receta añade palabras, como el texto de un enlace para saltar al contenido o el nombre de un área de navegación, las escribe en inglés, con la redacción del tema Luma de Magento cuando Luma tiene una, como «Skip to Content». Cuando su tema tiene un archivo de traducción al alemán en su carpeta i18n, la receta añade allí el texto en alemán, salvo que la cadena ya esté traducida. No se añade texto para los demás idiomas de su tienda.
¿Qué sigue siendo MANUAL en Magento?
Los fallos que requieren una decisión sobre su contenido o sobre cómo se comporta una parte de la página, que una receta no toma, como los subtítulos y las transcripciones de sus vídeos y su audio, siguen siendo MANUAL en Magento. Para un hallazgo de una regla MANUAL, Validiscan da orientación, no un cambio de código.
Las reglas de más abajo se ejecutan en los escaneos y tienen el nivel MANUAL en Magento; las reglas de buenas prácticas no se enumeran.
-
meta-refreshNo debe usarse una actualización diferida de menos de 20 horas -
nested-interactiveLos controles interactivos no deben estar anidados -
scrollable-region-focusableLas zonas desplazables deben ser accesibles con el teclado -
server-side-image-mapNo deben usarse mapas de imagen del lado del servidor -
vs-keyboard-trapEl foco del teclado nunca debe quedar atrapado -
vs-focus-orderEl orden del foco debe seguir el orden visual -
vs-draggingLos controles que solo funcionan arrastrando necesitan una alternativa con un solo puntero -
vs-mediaLos vídeos necesitan subtítulos, el audio necesita una transcripción y nada debe reproducirse automáticamente con sonido -
vs-documentsLos documentos enlazados necesitan una revisión manual de accesibilidad
Detalles: qué recibe un hallazgo MANUAL, la regla del orden de tabulación y lo que un proyecto deja fuera
Para un hallazgo de una regla MANUAL, Validiscan da orientación sobre cómo corregirlo, no un cambio en su código. Estos fallos requieren una decisión sobre su contenido o sobre cómo se comporta una parte de la página, que una receta no toma: los subtítulos y las transcripciones de sus vídeos y su audio, una forma de salir de un widget que atrapa el foco del teclado, una segunda forma de usar un control que solo funciona arrastrando, un orden del foco que coincida con la maquetación, una página que se recarga sola pasado un tiempo, o la accesibilidad de los PDF y otros documentos enlazados. Un orden de tabulación forzado mediante un tabindex mayor que 0 lo notifica también la regla tabindex de axe-core, que la receta del orden de tabulación de más arriba corrige.
El trabajo que suponen los hallazgos MANUAL que requieren decisiones sobre su propio contenido no forma parte de un proyecto, como tampoco los PDF. Lo que las pruebas automatizadas de accesibilidad pueden demostrar y lo que no
¿Qué aporta usted?
Usted aporta permiso por escrito para un escaneo completo, una vía de acceso a su tema, su respuesta sobre la redacción con IA de correcciones ASSISTED, un desarrollador que revise los cambios, compile los estilos y despliegue el tema, cambios en Magento Admin, la traducción del texto añadido a sus demás idiomas y sus decisiones sobre lo que sigue siendo MANUAL.
- Permiso por escrito para un escaneo completo de su tienda. Un escaneo completo añade un producto al carrito y abre el primer paso del proceso de pago, sin completar una compra ni introducir datos de pago.
- Una vía de acceso a su tema: acceso al repositorio de GitHub que lo contiene, o un ZIP de la carpeta del tema en
app/design/frontend, subido en el portal del cliente. - Su respuesta sobre si la IA puede redactar correcciones de nivel ASSISTED. La redacción con IA está desactivada hasta que usted lo acepte.
- Un desarrollador que revise los cambios, fusione el pull request o aplique el paquete de parches, compile las hojas de estilos y despliegue el tema.
- Los cambios en Magento Admin que las correcciones no hacen: la vista de tienda o el marcado de idioma del contenido escrito en un idioma distinto del de su tienda, los títulos de página y los ajustes de HTML Head, y el avance automático desactivado en los carruseles de Page Builder almacenados en la base de datos.
- Las traducciones del texto que añaden las correcciones, para los demás idiomas de su tienda. Las recetas escriben en inglés y añaden el alemán solo cuando su tema ya tiene un archivo de traducción al alemán.
- Sus decisiones sobre lo que sigue siendo MANUAL, como los subtítulos de sus vídeos.
Detalles: cuando los cambios están en producción y qué cubre un proyecto
Cuando los cambios están en producción, un escaneo de verificación vuelve a comprobar las páginas afectadas y el Remediation Evidence Package registra el resultado. Cómo se desarrolla un proyecto, paso a paso
Un proyecto cubre una tienda: un dominio y un tema. Un storefront headless, en el que las páginas las construye una aplicación de frontend independiente en lugar de un tema, se atiende bajo petición.
Fuentes
Una fuente, comprobada para esta página el 6 de octubre de 2026.
Documentación de Adobe Commerce para desarrolladores 1
- CSS and LESS preprocessing · Adobe · comprobado el
Empiece con una revisión gratuita de su tienda.
Envíe la dirección de su tienda. Validiscan la escanea y le responde con cada fallo que el escaneo pueda demostrar, con la página y el código.
Solicitar revisión gratuitaO escriba a info@validiscan.com.
Qué cubre la revisión gratuita y qué deja fuera- Usted envía
- la dirección de su tienda
- Páginas escaneadas
- hasta 15
- Usted recibe
- todos los fallos que el escaneo puede demostrar, con la página y el código
- En su tienda
- solo páginas públicas; sin inicio de sesión, nada comprado, ningún formulario enviado
- Lo que no es
- una auditoría completa