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 :
Sur cette page : 6 réponses
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.
| 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 :
- Dans votre interface administrateur Shopify, ouvrez Boutique en ligne, puis Thèmes.
- Dans le menu du thème que vous utilisez, choisissez « Télécharger le fichier du thème ».
- 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.
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 :
- 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. - Prévisualisez-le. Vos visiteurs continuent de voir le thème en ligne pendant ce temps.
- Vérifiez les pages concernées dans l’aperçu, y compris au clavier seul.
- Lorsque le résultat vous convient, choisissez Publier. Shopify décrit cette étape dans son article d’aide sur la publication des thèmes.
- 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/, 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’attributlang, 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’attributlang, 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-langAUTO contrôle assuré par vs-lang -
html-lang-validAUTO contrôle assuré par vs-lang -
vs-langAUTO
-
- 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> -
Lien d’évitement, zone principale et menus nommés skip-link-main Selon ce que le scan a relevé : un lien d’évitement vers le contenu principal, une zone principale balisée, ainsi que des menus et des régions nommés.
Un lien « Skip to content » devient le premier élément de chaque page. Il reste masqué jusqu’à ce qu’un utilisateur du clavier l’atteigne, et il mène au contenu principal, qui est balisé comme la zone principale de la page. Les zones de navigation présentes sur une même page reçoivent des noms distincts, par exemple Main menu, Footer menu ou Breadcrumbs, et le contenu situé hors de toute zone de la page, comme une barre d’annonces, devient une région nommée. Un lien d’évitement existant qui ne mène nulle part est redirigé vers le contenu principal. Les modifications effectivement apportées dépendent de ce que le scan a relevé.
- Règles couvertes
-
-
bypassAUTO contrôle assuré par vs-headings-landmarks -
skip-linkAUTO -
landmark-one-mainAUTO contrôle assuré par vs-headings-landmarks -
regionAUTO -
vs-headings-landmarksAUTO -
landmark-uniqueASSISTED
-
- Types de fichiers modifiés
-
.css.liquid.json.liquid
Avant et après Données d’exemple assets/base.css.liquid Modifications apportées à assets/base.css.liquid (lignes ajoutées : 30, lignes supprimées : 0)
Modifications apportées à assets/base.css.liquid (lignes ajoutées : 30, 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:skip-link-main */ 1871 Ajoutée .skip-to-content-link:not(:focus) { 1872 Ajoutée position: absolute !important; 1873 Ajoutée overflow: hidden; 1874 Ajoutée width: 1px; 1875 Ajoutée height: 1px; 1876 Ajoutée margin: -1px; 1877 Ajoutée padding: 0; 1878 Ajoutée border: 0; 1879 Ajoutée clip: rect(0 0 0 0); 1880 Ajoutée white-space: nowrap; 1881 Ajoutée } 1882 Ajoutée 1883 Ajoutée .skip-to-content-link:focus { 1884 Ajoutée z-index: 9999; 1885 Ajoutée position: fixed !important; 1886 Ajoutée top: 0.5rem; 1887 Ajoutée left: 0.5rem; 1888 Ajoutée overflow: visible; 1889 Ajoutée width: auto; 1890 Ajoutée height: auto; 1891 Ajoutée margin: 0; 1892 Ajoutée padding: 0.75rem 1.25rem; 1893 Ajoutée clip: auto; 1894 Ajoutée background-color: #ffffff; 1895 Ajoutée color: #121212; 1896 Ajoutée text-decoration: underline; 1897 Ajoutée } 1898 Ajoutée /* /validiscan:skip-link-main */ layout/checkout.liquid Modifications apportées à layout/checkout.liquid (lignes ajoutées : 4, lignes supprimées : 3)
Modifications apportées à layout/checkout.liquid (lignes ajoutées : 4, lignes supprimées : 3) Ligne avant Ligne après Modification Code 18 18 </head> 19 19 20 20 <body class="template-checkout"> 21 Ajoutée <a class="skip-to-content-link" href="#MainContent">{{ 'accessibility.skip_to_text' | t }}</a> 21 22 <header class="checkout-header"> 22 23 <div class="page-width checkout-header__inner"> 23 24 <a href="{{ routes.root_url }}" class="checkout-header__logo"><img src="{{ 'logo.svg' | asset_url }}" width="140" height="32"></a> 24 Supprimée <nav class="checkout-breadcrumb"> 25 Ajoutée <nav class="checkout-breadcrumb" aria-label="{{ 'accessibility.breadcrumbs' | t | escape }}"> 25 26 <ol class="checkout-breadcrumb__list" role="list"> 26 27 <li><a href="{{ routes.cart_url }}" class="checkout-breadcrumb__link">Cart</a></li> 27 28 <li><span class="checkout-breadcrumb__current">Information</span></li> 31 32 </nav> 32 33 </div> 33 34 </header> 34 Supprimée <div class="main checkout" id="MainContent"> 35 Ajoutée <main class="main checkout" id="MainContent" tabindex="-1"> 35 36 {{ content_for_layout }} 36 Supprimée </div> 37 Ajoutée </main> 37 38 38 39 <footer class="checkout-footer"> 39 40 <div class="page-width"> layout/theme.focused.liquid Modifications apportées à layout/theme.focused.liquid (lignes ajoutées : 1, lignes supprimées : 0)
Modifications apportées à layout/theme.focused.liquid (lignes ajoutées : 1, lignes supprimées : 0) Ligne avant Ligne après Modification Code 22 22 </head> 23 23 24 24 <body class="gradient template-{{ template.name | handleize }} layout-focused"> 25 Ajoutée <a class="skip-to-content-link" href="#MainContent">{{ 'accessibility.skip_to_text' | t }}</a> 25 26 {% section 'header' %} 26 27 27 28 <main id="MainContent" class="content-for-layout focus-none" role="main" tabindex="-1"> layout/theme.liquid Modifications apportées à layout/theme.liquid (lignes ajoutées : 1, lignes supprimées : 0)
Modifications apportées à layout/theme.liquid (lignes ajoutées : 1, lignes supprimées : 0) Ligne avant Ligne après Modification Code 28 28 </head> 29 29 30 30 <body class="gradient template-{{ template.name | handleize }}"> 31 Ajoutée <a class="skip-to-content-link" href="#MainContent">{{ 'accessibility.skip_to_text' | t }}</a> 31 32 32 33 {% sections 'header-group' %} 33 34 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 "breadcrumbs": "Breadcrumbs", 39 Ajoutée "mobile_menu": "Mobile menu" 38 40 }, 39 41 "sections": { 40 42 "header": { 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 17 17 {%- endform -%} 18 18 </div> 19 19 20 Supprimée <nav class="footer__menus"> 20 Ajoutée <nav class="footer__menus" aria-label="{{ 'sections.footer.menu' | t | escape }}"> 21 21 {%- for handle in menu_handles %} 22 22 {%- assign footer_menu = linklists[handle] %} 23 23 <div class="footer-block footer-block--menu"> sections/header.liquid Modifications apportées à sections/header.liquid (lignes ajoutées : 2, lignes supprimées : 2)
Modifications apportées à sections/header.liquid (lignes ajoutées : 2, lignes supprimées : 2) Ligne avant Ligne après Modification Code 11 11 {%- render 'icon', icon: 'menu', size: icon_size -%} 12 12 </summary> 13 13 <div class="menu-drawer"> 14 Supprimée <nav class="menu-drawer__navigation"> 14 Ajoutée <nav class="menu-drawer__navigation" aria-label="{{ 'accessibility.mobile_menu' | t | escape }}"> 15 15 <ul class="menu-drawer__menu list-unstyled" role="list"> 16 16 {%- for link in menu.links %} 17 17 <li><a href="{{ link.url }}" class="menu-drawer__menu-item">{{ link.title | escape }}</a></li> 25 25 <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> 26 26 {% if logo_is_heading %}</h1>{% else %}</div>{% endif %} 27 27 28 Supprimée <nav class="header__inline-menu"> 28 Ajoutée <nav class="header__inline-menu" aria-label="{{ 'sections.header.main_menu' | t | escape }}"> 29 29 <ul class="list-menu list-menu--inline" role="list"> 30 30 {%- for link in menu.links %} 31 31 <li> -
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-titleAUTO
-
- 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 %} – {{ 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-orderAUTO contrôle assuré par vs-headings-landmarks -
page-has-heading-oneAUTO contrôle assuré par vs-headings-landmarks -
vs-headings-landmarksAUTO
-
- 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-visibleAUTO
-
- 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
tabindexsupé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
tabindexsupé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. Untabindexé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 tabulationvs-focus-orderqui portent sur untabindexsupérieur à 0 ; le reste de ce contrôle demeure MANUAL.- Règles couvertes
-
-
tabindexAUTO -
vs-focus-orderMANUAL
-
- 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>
Zoom, cibles tactiles et contraste
-
Zoom autorisé sur téléphone meta-viewport-zoom
user-scalable=noet toutmaximum-scaleinfé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=noet toutmaximum-scaleinfé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-viewportAUTO -
meta-viewport-largeAUTO
-
- 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-sizeAUTO
-
- 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/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.settings_data.json - Règles couvertes
-
-
color-contrastASSISTED
-
- 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-motionAUTO
-
- 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-carouselAUTO
-
- 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 -
Ni texte clignotant ni texte défilant remove-blink-marquee Les éléments
<blink>et<marquee>deviennent des éléments statiques avec le même contenu, les mêmes classes et les mêmes id, de sorte qu’aucun texte ne bouge tout seul.Les éléments
<blink>et<marquee>du thème deviennent des éléments statiques, avec le même contenu, les mêmes classes et les mêmes id : un<span>pour blink, un<div>pour marquee, ou un<span>lorsque le marquee se trouve dans un paragraphe ou un lien. Les réglages de défilement du marquee sont retirés, de sorte qu’aucun texte ne bouge tout seul.- Règles couvertes
-
-
blinkAUTO -
marqueeAUTO
-
- 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 <marquee class="announcement-bar__message" behavior="scroll" direction="left" scrollamount="4">{{ section.settings.text | escape }}</marquee> 7 Supprimée <p class="announcement-bar__note"><blink class="announcement-bar__flag">New</blink> winter collection</p> 6 Ajoutée <div class="announcement-bar__message">{{ section.settings.text | escape }}</div> 7 Ajoutée <p class="announcement-bar__note"><span class="announcement-bar__flag">New</span> winter collection</p> 8 8 </div> 9 9 </div> 10 10 -
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
mutedetplaysinline, de sorte qu’elle continue de jouer en silence, comme une vidéo d’arrière-plan, et le filtrevideo_tagde Shopify reçoitmuted: 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édiasvs-media, qui remplace la règle d’axe-core que cette recette couvre.vs-mediaa le niveau MANUAL, et sur Shopify cette recette n’est pas utilisée pour ses constats.- Règles couvertes
-
-
no-autoplay-audioAUTO 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 unforqui 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
-
-
labelAUTO contrôle assuré par vs-forms-ecommerce -
select-nameASSISTED -
vs-forms-ecommerceAUTO
-
- 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
autocompletequi 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
autocompletequi 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ètreautocomplete, et chaque appelrenderdu 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-validAUTO contrôle assuré par vs-forms-ecommerce -
vs-forms-ecommerceAUTO
-
- 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-updatesAUTO
-
- 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-labellorsque 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-nameASSISTED -
link-nameASSISTED -
image-altASSISTED -
vs-carouselAUTO -
vs-cookie-bannerASSISTED
-
- 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 }}&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 unalt=""vide, et une icône SVG reçoitaria-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-altASSISTED -
role-img-altASSISTED -
svg-img-altASSISTED
-
- 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-titleAUTO
-
- 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/, 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-refreshL’actualisation différée de moins de 20 heures ne doit pas être utilisée -
nested-interactiveLes éléments interactifs ne doivent pas être imbriqués -
scrollable-region-focusableLes zones défilantes doivent être accessibles au clavier -
server-side-image-mapLes images réactives côté serveur ne doivent pas être utilisées -
vs-keyboard-trapLe focus clavier ne doit jamais rester piégé -
vs-focus-orderL’ordre de tabulation doit suivre l’ordre visuel -
vs-draggingLes éléments à faire glisser doivent offrir une alternative à pointeur unique -
vs-mediaLes vidéos ont besoin de sous-titres, l’audio d’une transcription, et rien ne doit démarrer automatiquement avec le son -
vs-documentsLes 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.
- 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.
- 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.comde votre boutique, ou un fichier de thème téléversé dans le portail client. - 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.
- Une relecture des modifications : publier la copie du thème, fusionner la pull request ou appliquer le lot de correctifs.
- 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
- Manage theme access · Shopify · vérifiée le
- Downloading themes · Shopify Help Center · vérifiée le
- Publishing themes · Shopify Help Center · vérifiée le
- Shopify GitHub integration for themes · Shopify · vérifiée le
- checkout.liquid · Shopify · vérifiée le
- 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 gratuiteOu é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