Corrections d’accessibilité dans le code de votre thème Shopify

Validiscan corrige les échecs d’accessibilité dans les templates Liquid, les feuilles de style, les scripts et les fichiers de langue de votre thème Shopify. Les modifications arrivent sous forme de copie non publiée du thème, de pull request ou de lot de correctifs, et rien n’atteint votre thème en ligne avant d’avoir été publié, fusionné ou appliqué par vous ou par votre développeur.

Dernière mise à jour :

Quels fichiers d’un thème Shopify Validiscan modifie-t-il ?

Validiscan modifie les fichiers propres de votre thème, et rien d’autre : les fichiers Liquid des dossiers layout, templates, sections, snippets et blocks, les feuilles de style et les scripts du dossier assets, les textes de la vitrine dans locales et les réglages dans config. Une modification de tout autre fichier est rejetée avant que Validiscan ne la relise.

Le tunnel de commande de Shopify ne fait pas partie du code de votre thème

Un scan complet ouvre la première étape du tunnel de commande, mais Shopify ne prend plus en charge checkout.liquid, le fichier de layout du thème consacré au tunnel de commande, pour les étapes d’informations, d’expédition et de paiement. Un échec qu’un scan relève dans ces étapes ne peut donc pas être corrigé par une modification des fichiers de votre thème.

Détails : ce qu’une modification peut ajouter, et ce qui est hors du périmètre de ce travail

Chaque changement est une modification ordinaire d’un fichier du thème, que vous ou votre développeur pouvez lire ligne par ligne. Quelques corrections ajoutent des lignes au script propre du thème, par exemple pour relier un bouton de pause à un diaporama. Aucune correction n’ajoute d’application ni d’overlay, et rien n’est injecté dans le navigateur du visiteur pour corriger vos pages. Le code qui ne fait pas partie des fichiers de votre thème est hors du périmètre de ce travail, et les contenus tiers intégrés, comme les widgets de paiement ou de chat, ne sont pas compris dans un projet.

Comment Validiscan accède-t-il à votre thème Shopify ?

Validiscan accède à votre thème Shopify de l’une de ces trois façons : par votre dépôt GitHub, avec un mot de passe Theme Access, ou à partir d’un fichier de thème que vous téléchargez vous-même. Le choix dépend de l’endroit où se trouve le code de votre thème, et il détermine aussi la façon dont les modifications vous reviennent.

Les trois voies d’accès à un thème Shopify
Voie d’accès Ce que vous fournissez Les modifications reviennent sous forme de
Par votre dépôt GitHub L’accès au dépôt, par l’application GitHub de Validiscan ou un jeton d’accès Une pull request
Avec un mot de passe Theme Access Un mot de passe Theme Access et l’adresse myshopify.com de votre boutique Une copie non publiée de votre thème
À partir d’un fichier de thème que vous téléchargez Le fichier ZIP de votre thème, de 100 Mo au maximum, téléversé dans le portail client par un administrateur de votre organisation Un lot de correctifs

Par votre dépôt GitHub

Si le code de votre thème est conservé dans un dépôt GitHub, par exemple grâce à l’intégration GitHub de Shopify, vous donnez à Validiscan l’accès à ce dépôt. Vous installez l’application GitHub de Validiscan sur le dépôt, ou vous donnez à Validiscan un jeton d’accès. L’application demande un accès en lecture et en écriture au contenu du dépôt et à ses pull requests, et un accès en lecture à ses métadonnées. Les dossiers du thème, comme layout, sections et snippets, doivent se trouver à la racine du dépôt, car une modification de tout autre chemin est rejetée. Les modifications arrivent alors sous forme de pull request.

Avec un mot de passe Theme Access

Theme Access, l’application gratuite de Shopify, crée des mots de passe qui permettent à un développeur de travailler sur les thèmes d’une boutique avec Shopify CLI. En tant que propriétaire de la boutique ou membre du personnel disposant de l’autorisation Thèmes, vous installez l’application et créez un mot de passe pour Validiscan ; Shopify envoie par e-mail à Validiscan un lien vers ce mot de passe, et celui-ci ne peut être consulté qu’une seule fois. Vous communiquez aussi à Validiscan l’adresse myshopify.com de votre boutique. Validiscan conserve le mot de passe chiffré et l’utilise avec Shopify CLI pour télécharger votre thème en ligne et pour téléverser une nouvelle copie non publiée de celui-ci. Un mot de passe Theme Access permet de modifier les thèmes de la boutique : le code de livraison de Validiscan refuse donc toute commande qui écrirait dans le thème en ligne ou qui publierait un thème. Vous mettez fin à l’accès en supprimant le mot de passe dans l’application Theme Access ; au 6 octobre 2026, la documentation de Shopify indique que la suppression d’un mot de passe révoque l’accès. Validiscan réutilise le mot de passe après une livraison pour vérifier si la copie a été publiée : supprimez-le donc à la fin du projet, et créez-en un nouveau pour une livraison ultérieure.

À partir d’un fichier de thème que vous téléchargez

Si aucune des deux solutions ci-dessus ne vous convient, vous téléchargez vous-même votre thème. Le portail client indique ces étapes :

  1. Dans votre interface administrateur Shopify, ouvrez Boutique en ligne, puis Thèmes.
  2. Dans le menu du thème que vous utilisez, choisissez « Télécharger le fichier du thème ».
  3. Shopify vous envoie le fichier ZIP par e-mail.

Les instructions de Shopify figurent dans son article d’aide sur le téléchargement des thèmes. Un administrateur de votre organisation dans le portail client, qui peut être votre développeur, y téléverse ensuite le fichier, sous la forme d’un seul fichier ZIP de 100 Mo au maximum. Validiscan prépare les modifications sur cette copie de votre thème et les renvoie sous forme de lot de correctifs.

Comment les modifications parviennent-elles à votre boutique ?

Validiscan livre les modifications de l’une de ces trois façons : sous forme de copie non publiée de votre thème Shopify, de pull request ou de lot de correctifs. Il ne livre que des modifications qu’il a relues et approuvées, et aucune des trois façons ne touche à votre thème en ligne.

Publier la copie du thème, en cinq étapes

Avec un mot de passe Theme Access, Validiscan télécharge votre thème en ligne, y applique les modifications approuvées et téléverse le résultat sous la forme d’un nouveau thème non publié nommé Validiscan A11y <date>, par exemple Validiscan A11y 2026-09-24. Vous recevez un e-mail lorsqu’il est prêt. Ensuite :

  1. Dans l’interface administrateur Shopify, ouvrez Boutique en ligne, puis Thèmes, et trouvez le thème non publié Validiscan A11y <date> parmi vos thèmes brouillons.
  2. Prévisualisez-le. Vos visiteurs continuent de voir le thème en ligne pendant ce temps.
  3. Vérifiez les pages concernées dans l’aperçu, y compris au clavier seul.
  4. Lorsque le résultat vous convient, choisissez Publier. Shopify décrit cette étape dans son article d’aide sur la publication des thèmes.
  5. Conservez votre thème précédent jusqu’à ce que vous n’ayez plus de doute. Vous pouvez y revenir.

Une copie non publiée de votre thème

La copie est votre thème en ligne tel qu’il était le jour où Validiscan l’a téléchargé. Si vous modifiez le thème en ligne après ce jour, qu’il s’agisse de son contenu, de ses réglages ou de son code, faites la même modification dans la copie avant de la publier, sans quoi la modification est perdue. Le portail client indique si la copie attend d’être publiée, si elle a été publiée, ou si elle a été supprimée sans avoir été publiée. Le centre d’aide de Shopify sur la mise à jour des thèmes indique que les mises à jour ne sont disponibles que pour les thèmes installés depuis le Shopify Theme Store, et que les mises à jour automatiques ne sont pas prises en charge pour les thèmes téléversés. La copie est téléversée avec Shopify CLI : avant de la publier, vérifiez donc sous Boutique en ligne, puis Thèmes, si Shopify propose encore des mises à jour pour elle. Où placer les corrections dans un thème Shopify, et ce qu’une mise à jour du thème peut défaire

Une pull request

Avec l’accès à votre dépôt, Validiscan crée une nouvelle branche nommée validiscan/a11y-<date>-<id>, enregistre chaque correction dans un commit distinct et ouvre une seule pull request, avec un tableau récapitulatif, une explication de chaque modification et une liste de contrôle pour la relecture. Rien n’est poussé vers votre branche par défaut. Avec l’intégration GitHub de Shopify, un thème suit la branche à laquelle il est relié : votre développeur peut relier la branche de la pull request à un thème non publié pour la prévisualiser, et une fusion dans la branche que suit votre thème en ligne modifie ce thème en ligne.

Un lot de correctifs

À partir d’un fichier de thème téléversé, Validiscan prépare une archive zip pour votre développeur. Elle contient PATCH.md, avec chaque modification et la façon de l’appliquer, toutes les modifications dans un seul fichier de correctif, un fichier de correctif par correction, les fichiers modifiés en entier et un README.md. Votre développeur applique les modifications, les teste et publie le thème. Ce que contiennent une pull request et un lot de correctifs

Que modifient les recettes dans un thème Shopify ?

Chacune des 20 recettes de Validiscan pour les thèmes Shopify est une modification déterministe pour un type d’échec : le même code reçoit toujours la même modification. Une recette n’intervient que là où le code du thème montre quelle modification est la bonne ; sinon, le constat est laissé à une personne.

Structure de la page et navigation

  • Langue de la page reprise de la langue de votre boutique html-lang Un layout dont l’élément <html> n’a pas d’attribut lang, ou en a un vide ou invalide, reçoit la langue que votre boutique affiche.

    Un layout dont l’élément <html> n’a pas d’attribut lang, ou en a un vide ou invalide, reçoit la langue que votre boutique affiche, de sorte que les lecteurs d’écran prononcent la page dans la bonne langue. Lorsque le thème conserve déjà la langue propre à une page dans un métachamp, par exemple pour des pages juridiques allemandes dans une boutique anglaise, le layout utilise ce métachamp s’il est renseigné. Sans un tel champ, la recette ne devine pas la langue d’une page.

    Règles couvertes
    • html-has-lang AUTO contrôle assuré par vs-lang
    • html-lang-valid AUTO contrôle assuré par vs-lang
    • vs-lang AUTO
    Types de fichiers modifiés
    .liquid
    Avant et après Données d’exemple

    layout/checkout.liquid Modifications apportées à layout/checkout.liquid (lignes ajoutées : 1, lignes supprimées : 1)

    Modifications apportées à layout/checkout.liquid (lignes ajoutées : 1, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    3 3 Checkout layout (the Shopify Plus `checkout.liquid` era). Only the first step
    4 4 (contact, delivery, billing) is modelled; nothing is ever submitted.
    5 5 {% endcomment %}
    6 Supprimée <html class="no-js">
    6 Ajoutée <html class="no-js" lang="{{ request.locale.iso_code }}">
    7 7 <head>
    8 8 <meta charset="utf-8">
    9 9 <meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no">

    layout/theme.liquid Modifications apportées à layout/theme.liquid (lignes ajoutées : 3, lignes supprimées : 0)

    Modifications apportées à layout/theme.liquid (lignes ajoutées : 3, lignes supprimées : 0)
    Ligne avant Ligne après Modification Code
    6 6 {% endcomment %}
    7 7 {%- liquid
    8 8 assign page_lang = request.locale.iso_code
    9 Ajoutée if page.metafields.custom.content_language != blank
    10 Ajoutée assign page_lang = page.metafields.custom.content_language
    11 Ajoutée endif
    9 12 -%}
    10 13 <html class="no-js" lang="{{ page_lang }}">
    11 14 <head>
  • Un titre sur chaque page document-title-template Les layouts dont le <title> est absent, vide ou contient le même texte fixe sur toutes les pages reçoivent un titre construit à partir des variables de Shopify.

    Chaque layout dont l’élément <title> est absent, vide ou contient le même texte fixe sur toutes les pages reçoit un titre construit à partir des variables de Shopify. Si votre layout principal a déjà un titre qui nomme la page, les autres layouts reçoivent le même. Sinon, le titre contient le titre de la page, le numéro de page d’une liste paginée et le nom de la boutique, le mot « page » étant traduit grâce aux fichiers de langue du thème.

    Règles couvertes
    • document-title AUTO
    Types de fichiers modifiés
    .liquid
    Avant et après Données d’exemple

    layout/theme.focused.liquid Modifications apportées à layout/theme.focused.liquid (lignes ajoutées : 1, lignes supprimées : 1)

    Modifications apportées à layout/theme.focused.liquid (lignes ajoutées : 1, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    11 11 <meta charset="utf-8">
    12 12 <meta http-equiv="X-UA-Compatible" content="IE=edge">
    13 13 <meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no">
    14 Supprimée <title></title>
    14 Ajoutée <title>{{ page_title }}{% unless page_title contains shop.name %} &ndash; {{ shop.name }}{% endunless %}</title>
    15 15 <link rel="canonical" href="{{ canonical_url }}">
    16 16 <!-- Theme assets: //cdn.shopify.com/s/files/1/0712/3456/7890/t/12/assets/ (served locally by the fixture server) -->
    17 17 {% render 'meta-tags' %}
  • Des titres sans niveau sauté heading-levels Un titre qui saute un niveau reçoit le niveau qui suit directement celui du titre précédent ; la recette n’ajoute aucun titre masqué.

    Un titre qui saute un niveau, comme un h4 juste après un h2, reçoit le niveau qui suit directement celui du titre précédent, dans le fichier de section où il est écrit. Lorsque le thème met en forme les titres selon leur niveau, une petite règle de style conserve l’aspect d’origine du titre. Sur une page sans titre principal, l’élément qui a déjà l’apparence de son titre devient le h1 ; sur la page d’accueil, c’est l’option du thème qui permet d’afficher le logo comme h1. Si une page n’a aucun élément de ce genre, la recette n’ajoute pas de titre masqué, car c’est une décision de contenu.

    Règles couvertes
    • heading-order AUTO contrôle assuré par vs-headings-landmarks
    • page-has-heading-one AUTO contrôle assuré par vs-headings-landmarks
    • vs-headings-landmarks AUTO
    Types de fichiers modifiés
    .liquid
    Avant et après Données d’exemple

    sections/featured-collection.liquid Modifications apportées à sections/featured-collection.liquid (lignes ajoutées : 1, lignes supprimées : 1)

    Modifications apportées à sections/featured-collection.liquid (lignes ajoutées : 1, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    1 1 {%- liquid
    2 2 assign featured = section.settings.collection
    3 Supprimée assign card_heading = 'h4'
    3 Ajoutée assign card_heading = 'h3'
    4 4 -%}
    5 5 <div class="featured-collection page-width section-spacing">
    6 6 <div class="title-wrapper">

    sections/header.liquid Modifications apportées à sections/header.liquid (lignes ajoutées : 3, lignes supprimées : 0)

    Modifications apportées à sections/header.liquid (lignes ajoutées : 3, lignes supprimées : 0)
    Ligne avant Ligne après Modification Code
    3 3 assign menu = linklists[section.settings.menu]
    4 4 assign icon_size = 18
    5 5 assign logo_is_heading = false
    6 Ajoutée if request.page_type == 'index'
    7 Ajoutée assign logo_is_heading = true
    8 Ajoutée endif
    6 9 -%}
    7 10 <div class="header-wrapper">
    8 11 <header class="header page-width"{% if header_lang != '' %} lang="{{ header_lang }}"{% endif %}>

    sections/main-collection.liquid Modifications apportées à sections/main-collection.liquid (lignes ajoutées : 1, lignes supprimées : 1)

    Modifications apportées à sections/main-collection.liquid (lignes ajoutées : 1, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    6 6 wishlist heart nested inside the product image link.
    7 7 {%- endcomment -%}
    8 8 {%- liquid
    9 Supprimée assign card_heading = 'h4'
    9 Ajoutée assign card_heading = 'h3'
    10 10 assign price_max = collection.price_max_rounded
    11 11 assign in_stock_count = collection.products | where: 'available', true | size
    12 12 assign out_of_stock_count = collection.products_count | minus: in_stock_count

    sections/main-product.liquid Modifications apportées à sections/main-product.liquid (lignes ajoutées : 1, lignes supprimées : 1)

    Modifications apportées à sections/main-product.liquid (lignes ajoutées : 1, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    13 13 assign featured = product.featured_image
    14 14 assign form_id = 'product-form-' | append: section.id
    15 15 assign qty_id = 'Quantity-' | append: section.id
    16 Supprimée assign sub_heading = 'h4'
    16 Ajoutée assign sub_heading = 'h2'
    17 17 assign size_option = nil
    18 18 for option in product.options_with_values
    19 19 if option.name == 'Size'

    sections/main-search.liquid Modifications apportées à sections/main-search.liquid (lignes ajoutées : 1, lignes supprimées : 1)

    Modifications apportées à sections/main-search.liquid (lignes ajoutées : 1, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    1 1 {%- liquid
    2 Supprimée assign card_heading = 'h4'
    2 Ajoutée assign card_heading = 'h3'
    3 3 -%}
    4 4 <div class="template-search page-width">
    5 5 <h1 class="template-search__title">{{ 'templates.search.title' | t }}</h1>

Utilisation au clavier et focus

  • Un contour de focus visible focus-visible-styles Un seul contour pour le focus clavier, dans la couleur d’accent de votre thème ou une couleur de repli, avec un contraste d’au moins 3:1 avec l’arrière-plan de la page.

    La feuille de style principale reçoit un seul contour pour le focus clavier : 2 pixels, en trait plein, à 2 pixels de l’élément, dans la couleur d’accent de votre thème (ou la couleur de son texte, ou noir ou blanc, lorsque le thème n’a pas de couleur d’accent), éclaircie ou assombrie dans la même teinte jusqu’à atteindre un contraste d’au moins 3:1 avec l’arrière-plan de la page. Les règles du thème qui masqueraient encore le contour perdent leur outline: none, sauf si elles montrent le focus d’une autre façon, par exemple avec une bordure ou une ombre. Le contour a une seule couleur pour tout le thème : sur les sections dotées d’un schéma de couleurs sombre, il peut donc avoir besoin d’une couleur plus claire, ce que votre développeur vérifie dans l’aperçu.

    Règles couvertes
    • vs-focus-visible AUTO
    Types de fichiers modifiés
    .css.liquid
    Avant et après Données d’exemple

    assets/base.css.liquid Modifications apportées à assets/base.css.liquid (lignes ajoutées : 7, lignes supprimées : 0)

    Modifications apportées à assets/base.css.liquid (lignes ajoutées : 7, lignes supprimées : 0)
    Ligne avant Ligne après Modification Code
    1866 1866 }
    1867 1867
    1868 1868 /* ----------------------------------------------------------------- motion */
    1869 Ajoutée
    1870 Ajoutée /* validiscan:focus-visible-styles */
    1871 Ajoutée :focus-visible {
    1872 Ajoutée outline: 2px solid #1f4d3a;
    1873 Ajoutée outline-offset: 2px;
    1874 Ajoutée }
    1875 Ajoutée /* /validiscan:focus-visible-styles */
  • Un ordre de tabulation qui suit la page remove-positive-tabindex Un tabindex supérieur à 0 est retiré ou fixé à 0, pour que la touche Tab suive l’ordre de la page, sauf s’il est écrit par le code des templates du thème.

    Un tabindex supérieur à 0 fait passer un élément en tête de l’ordre de tabulation. La recette le retire des liens, des boutons, des champs de formulaire et des autres éléments qui peuvent de toute façon recevoir le focus, et le fixe à 0 sur les autres éléments, afin qu’ils restent atteignables pendant que la touche Tab suit l’ordre de la page. Un tabindex écrit par le code des templates du thème est laissé à une personne. La recette traite aussi les constats du contrôle de l’ordre de tabulation vs-focus-order qui portent sur un tabindex supérieur à 0 ; le reste de ce contrôle demeure MANUAL.

    Règles couvertes
    • tabindex AUTO
    • vs-focus-order MANUAL
    Types de fichiers modifiés
    .liquid
    Avant et après Données d’exemple

    sections/header.liquid Modifications apportées à sections/header.liquid (lignes ajoutées : 1, lignes supprimées : 1)

    Modifications apportées à sections/header.liquid (lignes ajoutées : 1, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    37 37
    38 38 <div class="header__search">
    39 39 <form action="{{ routes.search_url }}" method="get" role="search" class="search">
    40 Supprimée <input class="search__input field__input" type="search" name="q" value="" placeholder="{{ 'general.search.placeholder' | t }}" tabindex="1">
    40 Ajoutée <input class="search__input field__input" type="search" name="q" value="" placeholder="{{ 'general.search.placeholder' | t }}">
    41 41 <button type="submit" class="search__button">
    42 42 {%- render 'icon', icon: 'search', size: 20 -%}
    43 43 </button>
  • Des commandes réservées à la souris transformées en boutons button-semantics Les commandes en <div> ou <span> réservées à la souris, qu’un script écoute et dont la fonction est claire, deviennent de vrais boutons.

    Les éléments cliquables qui ne fonctionnent qu’à la souris, comme les points d’un diaporama ou les choix d’un bandeau cookies construits avec des éléments <div> ou <span>, deviennent de vrais éléments <button>. Chaque classe et chaque attribut sont conservés, de sorte que le script du thème continue de fonctionner, et les touches Entrée et Espace font désormais ce que fait un clic. Un bouton sans nom en reçoit un d’après sa fonction, par exemple « Load slide 2 of 3 », et une petite réinitialisation de style conserve son apparence. Un élément qu’aucun script n’écoute, ou dont la fonction n’est pas claire, est laissé tel quel.

    Règles couvertes
    • vs-carousel AUTO
    • vs-cookie-banner ASSISTED
    Types de fichiers modifiés
    .css.liquid.liquid
    Avant et après Données d’exemple

    assets/base.css.liquid Modifications apportées à assets/base.css.liquid (lignes ajoutées : 14, lignes supprimées : 0)

    Modifications apportées à assets/base.css.liquid (lignes ajoutées : 14, lignes supprimées : 0)
    Ligne avant Ligne après Modification Code
    1866 1866 }
    1867 1867
    1868 1868 /* ----------------------------------------------------------------- motion */
    1869 Ajoutée
    1870 Ajoutée /* validiscan:button-semantics */
    1871 Ajoutée :where(button.slider-counter__link) {
    1872 Ajoutée appearance: none;
    1873 Ajoutée margin: 0;
    1874 Ajoutée padding: 0;
    1875 Ajoutée border: 0;
    1876 Ajoutée background: none;
    1877 Ajoutée color: inherit;
    1878 Ajoutée font: inherit;
    1879 Ajoutée text-align: inherit;
    1880 Ajoutée cursor: pointer;
    1881 Ajoutée }
    1882 Ajoutée /* /validiscan:button-semantics */

    sections/slideshow.liquid Modifications apportées à sections/slideshow.liquid (lignes ajoutées : 1, lignes supprimées : 1)

    Modifications apportées à sections/slideshow.liquid (lignes ajoutées : 1, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    62 62 </button>
    63 63 <div class="slider-counter">
    64 64 {%- for block in section.blocks %}
    65 Supprimée <span class="slider-counter__link" data-slide-to="{{ forloop.index0 }}"><span class="dot"></span></span>
    65 Ajoutée <button class="slider-counter__link" data-slide-to="{{ forloop.index0 }}" type="button"><span class="dot"></span><span class="visually-hidden">{{ 'accessibility.load_slide' | t: index: forloop.index, count: forloop.length }}</span></button>
    66 66 {%- endfor %}
    67 67 </div>
    68 68 <button type="button" class="slider-button slider-button--next" name="next" data-slide-next>

Zoom, cibles tactiles et contraste

  • Zoom autorisé sur téléphone meta-viewport-zoom user-scalable=no et tout maximum-scale inférieur à 5 sont retirés des balises viewport, pour que les visiteurs puissent zoomer jusqu’à 500 %, sauf si la limite est fixée par le code des templates du thème.

    La recette retire user-scalable=no et tout maximum-scale inférieur à 5 des balises viewport des fichiers Liquid du thème, de sorte que les visiteurs puissent agrandir votre boutique en zoomant avec deux doigts jusqu’à 500 %. Les autres réglages du viewport restent exactement tels quels. Une limite de zoom fixée par le code des templates du thème est laissée à une personne.

    Règles couvertes
    • meta-viewport AUTO
    • meta-viewport-large AUTO
    Types de fichiers modifiés
    .liquid
    Avant et après Données d’exemple

    layout/checkout.liquid Modifications apportées à layout/checkout.liquid (lignes ajoutées : 1, lignes supprimées : 1)

    Modifications apportées à layout/checkout.liquid (lignes ajoutées : 1, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    6 6 <html class="no-js">
    7 7 <head>
    8 8 <meta charset="utf-8">
    9 Supprimée <meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no">
    9 Ajoutée <meta name="viewport" content="width=device-width,initial-scale=1">
    10 10 <meta name="robots" content="noindex">
    11 11 <link rel="canonical" href="{{ canonical_url }}">
    12 12 <!-- Checkout assets: //cdn.shopify.com/s/files/1/0712/3456/7890/t/12/assets/ (served locally by the fixture server) -->

    layout/theme.focused.liquid Modifications apportées à layout/theme.focused.liquid (lignes ajoutées : 1, lignes supprimées : 1)

    Modifications apportées à layout/theme.focused.liquid (lignes ajoutées : 1, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    10 10 <head>
    11 11 <meta charset="utf-8">
    12 12 <meta http-equiv="X-UA-Compatible" content="IE=edge">
    13 Supprimée <meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no">
    13 Ajoutée <meta name="viewport" content="width=device-width,initial-scale=1">
    14 14 <title></title>
    15 15 <link rel="canonical" href="{{ canonical_url }}">
    16 16 <!-- Theme assets: //cdn.shopify.com/s/files/1/0712/3456/7890/t/12/assets/ (served locally by the fixture server) -->

    layout/theme.liquid Modifications apportées à layout/theme.liquid (lignes ajoutées : 1, lignes supprimées : 1)

    Modifications apportées à layout/theme.liquid (lignes ajoutées : 1, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    11 11 <head>
    12 12 <meta charset="utf-8">
    13 13 <meta http-equiv="X-UA-Compatible" content="IE=edge">
    14 Supprimée <meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no">
    14 Ajoutée <meta name="viewport" content="width=device-width,initial-scale=1">
    15 15 <meta name="theme-color" content="{{ settings.color_background }}">
    16 16 <link rel="canonical" href="{{ canonical_url }}">
    17 17 {%- comment -%} On the live store theme assets load from //cdn.shopify.com/s/files/1/0712/3456/7890/t/12/assets/; the fixture serves them from {{ routes.root_url }}assets/. {%- endcomment %}
  • Des cibles tactiles plus grandes target-size-padding Les commandes que le scan a trouvées trop petites, comme les icônes de l’en-tête ou les pastilles de couleur, reçoivent une taille minimale de 24 × 24 pixels.

    Les commandes que le scan a trouvées trop petites, comme les icônes de l’en-tête, les pastilles de couleur ou les boutons de quantité, reçoivent dans la feuille de style principale une taille minimale de 24 × 24 pixels, ciblée par leur classe. Les icônes qu’elles contiennent gardent leur taille. Un lien ou un autre élément que le thème laisse en affichage inline passe en inline-flex, avec son icône centrée, car les éléments inline ignorent une taille minimale.

    Règles couvertes
    • vs-target-size AUTO
    Types de fichiers modifiés
    .css.liquid
    Avant et après Données d’exemple

    assets/base.css.liquid Modifications apportées à assets/base.css.liquid (lignes ajoutées : 10, lignes supprimées : 0)

    Modifications apportées à assets/base.css.liquid (lignes ajoutées : 10, lignes supprimées : 0)
    Ligne avant Ligne après Modification Code
    1866 1866 }
    1867 1867
    1868 1868 /* ----------------------------------------------------------------- motion */
    1869 Ajoutée
    1870 Ajoutée /* validiscan:target-size-padding */
    1871 Ajoutée .header__icon--account,
    1872 Ajoutée .header__icon--cart,
    1873 Ajoutée .swatch--button,
    1874 Ajoutée .quantity__button {
    1875 Ajoutée min-width: 24px;
    1876 Ajoutée min-height: 24px;
    1877 Ajoutée }
    1878 Ajoutée /* /validiscan:target-size-padding */
  • Des couleurs de texte suffisamment contrastées contrast-tokens Une couleur de texte qui échoue au contrôle du contraste, définie à un seul endroit et non partagée, passe à la nuance la plus proche de la même teinte qui atteint le contraste requis.

    Lorsqu’un texte échoue au contrôle du contraste et que sa couleur est définie à un seul endroit, cette couleur passe à la nuance la plus proche, plus claire ou plus foncée, de la même teinte, qui atteint le contraste requis avec chaque arrière-plan que le scan a relevé pour ce texte. Cet endroit peut être la règle de feuille de style qui met le texte en forme, ou une variable CSS ou un réglage de couleur de config/settings_data.json que rien d’autre dans le thème n’utilise. Une couleur calculée en Liquid ou définie à plusieurs endroits est laissée à une personne, de même qu’une couleur partagée, car la modifier affecterait des paires de couleurs que le scan n’a pas mesurées.

    Règles couvertes
    • color-contrast ASSISTED
    Types de fichiers modifiés
    .css.liquid
    Avant et après Données d’exemple

    assets/base.css.liquid Modifications apportées à assets/base.css.liquid (lignes ajoutées : 3, lignes supprimées : 3)

    Modifications apportées à assets/base.css.liquid (lignes ajoutées : 3, lignes supprimées : 3)
    Ligne avant Ligne après Modification Code
    745 745 font-size: 0.8125rem;
    746 746 letter-spacing: 0.04em;
    747 747 text-transform: uppercase;
    748 Supprimée color: #929292;
    748 Ajoutée color: #767676;
    749 749 }
    750 750
    751 751 .rating {
    1013 1013
    1014 1014 .copyright__content {
    1015 1015 margin: 0;
    1016 Supprimée color: #929292;
    1016 Ajoutée color: #6f6f6f;
    1017 1017 }
    1018 1018
    1019 1019 .policies {
    1077 1077
    1078 1078 .cookie-banner__text,
    1079 1079 .cookie-banner__link {
    1080 Supprimée color: #9a9a9a;
    1080 Ajoutée color: #767676;
    1081 1081 }
    1082 1082
    1083 1083 .cookie-banner__icon-button {

Mouvement, diaporamas et son

  • Moins de mouvement lorsque le visiteur le demande reduced-motion-guard Lorsque l’appareil d’un visiteur est réglé pour réduire les mouvements, les animations CSS et les transitions sont écourtées, le défilement fluide est désactivé et la lecture automatique d’un diaporama lancée par le script du thème n’a pas lieu.

    Lorsque l’appareil d’un visiteur est réglé pour réduire les mouvements, un bloc placé à la fin de la feuille de style principale ne laisse chaque animation CSS s’exécuter qu’une fois, trop brièvement pour qu’on la voie, raccourcit les transitions et désactive le défilement fluide. Lorsque le script du thème lance lui-même la lecture automatique d’un diaporama, ce lancement n’a pas lieu pour ces visiteurs. Le mouvement piloté par un script tiers n’est pas modifié par cette recette.

    Règles couvertes
    • vs-motion AUTO
    Types de fichiers modifiés
    .css.liquid
    Avant et après Données d’exemple

    assets/base.css.liquid Modifications apportées à assets/base.css.liquid (lignes ajoutées : 13, lignes supprimées : 0)

    Modifications apportées à assets/base.css.liquid (lignes ajoutées : 13, lignes supprimées : 0)
    Ligne avant Ligne après Modification Code
    1866 1866 }
    1867 1867
    1868 1868 /* ----------------------------------------------------------------- motion */
    1869 Ajoutée
    1870 Ajoutée /* validiscan:reduced-motion-guard */
    1871 Ajoutée @media (prefers-reduced-motion: reduce) {
    1872 Ajoutée *,
    1873 Ajoutée *::before,
    1874 Ajoutée *::after {
    1875 Ajoutée animation-duration: 0.01ms !important;
    1876 Ajoutée animation-iteration-count: 1 !important;
    1877 Ajoutée transition-duration: 0.01ms !important;
    1878 Ajoutée scroll-behavior: auto !important;
    1879 Ajoutée }
    1880 Ajoutée }
    1881 Ajoutée /* /validiscan:reduced-motion-guard */
  • Un bouton de pause pour les diaporamas animés slider-pause-control Un diaporama qui défile tout seul reçoit un bouton visible et traduit pour le mettre en pause et le relancer, relié à sa propre lecture automatique.

    Un diaporama qui défile tout seul reçoit un bouton visible et traduit pour le mettre en pause et le relancer, placé parmi ses commandes et affiché seulement lorsque la lecture automatique est active. Un court script ajouté au fichier de script principal du thème relie le bouton à la lecture automatique propre au diaporama, qu’il s’agisse de celui de Dawn, de Swiper, de Slick, de Flickity, de Splide ou d’une animation CSS. Pour les visiteurs dont l’appareil demande de réduire les mouvements, le diaporama démarre en pause.

    Règles couvertes
    • vs-carousel AUTO
    Types de fichiers modifiés
    .css.liquid.js.json.liquid
    Avant et après Données d’exemple

    assets/base.css.liquid Modifications apportées à assets/base.css.liquid (lignes ajoutées : 21, lignes supprimées : 0)

    Modifications apportées à assets/base.css.liquid (lignes ajoutées : 21, lignes supprimées : 0)
    Ligne avant Ligne après Modification Code
    1866 1866 }
    1867 1867
    1868 1868 /* ----------------------------------------------------------------- motion */
    1869 Ajoutée
    1870 Ajoutée /* validiscan:slider-pause-control */
    1871 Ajoutée [data-autoplay-paused],
    1872 Ajoutée [data-autoplay-paused] * {
    1873 Ajoutée animation-play-state: paused !important;
    1874 Ajoutée }
    1875 Ajoutée
    1876 Ajoutée .slider-pause {
    1877 Ajoutée display: inline-flex;
    1878 Ajoutée align-items: center;
    1879 Ajoutée justify-content: center;
    1880 Ajoutée min-width: 2.75rem;
    1881 Ajoutée min-height: 2.75rem;
    1882 Ajoutée padding: 0.5rem 1rem;
    1883 Ajoutée border: 1px solid currentColor;
    1884 Ajoutée background: transparent;
    1885 Ajoutée color: inherit;
    1886 Ajoutée font: inherit;
    1887 Ajoutée cursor: pointer;
    1888 Ajoutée }
    1889 Ajoutée /* /validiscan:slider-pause-control */

    assets/global.js Modifications apportées à assets/global.js (lignes ajoutées : 53, lignes supprimées : 0)

    Modifications apportées à assets/global.js (lignes ajoutées : 53, lignes supprimées : 0)
    Ligne avant Ligne après Modification Code
    412 412 if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', boot);
    413 413 else boot();
    414 414 })();
    415 Ajoutée
    416 Ajoutée /* validiscan:slider-pause-control */
    417 Ajoutée (function () {
    418 Ajoutée 'use strict';
    419 Ajoutée var ROOTS = 'slideshow-component, slider-component, .swiper, .swiper-container, .slick-slider, .flickity-enabled, .splide, [data-autoplay]';
    420 Ajoutée var reduce = window.matchMedia ? window.matchMedia('(prefers-reduced-motion: reduce)') : null;
    421 Ajoutée
    422 Ajoutée function rootOf(button) {
    423 Ajoutée return button.closest(ROOTS) || button.previousElementSibling;
    424 Ajoutée }
    425 Ajoutée
    426 Ajoutée function setPaused(button, paused) {
    427 Ajoutée var root = rootOf(button);
    428 Ajoutée if (!root) return;
    429 Ajoutée if (paused) root.setAttribute('data-autoplay-paused', '');
    430 Ajoutée else root.removeAttribute('data-autoplay-paused');
    431 Ajoutée if (root.swiper && root.swiper.autoplay) {
    432 Ajoutée if (paused) root.swiper.autoplay.stop();
    433 Ajoutée else root.swiper.autoplay.start();
    434 Ajoutée }
    435 Ajoutée var $ = window.jQuery;
    436 Ajoutée if ($ && $(root).hasClass('slick-initialized')) $(root).slick(paused ? 'slickPause' : 'slickPlay');
    437 Ajoutée var flickity = window.Flickity && window.Flickity.data(root);
    438 Ajoutée if (flickity) {
    439 Ajoutée if (paused) flickity.pausePlayer();
    440 Ajoutée else flickity.unpausePlayer();
    441 Ajoutée }
    442 Ajoutée var autoplay = root.splide && root.splide.Components && root.splide.Components.Autoplay;
    443 Ajoutée if (autoplay) {
    444 Ajoutée if (paused) autoplay.pause();
    445 Ajoutée else autoplay.play();
    446 Ajoutée }
    447 Ajoutée if (root.localName.indexOf('-') > 0 && typeof root.pause === 'function' && typeof root.play === 'function') {
    448 Ajoutée if (paused) root.pause();
    449 Ajoutée else root.play();
    450 Ajoutée }
    451 Ajoutée button.setAttribute('data-paused', paused ? 'true' : 'false');
    452 Ajoutée button.textContent = button.getAttribute(paused ? 'data-label-play' : 'data-label-pause') || button.textContent;
    453 Ajoutée }
    454 Ajoutée
    455 Ajoutée function init() {
    456 Ajoutée Array.prototype.forEach.call(document.querySelectorAll('[data-slider-pause]'), function (button) {
    457 Ajoutée button.addEventListener('click', function () {
    458 Ajoutée setPaused(button, button.getAttribute('data-paused') !== 'true');
    459 Ajoutée });
    460 Ajoutée if (reduce && reduce.matches) setPaused(button, true);
    461 Ajoutée });
    462 Ajoutée }
    463 Ajoutée
    464 Ajoutée if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init);
    465 Ajoutée else init();
    466 Ajoutée })();
    467 Ajoutée /* /validiscan:slider-pause-control */

    locales/en.default.json Modifications apportées à locales/en.default.json (lignes ajoutées : 3, lignes supprimées : 1)

    Modifications apportées à locales/en.default.json (lignes ajoutées : 3, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    34 34 "total_reviews": "{{ count }} reviews",
    35 35 "link_messages": {
    36 36 "new_window": "Opens in a new window."
    37 Supprimée }
    37 Ajoutée },
    38 Ajoutée "pause_slideshow": "Pause slideshow",
    39 Ajoutée "play_slideshow": "Play slideshow"
    38 40 },
    39 41 "sections": {
    40 42 "header": {

    sections/slideshow.liquid Modifications apportées à sections/slideshow.liquid (lignes ajoutées : 3, lignes supprimées : 0)

    Modifications apportées à sections/slideshow.liquid (lignes ajoutées : 3, lignes supprimées : 0)
    Ligne avant Ligne après Modification Code
    68 68 <button type="button" class="slider-button slider-button--next" name="next" data-slide-next>
    69 69 {%- render 'icon', icon: 'chevron-right', size: 20 -%}
    70 70 </button>
    71 Ajoutée {%- if autoplay %}
    72 Ajoutée <button type="button" class="slider-pause" data-slider-pause data-label-pause="{{ 'accessibility.pause_slideshow' | t | escape }}" data-label-play="{{ 'accessibility.play_slideshow' | t | escape }}">{{ 'accessibility.pause_slideshow' | t }}</button>
    73 Ajoutée {%- endif %}
    71 74 </div>
    72 75 </slideshow-component>
    73 76
  • Aucun son qui démarre tout seul mute-autoplay Une vidéo qui se lance toute seule joue en silence et un son ne démarre plus tout seul, sauf dans les lecteurs YouTube et Vimeo intégrés ; sur Shopify, la recette n’est pas utilisée pour les constats de vs-media.

    Une vidéo qui se lance toute seule reçoit muted et playsinline, de sorte qu’elle continue de jouer en silence, comme une vidéo d’arrière-plan, et le filtre video_tag de Shopify reçoit muted: true. Un son qui démarre tout seul ne le fait plus. Les lecteurs YouTube et Vimeo intégrés sont laissés à une personne. Dans un scan Validiscan, le son qui démarre tout seul est signalé par le contrôle des médias vs-media, qui remplace la règle d’axe-core que cette recette couvre. vs-media a le niveau MANUAL, et sur Shopify cette recette n’est pas utilisée pour ses constats.

    Règles couvertes
    • no-autoplay-audio AUTO contrôle assuré par vs-media
    Types de fichiers modifiés
    .liquid
    Avant et après Données d’exemple

    sections/announcement-bar.liquid Modifications apportées à sections/announcement-bar.liquid (lignes ajoutées : 2, lignes supprimées : 2)

    Modifications apportées à sections/announcement-bar.liquid (lignes ajoutées : 2, lignes supprimées : 2)
    Ligne avant Ligne après Modification Code
    3 3 -%}
    4 4 <div class="announcement-bar color-accent"{% if bar_lang != '' %} lang="{{ bar_lang }}"{% endif %}>
    5 5 <div class="page-width">
    6 Supprimée <audio class="announcement-bar__chime" src="{{ 'chime.wav' | asset_url }}" autoplay></audio>
    7 Supprimée <video class="announcement-bar__clip" src="{{ 'chime.wav' | asset_url }}" autoplay loop width="16" height="16"></video>
    6 Ajoutée <audio class="announcement-bar__chime" src="{{ 'chime.wav' | asset_url }}"></audio>
    7 Ajoutée <video class="announcement-bar__clip" src="{{ 'chime.wav' | asset_url }}" autoplay loop width="16" height="16" muted playsinline></video>
    8 8 <p class="announcement-bar__message">{{ section.settings.text | escape }}</p>
    9 9 </div>
    10 10 </div>

Formulaires, prix et panier

  • Des étiquettes reliées à leurs champs label-association Une étiquette déjà visible sur la page, mais sans lien avec son champ de formulaire, y est reliée, sans que la mise en page change.

    Un champ de formulaire dont le texte d’étiquette est déjà visible sur la page, mais sans lien avec le champ, est relié à ce texte : un <label> placé à côté reçoit un for qui pointe vers le champ, ou un texte situé juste avant le champ, comme le nom d’une option de taille ou de couleur, devient son étiquette grâce à aria-labelledby, de sorte que la mise en page ne change pas. Les lecteurs d’écran lisent alors l’étiquette lorsque le champ reçoit le focus. Un champ qui n’a qu’un texte indicatif (placeholder) est laissé à une personne, car rédiger une étiquette est une décision de contenu.

    Règles couvertes
    • label AUTO contrôle assuré par vs-forms-ecommerce
    • select-name ASSISTED
    • vs-forms-ecommerce AUTO
    Types de fichiers modifiés
    .liquid
    Avant et après Données d’exemple

    sections/main-collection.liquid Modifications apportées à sections/main-collection.liquid (lignes ajoutées : 2, lignes supprimées : 2)

    Modifications apportées à sections/main-collection.liquid (lignes ajoutées : 2, lignes supprimées : 2)
    Ligne avant Ligne après Modification Code
    64 64 <div class="collection__products">
    65 65 <div class="collection__toolbar">
    66 66 <div class="collection__sort">
    67 Supprimée <label class="collection__sort-label">Sort by</label>
    68 Supprimée <select name="sort_by" class="select__select" form="FacetFiltersForm">
    67 Ajoutée <label class="collection__sort-label" for="SortBy-{{ section.id }}">Sort by</label>
    68 Ajoutée <select name="sort_by" class="select__select" form="FacetFiltersForm" id="SortBy-{{ section.id }}">
    69 69 <option value="manual" selected>Featured</option>
    70 70 <option value="best-selling">Best selling</option>
    71 71 <option value="price-ascending">Price, low to high</option>

    sections/main-product.liquid Modifications apportées à sections/main-product.liquid (lignes ajoutées : 2, lignes supprimées : 2)

    Modifications apportées à sections/main-product.liquid (lignes ajoutées : 2, lignes supprimées : 2)
    Ligne avant Ligne après Modification Code
    94 94 </div>
    95 95 {%- else %}
    96 96 <div class="product-form__input product-form__input--dropdown">
    97 Supprimée <p class="form__label">{{ option.name | escape }}</p>
    97 Ajoutée <p class="form__label" id="Options-{{ section.id }}-{{ forloop.index0 }}-label">{{ option.name | escape }}</p>
    98 98 <div class="select">
    99 Supprimée <select class="select__select" name="options[{{ option.name | escape }}]" data-option-index="{{ option_index }}">
    99 Ajoutée <select class="select__select" name="options[{{ option.name | escape }}]" data-option-index="{{ option_index }}" aria-labelledby="Options-{{ section.id }}-{{ forloop.index0 }}-label">
    100 100 {%- for value in option.values %}
    101 101 <option value="{{ value | escape }}"{% if value == option.selected_value %} selected{% endif %}>{{ value | escape }}</option>
    102 102 {%- endfor %}
  • Des champs d’adresse, de compte et de connexion que les navigateurs peuvent remplir autocomplete-tokens Les champs d’adresse, de compte, de connexion et de contact que le scan a signalés reçoivent la valeur autocomplete qui correspond à ce qu’ils demandent, lorsque le code le montre.

    Les champs d’adresse, de compte, de connexion et de contact que le scan a signalés reçoivent la valeur autocomplete qui correspond à ce qu’ils demandent, comme l’e-mail, le prénom et le nom, l’adresse postale, le code postal, le pays, le numéro de téléphone ou le mot de passe. La valeur est déduite du type du champ, de son nom, de son étiquette et de son texte indicatif. Lorsqu’un snippet produit ses champs à partir de paramètres, les champs reprennent un paramètre autocomplete, et chaque appel render du snippet transmet la valeur qui correspond à ses propres arguments. Les navigateurs peuvent alors remplir les champs, et les technologies d’assistance peuvent savoir à quoi sert chacun. Un champ dont le code ne montre pas la finalité est laissé tel quel.

    Règles couvertes
    • autocomplete-valid AUTO contrôle assuré par vs-forms-ecommerce
    • vs-forms-ecommerce AUTO
    Types de fichiers modifiés
    .liquid
    Avant et après Données d’exemple

    sections/contact-form.liquid Modifications apportées à sections/contact-form.liquid (lignes ajoutées : 1, lignes supprimées : 1)

    Modifications apportées à sections/contact-form.liquid (lignes ajoutées : 1, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    14 14 {%- form 'contact', id: 'ContactForm', class: 'contact__form' %}
    15 15 <div class="contact__fields">
    16 16 <div class="field">
    17 Supprimée <input class="field__input" type="text" name="contact[name]" placeholder="{{ 'templates.contact.form.name' | t }}">
    17 Ajoutée <input class="field__input" type="text" name="contact[name]" placeholder="{{ 'templates.contact.form.name' | t }}" autocomplete="name">
    18 18 </div>
    19 19 <div class="field">
    20 20 <input class="field__input" type="email" name="contact[email]" placeholder="{{ 'templates.contact.form.email' | t }} *" required>

    sections/footer.liquid Modifications apportées à sections/footer.liquid (lignes ajoutées : 1, lignes supprimées : 1)

    Modifications apportées à sections/footer.liquid (lignes ajoutées : 1, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    11 11 {%- form 'customer', id: 'ContactFooter', class: 'footer__newsletter newsletter-form' -%}
    12 12 <input type="hidden" name="contact[tags]" value="newsletter">
    13 13 <div class="newsletter-form__field-wrapper">
    14 Supprimée <input type="email" name="contact[email]" class="field__input" placeholder="{{ 'newsletter.label' | t }}" autocorrect="off" autocapitalize="off">
    14 Ajoutée <input type="email" name="contact[email]" class="field__input" placeholder="{{ 'newsletter.label' | t }}" autocorrect="off" autocapitalize="off" autocomplete="email">
    15 15 <button type="submit" class="button newsletter-form__button" name="commit">{{ 'newsletter.button' | t }}</button>
    16 16 </div>
    17 17 {%- endform -%}

    sections/main-login.liquid Modifications apportées à sections/main-login.liquid (lignes ajoutées : 1, lignes supprimées : 1)

    Modifications apportées à sections/main-login.liquid (lignes ajoutées : 1, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    10 10 {%- form 'customer_login', novalidate: 'novalidate' %}
    11 11 <div class="field">
    12 12 <label class="field__label" for="CustomerEmail">{{ 'customer.login_page.email' | t }}</label>
    13 Supprimée <input class="field__input" type="email" name="customer[email]" id="CustomerEmail" autocorrect="off" autocapitalize="off">
    13 Ajoutée <input class="field__input" type="email" name="customer[email]" id="CustomerEmail" autocorrect="off" autocapitalize="off" autocomplete="email">
    14 14 </div>
    15 15 <div class="field">
    16 16 <label class="field__label" for="CustomerPassword">{{ 'customer.login_page.password' | t }}</label>

    snippets/checkout-field.liquid Modifications apportées à snippets/checkout-field.liquid (lignes ajoutées : 4, lignes supprimées : 4)

    Modifications apportées à snippets/checkout-field.liquid (lignes ajoutées : 4, lignes supprimées : 4)
    Ligne avant Ligne après Modification Code
    15 15 <div class="field">
    16 16 {%- case legacy %}
    17 17 {%- when 'placeholder' %}
    18 Supprimée <input class="field__input" type="{{ field_type }}" id="{{ field_id }}" name="{{ field_name }}" placeholder="{{ label }}"{% if required %} required{% endif %}>
    18 Ajoutée <input class="field__input" type="{{ field_type }}" id="{{ field_id }}" name="{{ field_name }}" placeholder="{{ label }}"{% if required %} required{% endif %} autocomplete="{{ autocomplete }}">
    19 19 {%- when 'starred' %}
    20 20 <label class="field__label" for="{{ field_id }}">{{ label }} *</label>
    21 Supprimée <input class="field__input" type="{{ field_type }}" id="{{ field_id }}" name="{{ field_name }}">
    21 Ajoutée <input class="field__input" type="{{ field_type }}" id="{{ field_id }}" name="{{ field_name }}" autocomplete="{{ autocomplete }}">
    22 22 {%- when 'off' %}
    23 23 <label class="field__label" for="{{ field_id }}">{{ label }}</label>
    24 Supprimée <input class="field__input" type="{{ field_type }}" id="{{ field_id }}" name="{{ field_name }}" autocomplete="off"{% if required %} required{% endif %}>
    24 Ajoutée <input class="field__input" type="{{ field_type }}" id="{{ field_id }}" name="{{ field_name }}" autocomplete="{{ autocomplete }}"{% if required %} required{% endif %}>
    25 25 {%- else %}
    26 26 <label class="field__label" for="{{ field_id }}">{{ label }}</label>
    27 Supprimée <input class="field__input" type="{{ field_type }}" id="{{ field_id }}" name="{{ field_name }}"{% if required %} required{% endif %}>
    27 Ajoutée <input class="field__input" type="{{ field_type }}" id="{{ field_id }}" name="{{ field_name }}"{% if required %} required{% endif %} autocomplete="{{ autocomplete }}">
    28 28 {%- endcase %}
    29 29 </div>
  • Les changements de prix, de stock et de panier annoncés live-region-cart-variant Le prix, la mention de stock ou le sous-total du panier que le script du thème réécrit est marqué comme une région d’état que les lecteurs d’écran annoncent, sauf si la zone contient aussi des boutons ou des liens.

    La partie d’une page que le script du thème réécrit lorsqu’un client choisit une autre variante ou change une quantité, comme le prix, la mention de stock ou le sous-total du panier, est marquée comme une région d’état. Les lecteurs d’écran annoncent alors la nouvelle valeur sans que le client ait à s’y déplacer. Le script du thème lui-même n’est pas modifié. Une zone qui contient aussi des boutons ou des liens, qui seraient lus avec elle, est laissée telle quelle.

    Règles couvertes
    • vs-live-updates AUTO
    Types de fichiers modifiés
    .liquid
    Avant et après Données d’exemple

    sections/main-cart.liquid Modifications apportées à sections/main-cart.liquid (lignes ajoutées : 1, lignes supprimées : 1)

    Modifications apportées à sections/main-cart.liquid (lignes ajoutées : 1, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    37 37
    38 38 <div class="cart__footer">
    39 39 <h2 class="cart__summary-title">Order summary</h2>
    40 Supprimée <p class="totals">
    40 Ajoutée <p class="totals" role="status">
    41 41 <span class="totals__label">{{ 'sections.cart.subtotal' | t }}</span>
    42 42 <span class="totals__value" data-cart-subtotal>{{ cart.total_price | money_with_currency }}</span>
    43 43 </p>

    sections/main-product.liquid Modifications apportées à sections/main-product.liquid (lignes ajoutées : 1, lignes supprimées : 1)

    Modifications apportées à sections/main-product.liquid (lignes ajoutées : 1, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    71 71 </div>
    72 72 {%- endif %}
    73 73
    74 Supprimée <div class="product__price" data-price-container>
    74 Ajoutée <div class="product__price" data-price-container role="status">
    75 75 {% render 'price', product: product, use_variant: true %}
    76 76 <p class="product__inventory" data-stock>{% if current_variant.available %}{{ 'products.product.in_stock' | t }}{% else %}{{ 'products.product.out_of_stock' | t }}{% endif %}</p>
    77 77 <p class="product__sku">{{ 'products.product.sku' | t }}: <span data-sku>{{ current_variant.sku }}</span></p>

Noms des icônes, des images et des contenus intégrés

  • Des noms pour les boutons et les liens qui n’ont qu’une icône icon-accessible-name Les boutons et les liens qui n’affichent qu’une icône reçoivent un nom qui dit ce qu’ils font, lorsque le code montre leur fonction.

    Les boutons et les liens qui n’affichent qu’une icône, comme la recherche, le panier, le compte, les flèches d’un diaporama, les boutons de quantité et les choix de cookies, reçoivent un nom qui dit ce qu’ils font, lorsque le code montre leur fonction. Le nom est un texte visuellement masqué à l’intérieur de la commande, ou un aria-label lorsque le thème n’a pas de classe pour le texte masqué. Un lien de logo dont l’image n’a pas d’alternative textuelle reçoit le nom de votre boutique. Une commande dont le nom devrait venir de votre propre contenu est laissée à une personne.

    Règles couvertes
    • button-name ASSISTED
    • link-name ASSISTED
    • image-alt ASSISTED
    • vs-carousel AUTO
    • vs-cookie-banner ASSISTED
    Types de fichiers modifiés
    .json.liquid
    buttons Données d’exemple

    locales/en.default.json Modifications apportées à locales/en.default.json (lignes ajoutées : 3, lignes supprimées : 1)

    Modifications apportées à locales/en.default.json (lignes ajoutées : 3, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    34 34 "total_reviews": "{{ count }} reviews",
    35 35 "link_messages": {
    36 36 "new_window": "Opens in a new window."
    37 Supprimée }
    37 Ajoutée },
    38 Ajoutée "accept_cookies": "Accept cookies",
    39 Ajoutée "reject_cookies": "Reject cookies"
    38 40 },
    39 41 "sections": {
    40 42 "header": {

    sections/header.liquid Modifications apportées à sections/header.liquid (lignes ajoutées : 1, lignes supprimées : 0)

    Modifications apportées à sections/header.liquid (lignes ajoutées : 1, lignes supprimées : 0)
    Ligne avant Ligne après Modification Code
    40 40 <input class="search__input field__input" type="search" name="q" value="" placeholder="{{ 'general.search.placeholder' | t }}" tabindex="1">
    41 41 <button type="submit" class="search__button">
    42 42 {%- render 'icon', icon: 'search', size: 20 -%}
    43 Ajoutée <span class="visually-hidden">{{ 'general.search.search' | t }}</span>
    43 44 </button>
    44 45 </form>
    45 46 </div>

    sections/main-product.liquid Modifications apportées à sections/main-product.liquid (lignes ajoutées : 1, lignes supprimées : 1)

    Modifications apportées à sections/main-product.liquid (lignes ajoutées : 1, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    88 88 <p class="form__label">{{ option.name | escape }}</p>
    89 89 <div class="swatch-list swatch-list--compact">
    90 90 {%- for swatch in option.swatches %}
    91 Supprimée <button type="button" class="swatch swatch--button{% if swatch.selected %} swatch--active{% endif %}" style="--swatch-color: {{ swatch.color }};" data-option-index="{{ option_index }}" data-value="{{ swatch.value | escape }}"></button>
    91 Ajoutée <button type="button" class="swatch swatch--button{% if swatch.selected %} swatch--active{% endif %}" style="--swatch-color: {{ swatch.color }};" data-option-index="{{ option_index }}" data-value="{{ swatch.value | escape }}"><span class="visually-hidden">{{ swatch.value | escape }}</span></button>
    92 92 {%- endfor %}
    93 93 </div>
    94 94 </div>

    sections/slideshow.liquid Modifications apportées à sections/slideshow.liquid (lignes ajoutées : 2, lignes supprimées : 0)

    Modifications apportées à sections/slideshow.liquid (lignes ajoutées : 2, lignes supprimées : 0)
    Ligne avant Ligne après Modification Code
    59 59 <div class="slideshow__controls">
    60 60 <button type="button" class="slider-button slider-button--prev" name="previous" data-slide-prev>
    61 61 {%- render 'icon', icon: 'chevron-left', size: 20 -%}
    62 Ajoutée <span class="visually-hidden">{{ 'accessibility.previous_slide' | t }}</span>
    62 63 </button>
    63 64 <div class="slider-counter">
    64 65 {%- for block in section.blocks %}
    67 68 </div>
    68 69 <button type="button" class="slider-button slider-button--next" name="next" data-slide-next>
    69 70 {%- render 'icon', icon: 'chevron-right', size: 20 -%}
    71 Ajoutée <span class="visually-hidden">{{ 'accessibility.next_slide' | t }}</span>
    70 72 </button>
    71 73 </div>
    72 74 </slideshow-component>

    snippets/cookie-banner.liquid Modifications apportées à snippets/cookie-banner.liquid (lignes ajoutées : 2, lignes supprimées : 0)

    Modifications apportées à snippets/cookie-banner.liquid (lignes ajoutées : 2, lignes supprimées : 0)
    Ligne avant Ligne après Modification Code
    23 23 <div class="cookie-banner__actions">
    24 24 <button type="button" class="cookie-banner__icon-button cookie-banner__icon-button--accept" data-cookie-accept>
    25 25 {%- render 'icon', icon: 'check', size: 20 -%}
    26 Ajoutée <span class="visually-hidden">{{ 'accessibility.accept_cookies' | t }}</span>
    26 27 </button>
    27 28 <button type="button" class="cookie-banner__icon-button" data-cookie-reject>
    28 29 {%- render 'icon', icon: 'close', size: 20 -%}
    30 Ajoutée <span class="visually-hidden">{{ 'accessibility.reject_cookies' | t }}</span>
    29 31 </button>
    30 32 </div>
    31 33 </div>

    snippets/quantity-input.liquid Modifications apportées à snippets/quantity-input.liquid (lignes ajoutées : 2, lignes supprimées : 0)

    Modifications apportées à snippets/quantity-input.liquid (lignes ajoutées : 2, lignes supprimées : 0)
    Ligne avant Ligne après Modification Code
    9 9 {%- endcomment -%}
    10 10 <div class="quantity quantity--compact" data-quantity{% if line %} data-line="{{ line }}"{% endif %}><button class="quantity__button" name="minus" type="button" data-quantity-minus>
    11 11 {%- render 'icon', icon: 'minus', size: 12 -%}
    12 Ajoutée <span class="visually-hidden">{{ 'products.product.quantity.decrease' | t: product: product_title }}</span>
    12 13 </button>
    13 14 <input class="quantity__input" type="number" name="{{ input_name }}" id="{{ input_id }}" value="{{ value | default: 1 }}" min="{% if line %}0{% else %}1{% endif %}" data-quantity-input>
    14 15 <button class="quantity__button" name="plus" type="button" data-quantity-plus>
    15 16 {%- render 'icon', icon: 'plus', size: 12 -%}
    17 Ajoutée <span class="visually-hidden">{{ 'products.product.quantity.increase' | t: product: product_title }}</span>
    16 18 </button></div>
    links Données d’exemple

    sections/footer.liquid Modifications apportées à sections/footer.liquid (lignes ajoutées : 1, lignes supprimées : 0)

    Modifications apportées à sections/footer.liquid (lignes ajoutées : 1, lignes supprimées : 0)
    Ligne avant Ligne après Modification Code
    37 37 {%- for social in shop.social %}
    38 38 <a href="{{ social.url }}" class="list-social__link link">
    39 39 {%- render 'icon', icon: social.icon, size: 20 -%}
    40 Ajoutée <span class="visually-hidden">{{ 'general.social.links.' | append: social.icon | t }}</span>
    40 41 </a>
    41 42 {%- endfor %}
    42 43 </ul>

    sections/header.liquid Modifications apportées à sections/header.liquid (lignes ajoutées : 3, lignes supprimées : 1)

    Modifications apportées à sections/header.liquid (lignes ajoutées : 3, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    22 22 </details>
    23 23
    24 24 {% if logo_is_heading %}<h1 class="header__heading">{% else %}<div class="header__heading">{% endif %}
    25 Supprimée <a href="{{ routes.root_url }}" class="header__heading-link"><img src="{{ 'logo.svg' | asset_url }}" width="{{ settings.logo_width }}" height="32" class="header__heading-logo"></a>
    25 Ajoutée <a href="{{ routes.root_url }}" class="header__heading-link"><img src="{{ 'logo.svg' | asset_url }}" width="{{ settings.logo_width }}" height="32" class="header__heading-logo" alt="{{ shop.name | escape }}"></a>
    26 26 {% if logo_is_heading %}</h1>{% else %}</div>{% endif %}
    27 27
    28 28 <nav class="header__inline-menu">
    50 50 {%- endif %}
    51 51 <a href="{{ routes.account_login_url }}" class="header__icon header__icon--account link">
    52 52 {%- render 'icon', icon: 'account', size: icon_size -%}
    53 Ajoutée <span class="visually-hidden">{{ 'sections.header.account' | t }}</span>
    53 54 </a>
    54 55 <a href="{{ routes.cart_url }}" class="header__icon header__icon--cart link" id="cart-icon-bubble">
    55 56 {%- render 'icon', icon: 'cart', size: icon_size -%}
    57 58 <span class="cart-count-bubble" aria-hidden="true"><span data-cart-count>{{ cart.item_count }}</span></span>
    58 59 {%- endif -%}
    59 60
    61 Ajoutée <span class="visually-hidden">{{ 'sections.header.cart' | t }}</span>
    60 62 </a>
    61 63 </div>
    62 64 </header>

    sections/main-cart.liquid Modifications apportées à sections/main-cart.liquid (lignes ajoutées : 1, lignes supprimées : 0)

    Modifications apportées à sections/main-cart.liquid (lignes ajoutées : 1, lignes supprimées : 0)
    Ligne avant Ligne après Modification Code
    26 26 {% render 'quantity-input', input_id: qty_id, input_name: 'updates[]', value: item.quantity, product_title: item.product.title, line: line %}
    27 27 <a href="{{ routes.cart_change_url }}?line={{ line }}&amp;quantity=0" class="cart-item__remove cart-item__remove--compact" data-cart-remove>
    28 28 {%- render 'icon', icon: 'trash', size: 16 -%}
    29 Ajoutée <span class="visually-hidden">{{ 'sections.cart.remove' | t: title: item.product.title }}</span>
    29 30 </a>
    30 31 </div>
    31 32 <div class="cart-item__totals">
  • Des images décoratives masquées aux lecteurs d’écran decorative-image-alt Seules les images dont le code prouve qu’elles sont décoratives sont masquées aux lecteurs d’écran ; l’alternative textuelle de toute autre image est laissée à une personne.

    Une image n’est marquée comme décorative que lorsque le code prouve qu’elle n’apporte rien : elle se trouve dans un lien ou un bouton qui a son propre texte, c’est une icône placée à côté de sa propre étiquette textuelle, ou c’est un espaceur ou un séparateur. Un <img> reçoit alors un alt="" vide, et une icône SVG reçoit aria-hidden="true", de sorte que les lecteurs d’écran l’ignorent au lieu de lire un nom de fichier ou le mot « image ». Toute autre image est du contenu, et son alternative textuelle est laissée à une personne.

    Règles couvertes
    • image-alt ASSISTED
    • role-img-alt ASSISTED
    • svg-img-alt ASSISTED
    Types de fichiers modifiés
    .liquid
    Avant et après Données d’exemple

    sections/footer.liquid Modifications apportées à sections/footer.liquid (lignes ajoutées : 1, lignes supprimées : 1)

    Modifications apportées à sections/footer.liquid (lignes ajoutées : 1, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    12 12 <input type="hidden" name="contact[tags]" value="newsletter">
    13 13 <div class="newsletter-form__field-wrapper">
    14 14 <input type="email" name="contact[email]" class="field__input" placeholder="{{ 'newsletter.label' | t }}" autocorrect="off" autocapitalize="off">
    15 Supprimée <button type="submit" class="button newsletter-form__button" name="commit"><img src="{{ 'logo.svg' | asset_url }}" class="newsletter-form__icon" width="16" height="16">{{ 'newsletter.button' | t }}</button>
    15 Ajoutée <button type="submit" class="button newsletter-form__button" name="commit"><img src="{{ 'logo.svg' | asset_url }}" class="newsletter-form__icon" width="16" height="16" alt="">{{ 'newsletter.button' | t }}</button>
    16 16 </div>
    17 17 {%- endform -%}
    18 18 </div>

    sections/header.liquid Modifications apportées à sections/header.liquid (lignes ajoutées : 1, lignes supprimées : 1)

    Modifications apportées à sections/header.liquid (lignes ajoutées : 1, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    46 46
    47 47 <div class="header__icons">
    48 48 {%- if section.settings.show_help_link %}
    49 Supprimée <a href="{{ section.settings.help_link_url }}" class="header__utility-link link"><svg class="header__utility-icon" role="img" viewBox="0 0 24 24" width="16" height="16"><circle cx="12" cy="12" r="9"/></svg>{{ section.settings.help_link_label | escape }}</a>
    49 Ajoutée <a href="{{ section.settings.help_link_url }}" class="header__utility-link link"><svg class="header__utility-icon" viewBox="0 0 24 24" width="16" height="16" aria-hidden="true" focusable="false"><circle cx="12" cy="12" r="9"/></svg>{{ section.settings.help_link_label | escape }}</a>
    50 50 {%- endif %}
    51 51 <a href="{{ routes.account_login_url }}" class="header__icon header__icon--account link">
    52 52 {%- render 'icon', icon: 'account', size: icon_size -%}
  • Des titres pour les cartes et les vidéos intégrées iframe-title Un cadre intégré sans titre reçoit un titre traduit qui dit ce qu’il montre, lorsque son adresse source ou son contenu l’indique.

    Un cadre intégré sans titre, comme une carte ou une vidéo YouTube ou Vimeo, reçoit un titre traduit qui dit ce qu’il montre. La recette le déduit de l’adresse source ou du contenu du cadre. Un cadre dont le code ne montre pas le contenu ne reçoit aucun titre générique ; il est laissé à une personne.

    Règles couvertes
    • frame-title AUTO
    Types de fichiers modifiés
    .json.liquid
    Avant et après Données d’exemple

    locales/en.default.json Modifications apportées à locales/en.default.json (lignes ajoutées : 2, lignes supprimées : 1)

    Modifications apportées à locales/en.default.json (lignes ajoutées : 2, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    34 34 "total_reviews": "{{ count }} reviews",
    35 35 "link_messages": {
    36 36 "new_window": "Opens in a new window."
    37 Supprimée }
    37 Ajoutée },
    38 Ajoutée "embed_map": "Map"
    38 39 },
    39 40 "sections": {
    40 41 "header": {

    sections/contact-form.liquid Modifications apportées à sections/contact-form.liquid (lignes ajoutées : 1, lignes supprimées : 1)

    Modifications apportées à sections/contact-form.liquid (lignes ajoutées : 1, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    8 8 {%- endcapture -%}
    9 9 <div class="contact-section page-width page-width--narrow">
    10 10 <h2 class="contact-section__heading">{{ section.settings.map_heading | escape }}</h2>
    11 Supprimée <iframe class="store-map" srcdoc="{{ map_document | escape }}" width="600" height="360"></iframe>
    11 Ajoutée <iframe class="store-map" srcdoc="{{ map_document | escape }}" width="600" height="360" title="{{ 'accessibility.embed_map' | t | escape }}"></iframe>
    12 12
    13 13 <h2 class="contact-section__heading">{{ 'templates.contact.form.title' | t }}</h2>
    14 14 {%- form 'contact', id: 'ContactForm', class: 'contact__form' %}
Détails : les niveaux, le thème de test et le texte dans les langues de votre boutique

Une recette est une modification déterministe pour un type d’échec : le même code reçoit toujours la même modification. Validiscan dispose de 20 recettes pour les thèmes Shopify. Chacune n’intervient que là où le code du thème montre quelle modification est la bonne ; là où il ne le montre pas, la recette ne change rien et le constat est laissé à une personne.

Sous chaque recette figurent les règles qu’elle couvre, avec le niveau de chaque règle dans le catalogue de Validiscan. AUTO signifie qu’une recette est la correction standard de la règle. ASSISTED signifie que la correction demande du jugement : une modification est donc rédigée, puis relue. MANUAL signifie que la règle demande la décision d’une personne, et Validiscan donne des indications au lieu d’une modification du code. Dans un projet, les recettes sont appliquées aux constats des règles du niveau AUTO. Lorsqu’une recette énumère aussi une règle du niveau ASSISTED ou MANUAL, un constat de cette règle suit à la place la voie ASSISTED ou MANUAL. Une règle marquée « contrôle assuré par » un autre contrôle n’est pas exécutée seule lors d’un scan : cet autre contrôle signale le même échec.

Les types de fichiers et l’avant et l’après de chaque recette proviennent des tests de l’application elle-même. Ils s’exécutent sur son thème de test Shopify, un thème Liquid construit comme le thème Dawn de Shopify, dans lequel des échecs d’accessibilité ont été introduits volontairement, et ils vérifient que l’échec a disparu après la modification ; la plupart vérifient aussi que la modification ne provoque aucun nouvel échec de la même règle. Les fichiers de votre thème seront différents. Le thème de test contient encore un fichier layout/checkout.liquid et un snippet de champ du tunnel de commande, snippets/checkout-field.liquid, de sorte que certains diffs les modifient ; comme décrit plus haut, Shopify n’utilise plus ce fichier pour les étapes d’informations, d’expédition et de paiement.

Lorsqu’une recette ajoute du texte, comme les mots d’un lien d’évitement ou le nom d’un bouton à icône, elle réutilise quand c’est possible une traduction que le thème possède déjà. Sinon, elle ajoute le texte en anglais, et en allemand lorsque le thème a un fichier de langue allemand. Le texte n’est pas ajouté dans les autres langues de votre boutique : un thème dont la langue par défaut n’est ni l’anglais ni l’allemand reçoit le texte anglais.

Qu’est-ce qui reste MANUAL sur Shopify ?

Les échecs qui exigent une décision sur le contenu ou le comportement qu’une modification de code prédéfinie ne peut pas prendre, par exemple les sous-titres et les transcriptions de vos vidéos et de vos contenus audio, restent MANUAL sur Shopify. Pour un constat d’une règle MANUAL, Validiscan donne des indications sur la façon de le corriger, et non une modification de votre code.

Les règles ci-dessous sont exécutées lors d’un scan et ont le niveau MANUAL sur Shopify.

  • meta-refresh L’actualisation différée de moins de 20 heures ne doit pas être utilisée
  • nested-interactive Les éléments interactifs ne doivent pas être imbriqués
  • scrollable-region-focusable Les zones défilantes doivent être accessibles au clavier
  • server-side-image-map Les images réactives côté serveur ne doivent pas être utilisées
  • vs-keyboard-trap Le focus clavier ne doit jamais rester piégé
  • vs-focus-order L’ordre de tabulation doit suivre l’ordre visuel
  • vs-dragging Les éléments à faire glisser doivent offrir une alternative à pointeur unique
  • vs-media Les vidéos ont besoin de sous-titres, l’audio d’une transcription, et rien ne doit démarrer automatiquement avec le son
  • vs-documents Les documents liés nécessitent une vérification manuelle de l’accessibilité
Détails : le contrôle de l’ordre de tabulation, et ce qu’un projet laisse de côté

Pour un constat d’une règle MANUAL, Validiscan donne des indications sur la façon de le corriger, et non une modification de votre code. Ces échecs exigent une décision sur le contenu ou le comportement qu’une modification de code prédéfinie ne peut pas prendre, par exemple les sous-titres et les transcriptions de vos vidéos et de vos contenus audio, un moyen de sortir d’un widget qui piège le focus clavier, ou un autre moyen d’utiliser une commande qui ne fonctionne qu’en la faisant glisser. Le contrôle de l’ordre de tabulation vs-focus-order a le niveau MANUAL, car un ordre de tabulation qui ne correspond pas à l’écran tient à la façon dont les templates sont ordonnés ; lorsque l’un de ses constats porte sur un tabindex supérieur à 0, la recette de l’ordre de tabulation ci-dessus retire ce tabindex.

Le travail sur les constats MANUAL qui exigent vos propres décisions de contenu ne fait pas partie d’un projet, pas plus que les PDF. Entre les règles du niveau AUTO et celles du niveau MANUAL se trouvent les règles du niveau ASSISTED, comme les alternatives textuelles des images ou les noms des boutons : leurs corrections demandent du jugement, et Validiscan relit chaque correction avant sa livraison. Ce que les tests d’accessibilité automatisés peuvent et ne peuvent pas prouver

Que devez-vous fournir ?

Pour un projet Shopify, vous fournissez cinq choses : une autorisation écrite pour un scan complet de votre boutique, une voie d’accès à votre thème, votre réponse à la question de savoir si l’IA peut rédiger des corrections du niveau ASSISTED, une relecture des modifications et vos décisions sur ce qui reste MANUAL.

  1. Une autorisation écrite pour un scan complet de votre boutique. Un scan complet met un produit dans le panier et ouvre la première étape du tunnel de commande, sans finaliser d’achat ni saisir de données de paiement.
  2. Une voie d’accès à votre thème : l’accès au dépôt GitHub qui le contient, un mot de passe Theme Access et l’adresse myshopify.com de votre boutique, ou un fichier de thème téléversé dans le portail client.
  3. Votre réponse à la question de savoir si l’IA peut rédiger des corrections du niveau ASSISTED. La rédaction par IA reste désactivée tant que vous n’avez pas donné votre accord.
  4. Une relecture des modifications : publier la copie du thème, fusionner la pull request ou appliquer le lot de correctifs.
  5. Vos décisions sur ce qui reste MANUAL, comme les sous-titres de vos vidéos.
Détails : une fois les modifications en ligne, et ce que couvre un projet

Une fois les modifications en ligne, un scan de vérification contrôle de nouveau les pages concernées, et le Remediation Evidence Package consigne le résultat. Le déroulement d’un projet, étape par étape

Un projet couvre une boutique : un domaine et un thème.

Sources

6 sources, toutes vérifiées pour cette page le 6 octobre 2026.

Documentation, centre d’aide et App Store de Shopify 6
  1. Manage theme access · Shopify · vérifiée le
  2. Downloading themes · Shopify Help Center · vérifiée le
  3. Publishing themes · Shopify Help Center · vérifiée le
  4. Shopify GitHub integration for themes · Shopify · vérifiée le
  5. checkout.liquid · Shopify · vérifiée le
  6. Theme Access · Shopify App Store · vérifiée le

Commencez par une vérification gratuite de votre boutique.

Envoyez l’adresse de votre boutique. Validiscan la scanne et vous envoie chaque échec que le scan peut prouver, avec sa page et son code.

Demander une vérification gratuite

Ou écrivez à info@validiscan.com.

Ce que couvre la vérification gratuite, et ce qu’elle laisse de côté
Vous envoyez
l’adresse de votre boutique
Pages scannées
jusqu’à 15
Vous recevez
chaque échec que le scan peut prouver, avec la page et le code
Sur votre boutique
pages publiques uniquement ; aucune connexion, aucun achat, aucun formulaire envoyé
Ce qu’elle n’est pas
un audit complet

Écrire à Validiscan

Pour une vérification gratuite, indiquez l’adresse de votre boutique et sa plateforme.

Validiscan utilise ce que vous envoyez pour vous répondre. Politique de confidentialité