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:

¿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:focus-visible-styles */. 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.

Las dos vías de acceso a un tema de Magento
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/design/frontend, 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/design/frontend/<Vendor>/<theme>, 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.

De la entrega a su tienda en producción, en cinco pasos
  1. Validiscan entrega los cambios que ha revisado y aprobado: un pull request en una rama nueva o un paquete de parches para su desarrollador.
  2. 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.
  3. Su desarrollador fusiona el pull request o aplica el paquete de parches.
  4. 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.
  5. 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/a11y-<date>-<id>, 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/magento setup:static-content:deploy, 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 lang o ninguno, la plantilla vuelve a imprimir los atributos propios de Magento, de modo que cada página recibe un lang válido.

    Magento establece el idioma de una página a partir de la configuración regional de su vista de tienda, por ejemplo en para la configuración regional en_US, y lo imprime mediante su plantilla raíz. Cuando su tema sobrescribe esa plantilla e imprime su propio lang, normalmente el código de configuración regional en_US, que no es una etiqueta de idioma válida, o ningún lang, la plantilla vuelve a imprimir los atributos propios de Magento, de modo que cada página recibe un lang válido. Un lang establecido en el XML de layout con la forma de la configuración regional, como de_DE, pasa a ser de-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-lang AUTO se comprueba mediante vs-lang
    • html-lang-valid AUTO se comprueba mediante vs-lang
    • vs-lang AUTO
    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 ?>
  • 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-title AUTO
    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: none pasa 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: none elimina 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-order AUTO se comprueba mediante vs-headings-landmarks
    • page-has-heading-one AUTO se comprueba mediante vs-headings-landmarks
    • vs-headings-landmarks AUTO
    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-visible AUTO
    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 tabindex mayor que 0, todo tabindex positivo fijo de las plantillas del tema se elimina o se pone a 0.

    Un tabindex mayor 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 todo tabindex positivo 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 reciben tabindex="0", de modo que siguen siendo alcanzables y la tecla Tab recorre la página en su orden. Un tabindex que calcula el código PHP queda en manos de una persona. La comprobación vs-focus-order de 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
    • tabindex AUTO
    • vs-focus-order MANUAL
    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=no y cualquier maximum-scale inferior 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=no y cualquier maximum-scale inferior a 2 de la etiqueta viewport en el XML de layout del tema, como default_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ácticas meta-viewport-large el 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-viewport AUTO
    • meta-viewport-large AUTO
    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 display pasa a inline-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-size AUTO
    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/js inician 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-motion AUTO
    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-carousel AUTO
    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 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 muted y playsinline, 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 multimedia vs-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-audio AUTO 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 mediante aria-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> sin for recibe uno que apunta al campo. Un texto de etiqueta en un <span> o un <strong>, como un texto «Sort By» con la clase sorter-label de 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 mediante aria-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
    • label AUTO se comprueba mediante vs-forms-ecommerce
    • select-name ASSISTED
    • vs-forms-ecommerce AUTO
    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 autocomplete correspondiente 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 autocomplete correspondiente 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 en shipping given-name. Cuando se notifica un campo de un formulario, se tratan todos los campos de ese formulario. Las contraseñas reciben new-password en los formularios de registro y de restablecimiento y en los formularios con más de un campo de contraseña, y current-password en 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-valid AUTO se comprueba mediante vs-forms-ecommerce
    • vs-forms-ecommerce AUTO
    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-updates AUTO
    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-title AUTO
    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 un styles-m.css compilado, 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-contrast ASSISTED
    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 alt vacío o aria-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 un alt vacío, y un icono SVG recibe aria-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-alt ASSISTED
    • role-img-alt ASSISTED
    • svg-img-alt ASSISTED
    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"
  • Controles que solo funcionan con el ratón, convertidos en botones button-semantics Los elementos <div> y <span> de carruseles y banners de cookies en los que se puede hacer clic pasan a ser botones de verdad cuando el código indica que son controles; en un proyecto, la receta se aplica a los hallazgos de vs-carousel.

    Los elementos <div> y <span> en los que se puede hacer clic, en carruseles y banners de cookies, pasan a ser botones de verdad. La receta considera que un elemento es un control solo cuando el código lo dice: tiene role="button", un manejador de clics o un binding de clic de Knockout, o una clase o un atributo data que el script del tema selecciona para gestionar los clics. Las clases, los atributos data y los atributos ARIA se conservan, de modo que los estilos y los scripts del tema encuentran el control como antes, y Enter y la barra espaciadora hacen ahora lo que hace un clic. Un breve restablecimiento de estilos al final de la hoja de estilos del tema mantiene su aspecto, también al pasar el ratón y al recibir el foco, y los contornos de foco no se tocan. Un control que contiene bloques, enlaces o campos, o que no tiene clase, queda en manos de una persona.

    Reglas que cubre
    • vs-carousel AUTO
    • vs-cookie-banner ASSISTED
    Tipos de archivo que modifica
    .css.less.phtml
    turns span controls of the cookie bar into buttons and validates Datos de ejemplo

    app/design/frontend/Validiscan/fixture/Magento_Cookie/templates/html/notices.phtml Cambios en app/design/frontend/Validiscan/fixture/Magento_Cookie/templates/html/notices.phtml (líneas añadidas: 2; eliminadas: 2)

    Cambios en app/design/frontend/Validiscan/fixture/Magento_Cookie/templates/html/notices.phtml (líneas añadidas: 2; eliminadas: 2)
    Línea anterior Línea nueva Cambio Código
    24 24 <div class="amgdprcookie-bar-block">
    25 25 <p class="amgdprcookie-policy"><?= $escaper->escapeHtml(__('We use cookies to give you the best shopping experience and to analyse our traffic. By continuing to browse you agree to our')) ?> <a href="<?= $escaper->escapeUrl($block->getPrivacyPolicyLink()) ?>" class="amgdprcookie-link"><?= $escaper->escapeHtml(__('cookie policy')) ?></a>.</p>
    26 26 <div class="amgdprcookie-buttons-block">
    27 Eliminada <span class="amgdprcookie-button -allow" data-amcookie-js="allow" role="button" tabindex="0"><svg class="icon" viewBox="0 0 24 24"><path d="M4 12l5 5L20 6"/></svg></span>
    28 Eliminada <span class="amgdprcookie-button -decline" data-amcookie-js="decline" role="button" tabindex="0"><svg class="icon" viewBox="0 0 24 24"><path d="M6 6l12 12M18 6L6 18"/></svg></span>
    27 Añadida <button class="amgdprcookie-button -allow" data-amcookie-js="allow" type="button"><svg class="icon" viewBox="0 0 24 24"><path d="M4 12l5 5L20 6"/></svg></button>
    28 Añadida <button class="amgdprcookie-button -decline" data-amcookie-js="decline" type="button"><svg class="icon" viewBox="0 0 24 24"><path d="M6 6l12 12M18 6L6 18"/></svg></button>
    29 29 </div>
    30 30 </div>
    31 31 </div>

    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: 30; eliminadas: 0)

    Cambios en app/design/frontend/Validiscan/fixture/web/css/source/_theme.less (líneas añadidas: 30; 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:button-semantics */
    1269 Añadida button.amgdprcookie-button.-allow,
    1270 Añadida button.amgdprcookie-button.-decline {
    1271 Añadida -webkit-appearance: none;
    1272 Añadida appearance: none;
    1273 Añadida margin: 0;
    1274 Añadida padding: 0;
    1275 Añadida box-shadow: none;
    1276 Añadida font: inherit;
    1277 Añadida letter-spacing: inherit;
    1278 Añadida text-align: inherit;
    1279 Añadida text-transform: inherit;
    1280 Añadida text-shadow: none;
    1281 Añadida }
    1282 Añadida button.amgdprcookie-button.-allow:hover,
    1283 Añadida button.amgdprcookie-button.-allow:focus,
    1284 Añadida button.amgdprcookie-button.-allow:active {
    1285 Añadida background: @nw-primary;
    1286 Añadida border: 0;
    1287 Añadida color: #fff;
    1288 Añadida }
    1289 Añadida button.amgdprcookie-button.-decline:hover,
    1290 Añadida button.amgdprcookie-button.-decline:focus,
    1291 Añadida button.amgdprcookie-button.-decline:active {
    1292 Añadida background: #fff;
    1293 Añadida border: 1px solid @nw-border;
    1294 Añadida color: @nw-text;
    1295 Añadida }
    1296 Añadida /* /validiscan:button-semantics */

    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: 30; eliminadas: 0)

    Cambios en app/design/frontend/Validiscan/fixture/web/css/styles-m.css (líneas añadidas: 30; 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:button-semantics */
    1237 Añadida button.amgdprcookie-button.-allow,
    1238 Añadida button.amgdprcookie-button.-decline {
    1239 Añadida -webkit-appearance: none;
    1240 Añadida appearance: none;
    1241 Añadida margin: 0;
    1242 Añadida padding: 0;
    1243 Añadida box-shadow: none;
    1244 Añadida font: inherit;
    1245 Añadida letter-spacing: inherit;
    1246 Añadida text-align: inherit;
    1247 Añadida text-transform: inherit;
    1248 Añadida text-shadow: none;
    1249 Añadida }
    1250 Añadida button.amgdprcookie-button.-allow:hover,
    1251 Añadida button.amgdprcookie-button.-allow:focus,
    1252 Añadida button.amgdprcookie-button.-allow:active {
    1253 Añadida background: #1979c3;
    1254 Añadida border: 0;
    1255 Añadida color: #fff;
    1256 Añadida }
    1257 Añadida button.amgdprcookie-button.-decline:hover,
    1258 Añadida button.amgdprcookie-button.-decline:focus,
    1259 Añadida button.amgdprcookie-button.-decline:active {
    1260 Añadida background: #fff;
    1261 Añadida border: 1px solid #c2c2c2;
    1262 Añadida color: #333;
    1263 Añadida }
    1264 Añadida /* /validiscan:button-semantics */
  • 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-label que 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-name ASSISTED
    • link-name ASSISTED
    • vs-cookie-banner ASSISTED
    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-refresh No debe usarse una actualización diferida de menos de 20 horas
  • nested-interactive Los controles interactivos no deben estar anidados
  • scrollable-region-focusable Las zonas desplazables deben ser accesibles con el teclado
  • server-side-image-map No deben usarse mapas de imagen del lado del servidor
  • vs-keyboard-trap El foco del teclado nunca debe quedar atrapado
  • vs-focus-order El orden del foco debe seguir el orden visual
  • vs-dragging Los controles que solo funcionan arrastrando necesitan una alternativa con un solo puntero
  • vs-media Los vídeos necesitan subtítulos, el audio necesita una transcripción y nada debe reproducirse automáticamente con sonido
  • vs-documents Los 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.

  1. 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.
  2. 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.
  3. Su respuesta sobre si la IA puede redactar correcciones de nivel ASSISTED. La redacción con IA está desactivada hasta que usted lo acepte.
  4. 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.
  5. 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.
  6. 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.
  7. 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
  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 gratuita

O 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

Escribir a Validiscan

Para una revisión gratuita, indique la dirección web de su tienda y su plataforma.

Validiscan utiliza lo que usted envía para responderle. Política de privacidad