Rettelser af tilgængelighed i koden til dit tema på Shopify

Validiscan retter tilgængelighedsfejl i dit Shopify-temas Liquid-skabeloner, stilark, scripts og sprogfiler. Ændringerne kommer som en upubliceret kopi af dit tema, som en pull request eller som en patchpakke, og intet når dit aktive tema, før du eller din udvikler publicerer, merger eller anvender det.

Senest opdateret:

Hvilke filer i et Shopify-tema ændrer Validiscan?

Validiscan ændrer dit temas egne filer og intet andet: Liquid-filerne i layout, templates, sections, snippets og blocks, stilarkene og scriptene i assets, webshoppens tekst i locales og indstillingerne i config. En ændring af enhver anden fil afvises, før Validiscan gennemgår den.

Shopifys kasse er ikke en del af dit temas kode

En fuld scanning åbner det første trin i kassen, men Shopify understøtter ikke længere checkout.liquid, temaets layoutfil til kassen, i trinnene med oplysninger, forsendelse og betaling. En fejl, som en scanning finder i de trin, kan derfor ikke rettes med en ændring af dine temafiler.

Detaljer: hvad en ændring må tilføje, og hvad der ligger uden for dette arbejde

Hver ændring er en almindelig redigering af en temafil, som du eller din udvikler kan læse linje for linje. Nogle få rettelser tilføjer et par linjer til temaets eget script, for eksempel for at forbinde en pauseknap med et slideshow. Ingen rettelse tilføjer en app eller et overlay, og der indsættes intet, som retter dine sider i den besøgendes browser. Kode, der ikke er en del af dit temas filer, ligger uden for dette arbejde, og indlejret tredjepartsindhold som betalings- eller chatwidgets indgår ikke i et projekt.

Hvordan får Validiscan adgang til dit Shopify-tema?

Validiscan når dit Shopify-tema på en af tre måder: gennem dit GitHub-repository, med en Theme Access-adgangskode eller ud fra en temafil, som du selv downloader. Hvilken der passer, afhænger af, hvor dit temas kode ligger, og den afgør også, hvordan ændringerne kommer tilbage til dig.

De tre veje ind i et Shopify-tema
Vej ind Det giver du Ændringerne kommer tilbage som
Gennem dit GitHub-repository Adgang til repositoriet gennem Validiscans GitHub-app eller et adgangstoken En pull request
Med en Theme Access-adgangskode En Theme Access-adgangskode og din webshops myshopify.com-adresse En upubliceret kopi af dit tema
Ud fra en temafil, som du downloader Dit temas ZIP-fil på op til 100 MB, uploadet i kundeportalen af en administrator i din organisation En patchpakke

Gennem dit GitHub-repository

Hvis dit temas kode ligger i et GitHub-repository, for eksempel gennem Shopifys GitHub-integration, giver du Validiscan adgang til det repository. Du installerer Validiscans GitHub-app på det eller giver Validiscan et adgangstoken. Appen beder om læse- og skriveadgang til repositoriets indhold og pull requests og om læseadgang til dets metadata. Temaets mapper, for eksempel layout, sections og snippets, skal ligge i roden af repositoriet, fordi en ændring af en anden sti afvises. Ændringerne kommer så som en pull request.

Med en Theme Access-adgangskode

Shopifys gratis Theme Access-app opretter adgangskoder, som lader en udvikler arbejde med en webshops temaer via Shopify CLI. Som ejer af webshoppen eller som medarbejder med tilladelsen Themes installerer du appen og opretter en adgangskode til Validiscan. Shopify sender Validiscan et link til den på e-mail, og adgangskoden kan kun vises én gang. Du giver også Validiscan din webshops myshopify.com-adresse. Validiscan gemmer adgangskoden krypteret og bruger den sammen med Shopify CLI til at downloade dit aktive tema og til at uploade en ny, upubliceret kopi af det. En Theme Access-adgangskode giver mulighed for at ændre webshoppens temaer, så Validiscans leveringskode afviser enhver kommando, der ville skrive til det aktive tema eller publicere et tema. Du afslutter adgangen ved at slette adgangskoden i Theme Access-appen; pr. 6. oktober 2026 siger Shopifys dokumentation, at adgangen tilbagekaldes, når en adgangskode slettes. Validiscan bruger adgangskoden igen efter en levering for at kontrollere, om kopien er blevet publiceret, så slet adgangskoden, når projektet er afsluttet, og opret en ny til en senere levering.

Ud fra en temafil, som du downloader

Hvis ingen af de to andre måder passer til dig, downloader du selv dit tema. Kundeportalen angiver disse trin:

  1. Åbn Onlinebutik og derefter Temaer i din Shopify-administration.
  2. Vælg »Download temafil« i menuen for det tema, du bruger.
  3. Shopify sender dig ZIP-filen på e-mail.

Shopifys egen vejledning står i hjælpeartiklen om download af temaer. Derefter uploader en administrator i din organisation, som kan være din udvikler, filen i kundeportalen som én ZIP-fil på op til 100 MB. Validiscan udarbejder ændringerne ud fra den kopi af dit tema og sender dem tilbage som en patchpakke.

Hvordan når ændringerne frem til din webshop?

Validiscan leverer ændringerne på en af tre måder: som en upubliceret kopi af dit Shopify-tema, som en pull request eller som en patchpakke. Der leveres kun ændringer, som Validiscan har gennemgået og godkendt, og ingen af de tre måder berører dit aktive tema.

Sådan publicerer du temakopien, i fem trin

Med en Theme Access-adgangskode downloader Validiscan dit aktive tema, anvender de godkendte ændringer og uploader resultatet som et nyt, upubliceret tema med navnet Validiscan A11y <date>, for eksempel Validiscan A11y 2026-09-24. Du får en e-mail, når det er klart. Derefter:

  1. Åbn Onlinebutik og derefter Temaer i Shopify-administrationen, og find det upublicerede tema Validiscan A11y <date> blandt dine kladdetemaer.
  2. Forhåndsvis det. Dine besøgende ser stadig det aktive tema, mens du gør det.
  3. Kontroller de berørte sider i forhåndsvisningen, også med tastaturet alene.
  4. Vælg Publicer, når du er tilfreds. Shopify beskriver dette trin i hjælpeartiklen om publicering af temaer.
  5. Behold dit tidligere tema, indtil du er sikker. Du kan skifte tilbage til det.

En upubliceret kopi af dit tema

Kopien er dit aktive tema, som det var den dag, Validiscan downloadede det. Hvis du ændrer det aktive tema efter den dag, i indhold, indstillinger eller kode, skal du foretage den samme ændring i kopien, før du publicerer den, ellers går ændringen tabt. Kundeportalen viser, om kopien venter på at blive publiceret, er blevet publiceret eller er blevet slettet uden at blive publiceret. Shopifys Help Center om opdatering af temaer siger, at opdateringer kun er tilgængelige for temaer, der er installeret fra Shopify Theme Store, og at automatiske opdateringer ikke understøttes for uploadede temaer. Kopien uploades med Shopify CLI, så kontroller under Onlinebutik og derefter Temaer, før du publicerer den, om Shopify stadig tilbyder opdateringer til den. Hvor rettelser hører hjemme i et Shopify-tema, og hvad en temaopdatering kan fortryde

En pull request

Med adgang til dit repository opretter Validiscan en ny branch med navnet validiscan/a11y-<date>-<id>, committer hver rettelse for sig og åbner én pull request med en oversigtstabel, en forklaring af hver ændring og en tjekliste til gennemgangen. Der pushes intet til din standardbranch. Med Shopifys GitHub-integration følger et tema den branch, det er forbundet til: Din udvikler kan forbinde pull requestens branch til et upubliceret tema for at forhåndsvise den, og en merge ind i den branch, som dit aktive tema følger, ændrer det aktive tema.

En patchpakke

Ud fra en uploadet temafil udarbejder Validiscan et zip-arkiv til din udvikler. Det indeholder PATCH.md med hver ændring og en vejledning i at anvende den, alle ændringer i én patchfil, én patchfil pr. rettelse, de komplette ændrede filer og en README.md. Din udvikler anvender ændringerne, tester dem og publicerer temaet. Hvad en pull request og en patchpakke indeholder

Hvad ændrer opskrifterne i et Shopify-tema?

Hver af Validiscans 20 opskrifter til Shopify-temaer er en deterministisk ændring for én slags fejl: Den samme kode får altid den samme ændring. En opskrift foretager kun en ændring, hvor temaets kode viser, hvad den rigtige ændring er; ellers overlades fundet til et menneske.

Sidestruktur og navigation

  • Sidens sprog ud fra webshoppens sprog html-lang Et layout, hvis <html>-element mangler en lang-attribut eller har en tom eller ugyldig, får det sprog, som din webshop viser.

    Et layout, hvis <html>-element ikke har nogen lang-attribut eller har en tom eller ugyldig lang-attribut, får det sprog, som din webshop viser, så skærmlæsere udtaler siden på det rigtige sprog. Hvor temaet allerede gemmer en sides eget sprog i et metafelt, for eksempel til juridiske sider på tysk i en engelsksproget webshop, bruger layoutet det metafelt, når det er udfyldt. Uden et sådant felt gætter opskriften ikke på en sides sprog.

    Regler, den dækker
    • html-has-lang AUTO kontrolleres via vs-lang
    • html-lang-valid AUTO kontrolleres via vs-lang
    • vs-lang AUTO
    Filtyper, den ændrer
    .liquid
    Før og efter Eksempeldata

    layout/checkout.liquid Ændringer i layout/checkout.liquid: 1 tilføjet, 1 fjernet

    Ændringer i layout/checkout.liquid: 1 tilføjet, 1 fjernet
    Linje før Linje efter Ændring Kode
    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 Fjernet <html class="no-js">
    6 Tilføjet <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 Ændringer i layout/theme.liquid: 3 tilføjet, 0 fjernet

    Ændringer i layout/theme.liquid: 3 tilføjet, 0 fjernet
    Linje før Linje efter Ændring Kode
    6 6 {% endcomment %}
    7 7 {%- liquid
    8 8 assign page_lang = request.locale.iso_code
    9 Tilføjet if page.metafields.custom.content_language != blank
    10 Tilføjet assign page_lang = page.metafields.custom.content_language
    11 Tilføjet endif
    9 12 -%}
    10 13 <html class="no-js" lang="{{ page_lang }}">
    11 14 <head>
  • En titel på hver side document-title-template Layouts, hvis <title> mangler, er tom eller har den samme faste tekst på alle sider, får en titel bygget af Shopifys variabler.

    Hvert layout, hvis <title> mangler, er tom eller har den samme faste tekst på alle sider, får en titel bygget af Shopifys variabler. Hvis dit hovedlayout allerede har en titel, der navngiver siden, får de øvrige layouts den samme. Ellers består titlen af sidens titel, sidetallet på en liste med sideinddeling og webshoppens navn, og ordet for »side« oversættes via temaets sprogfiler.

    Regler, den dækker
    • document-title AUTO
    Filtyper, den ændrer
    .liquid
    Før og efter Eksempeldata

    layout/theme.focused.liquid Ændringer i layout/theme.focused.liquid: 1 tilføjet, 1 fjernet

    Ændringer i layout/theme.focused.liquid: 1 tilføjet, 1 fjernet
    Linje før Linje efter Ændring Kode
    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 Fjernet <title></title>
    14 Tilføjet <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' %}
  • Overskrifter uden oversprungne niveauer heading-levels En overskrift, der springer et niveau over, får niveauet lige under den foregående overskrift; opskriften tilføjer ingen skjult overskrift.

    En overskrift, der springer et niveau over, for eksempel en h4 lige efter en h2, får det niveau, der ligger lige under den foregående overskrift, i den sektionsfil, hvor den er skrevet. Hvor temaet styler overskrifter efter deres niveau, bevarer en lille stilregel overskriftens gamle udseende. På en side uden hovedoverskrift bliver det element, der allerede ligner sidens titel, til h1; på forsiden er det temaets egen indstilling til at vise logoet som h1. Har en side intet sådant element, tilføjer opskriften ingen skjult overskrift, fordi det er en beslutning om indhold.

    Regler, den dækker
    • heading-order AUTO kontrolleres via vs-headings-landmarks
    • page-has-heading-one AUTO kontrolleres via vs-headings-landmarks
    • vs-headings-landmarks AUTO
    Filtyper, den ændrer
    .liquid
    Før og efter Eksempeldata

    sections/featured-collection.liquid Ændringer i sections/featured-collection.liquid: 1 tilføjet, 1 fjernet

    Ændringer i sections/featured-collection.liquid: 1 tilføjet, 1 fjernet
    Linje før Linje efter Ændring Kode
    1 1 {%- liquid
    2 2 assign featured = section.settings.collection
    3 Fjernet assign card_heading = 'h4'
    3 Tilføjet 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 Ændringer i sections/header.liquid: 3 tilføjet, 0 fjernet

    Ændringer i sections/header.liquid: 3 tilføjet, 0 fjernet
    Linje før Linje efter Ændring Kode
    3 3 assign menu = linklists[section.settings.menu]
    4 4 assign icon_size = 18
    5 5 assign logo_is_heading = false
    6 Tilføjet if request.page_type == 'index'
    7 Tilføjet assign logo_is_heading = true
    8 Tilføjet 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 Ændringer i sections/main-collection.liquid: 1 tilføjet, 1 fjernet

    Ændringer i sections/main-collection.liquid: 1 tilføjet, 1 fjernet
    Linje før Linje efter Ændring Kode
    6 6 wishlist heart nested inside the product image link.
    7 7 {%- endcomment -%}
    8 8 {%- liquid
    9 Fjernet assign card_heading = 'h4'
    9 Tilføjet 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 Ændringer i sections/main-product.liquid: 1 tilføjet, 1 fjernet

    Ændringer i sections/main-product.liquid: 1 tilføjet, 1 fjernet
    Linje før Linje efter Ændring Kode
    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 Fjernet assign sub_heading = 'h4'
    16 Tilføjet 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 Ændringer i sections/main-search.liquid: 1 tilføjet, 1 fjernet

    Ændringer i sections/main-search.liquid: 1 tilføjet, 1 fjernet
    Linje før Linje efter Ændring Kode
    1 1 {%- liquid
    2 Fjernet assign card_heading = 'h4'
    2 Tilføjet 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>

Tastaturbrug og fokus

  • En synlig fokusmarkering focus-visible-styles Én markering af tastaturfokus i dit temas accentfarve eller en reservefarve, med en kontrast på mindst 3:1 mod sidens baggrund.

    Hovedstilarket får én markering af tastaturfokus: en ubrudt streg på 2 pixels, 2 pixels fra elementet, i dit temas accentfarve (eller dets tekstfarve, eller sort eller hvid, hvor temaet ikke har nogen accentfarve), gjort lysere eller mørkere i samme farvetone, indtil den har en kontrast på mindst 3:1 mod sidens baggrund. Temaregler, der stadig ville skjule markeringen, mister deres outline: none, medmindre de viser fokus på anden måde, for eksempel med en kant eller en skygge. Markeringen har samme farve i hele temaet, så på sektioner med et mørkt farveskema kan den have brug for en lysere farve; det kontrollerer din udvikler i forhåndsvisningen.

    Regler, den dækker
    • vs-focus-visible AUTO
    Filtyper, den ændrer
    .css.liquid
    Før og efter Eksempeldata

    assets/base.css.liquid Ændringer i assets/base.css.liquid: 7 tilføjet, 0 fjernet

    Ændringer i assets/base.css.liquid: 7 tilføjet, 0 fjernet
    Linje før Linje efter Ændring Kode
    1866 1866 }
    1867 1867
    1868 1868 /* ----------------------------------------------------------------- motion */
    1869 Tilføjet
    1870 Tilføjet /* validiscan:focus-visible-styles */
    1871 Tilføjet :focus-visible {
    1872 Tilføjet outline: 2px solid #1f4d3a;
    1873 Tilføjet outline-offset: 2px;
    1874 Tilføjet }
    1875 Tilføjet /* /validiscan:focus-visible-styles */
  • En tab-rækkefølge, der følger siden remove-positive-tabindex Et tabindex over 0 fjernes eller sættes til 0, så Tab-tasten følger sidens rækkefølge, medmindre temaets skabelonkode skriver det.

    Et tabindex over 0 trækker et element forrest i tastaturrækkefølgen. Opskriften fjerner det fra links, knapper, formularfelter og andre elementer, der alligevel kan få fokus, og sætter det til 0 på andre elementer, så de stadig kan nås, mens Tab-tasten følger sidens rækkefølge. Et tabindex, som temaets skabelonkode skriver, overlades til et menneske. Opskriften håndterer også de fund fra kontrollen af fokusrækkefølgen (vs-focus-order), der handler om et tabindex over 0; resten af den kontrol forbliver på niveau MANUAL.

    Regler, den dækker
    • tabindex AUTO
    • vs-focus-order MANUAL
    Filtyper, den ændrer
    .liquid
    Før og efter Eksempeldata

    sections/header.liquid Ændringer i sections/header.liquid: 1 tilføjet, 1 fjernet

    Ændringer i sections/header.liquid: 1 tilføjet, 1 fjernet
    Linje før Linje efter Ændring Kode
    37 37
    38 38 <div class="header__search">
    39 39 <form action="{{ routes.search_url }}" method="get" role="search" class="search">
    40 Fjernet <input class="search__input field__input" type="search" name="q" value="" placeholder="{{ 'general.search.placeholder' | t }}" tabindex="1">
    40 Tilføjet <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>
  • Betjeningselementer, der kun virker med mus, bliver til knapper button-semantics <div>- og <span>-elementer, der kun virker med en mus, som et script lytter til, og hvis formål er klart, bliver til rigtige knapper.

    Elementer, der kan klikkes på, men som kun virker med en mus, for eksempel prikkerne i et slideshow eller valgene i et cookiebanner bygget af <div>- eller <span>-elementer, bliver til rigtige <button>-elementer. Alle klasser og attributter bevares, så temaets script fortsat virker, og Enter og mellemrumstasten gør nu det samme som et klik. En knap uden navn får et ud fra sit formål, for eksempel »Load slide 2 of 3«, og en lille nulstilling af knappens standardstil bevarer dens udseende. Et element, som intet script lytter til, eller hvis formål er uklart, bliver, som det er.

    Regler, den dækker
    • vs-carousel AUTO
    • vs-cookie-banner ASSISTED
    Filtyper, den ændrer
    .css.liquid.liquid
    Før og efter Eksempeldata

    assets/base.css.liquid Ændringer i assets/base.css.liquid: 14 tilføjet, 0 fjernet

    Ændringer i assets/base.css.liquid: 14 tilføjet, 0 fjernet
    Linje før Linje efter Ændring Kode
    1866 1866 }
    1867 1867
    1868 1868 /* ----------------------------------------------------------------- motion */
    1869 Tilføjet
    1870 Tilføjet /* validiscan:button-semantics */
    1871 Tilføjet :where(button.slider-counter__link) {
    1872 Tilføjet appearance: none;
    1873 Tilføjet margin: 0;
    1874 Tilføjet padding: 0;
    1875 Tilføjet border: 0;
    1876 Tilføjet background: none;
    1877 Tilføjet color: inherit;
    1878 Tilføjet font: inherit;
    1879 Tilføjet text-align: inherit;
    1880 Tilføjet cursor: pointer;
    1881 Tilføjet }
    1882 Tilføjet /* /validiscan:button-semantics */

    sections/slideshow.liquid Ændringer i sections/slideshow.liquid: 1 tilføjet, 1 fjernet

    Ændringer i sections/slideshow.liquid: 1 tilføjet, 1 fjernet
    Linje før Linje efter Ændring Kode
    62 62 </button>
    63 63 <div class="slider-counter">
    64 64 {%- for block in section.blocks %}
    65 Fjernet <span class="slider-counter__link" data-slide-to="{{ forloop.index0 }}"><span class="dot"></span></span>
    65 Tilføjet <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, klikflader og kontrast

  • Zoom tilladt på mobilen meta-viewport-zoom user-scalable=no og enhver maximum-scale under 5 fjernes fra viewport-taggene, så besøgende kan zoome op til 500 %, medmindre temaets skabelonkode sætter begrænsningen.

    Opskriften fjerner user-scalable=no og enhver maximum-scale under 5 fra viewport-taggene i temaets Liquid-filer, så besøgende kan zoome ind med to fingre, op til 500 %. De øvrige viewport-indstillinger forbliver nøjagtig, som de var. En zoombegrænsning, som temaets skabelonkode sætter, overlades til et menneske.

    Regler, den dækker
    • meta-viewport AUTO
    • meta-viewport-large AUTO
    Filtyper, den ændrer
    .liquid
    Før og efter Eksempeldata

    layout/checkout.liquid Ændringer i layout/checkout.liquid: 1 tilføjet, 1 fjernet

    Ændringer i layout/checkout.liquid: 1 tilføjet, 1 fjernet
    Linje før Linje efter Ændring Kode
    6 6 <html class="no-js">
    7 7 <head>
    8 8 <meta charset="utf-8">
    9 Fjernet <meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no">
    9 Tilføjet <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 Ændringer i layout/theme.focused.liquid: 1 tilføjet, 1 fjernet

    Ændringer i layout/theme.focused.liquid: 1 tilføjet, 1 fjernet
    Linje før Linje efter Ændring Kode
    10 10 <head>
    11 11 <meta charset="utf-8">
    12 12 <meta http-equiv="X-UA-Compatible" content="IE=edge">
    13 Fjernet <meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no">
    13 Tilføjet <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 Ændringer i layout/theme.liquid: 1 tilføjet, 1 fjernet

    Ændringer i layout/theme.liquid: 1 tilføjet, 1 fjernet
    Linje før Linje efter Ændring Kode
    11 11 <head>
    12 12 <meta charset="utf-8">
    13 13 <meta http-equiv="X-UA-Compatible" content="IE=edge">
    14 Fjernet <meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no">
    14 Tilføjet <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 %}
  • Større klikflader target-size-padding Betjeningselementer, som scanningen fandt for små, for eksempel ikoner i sidehovedet eller farveprøver, får en minimumsstørrelse på 24 × 24 pixels.

    Betjeningselementer, som scanningen fandt for små, for eksempel ikoner i sidehovedet, farveprøver eller knapper til antal, får en minimumsstørrelse på 24 × 24 pixels i hovedstilarket, udpeget via deres klasse. Ikonerne inde i dem bevarer deres størrelse. Et link eller et andet element, som temaet lader være inline, gøres til inline-flex med ikonet centreret, fordi inline-elementer ignorerer en minimumsstørrelse.

    Regler, den dækker
    • vs-target-size AUTO
    Filtyper, den ændrer
    .css.liquid
    Før og efter Eksempeldata

    assets/base.css.liquid Ændringer i assets/base.css.liquid: 10 tilføjet, 0 fjernet

    Ændringer i assets/base.css.liquid: 10 tilføjet, 0 fjernet
    Linje før Linje efter Ændring Kode
    1866 1866 }
    1867 1867
    1868 1868 /* ----------------------------------------------------------------- motion */
    1869 Tilføjet
    1870 Tilføjet /* validiscan:target-size-padding */
    1871 Tilføjet .header__icon--account,
    1872 Tilføjet .header__icon--cart,
    1873 Tilføjet .swatch--button,
    1874 Tilføjet .quantity__button {
    1875 Tilføjet min-width: 24px;
    1876 Tilføjet min-height: 24px;
    1877 Tilføjet }
    1878 Tilføjet /* /validiscan:target-size-padding */
  • Tekstfarver med tilstrækkelig kontrast contrast-tokens En tekstfarve, der ikke består kontrastkontrollen og kun er defineret ét sted uden at være delt, ændres til den nærmeste nuance i samme farvetone med den krævede kontrast.

    Når en tekst ikke består kontrastkontrollen, og dens farve kun er defineret ét sted, ændres farven til den nærmeste lysere eller mørkere nuance i samme farvetone, der giver den krævede kontrast mod alle de baggrunde, som scanningen rapporterede for den. Stedet kan være den stilarksregel, der styler teksten, eller en CSS-variabel eller en farveindstilling i config/settings_data.json, som intet andet i temaet bruger. En farve, der beregnes i Liquid eller er defineret flere gange, overlades til et menneske, og det samme gælder en delt farve, fordi en ændring ville påvirke farvepar, som scanningen ikke har målt.

    Regler, den dækker
    • color-contrast ASSISTED
    Filtyper, den ændrer
    .css.liquid
    Før og efter Eksempeldata

    assets/base.css.liquid Ændringer i assets/base.css.liquid: 3 tilføjet, 3 fjernet

    Ændringer i assets/base.css.liquid: 3 tilføjet, 3 fjernet
    Linje før Linje efter Ændring Kode
    745 745 font-size: 0.8125rem;
    746 746 letter-spacing: 0.04em;
    747 747 text-transform: uppercase;
    748 Fjernet color: #929292;
    748 Tilføjet color: #767676;
    749 749 }
    750 750
    751 751 .rating {
    1013 1013
    1014 1014 .copyright__content {
    1015 1015 margin: 0;
    1016 Fjernet color: #929292;
    1016 Tilføjet color: #6f6f6f;
    1017 1017 }
    1018 1018
    1019 1019 .policies {
    1077 1077
    1078 1078 .cookie-banner__text,
    1079 1079 .cookie-banner__link {
    1080 Fjernet color: #9a9a9a;
    1080 Tilføjet color: #767676;
    1081 1081 }
    1082 1082
    1083 1083 .cookie-banner__icon-button {

Bevægelse, slideshows og lyd

  • Mindre bevægelse, når en besøgende beder om det reduced-motion-guard Når en besøgendes enhed er indstillet til at reducere bevægelse, forkortes CSS-animationer og overgange, blød scrolling slås fra, og et slideshows automatiske afspilning, som temaets script starter, springes over.

    Når en besøgendes enhed er indstillet til at reducere bevægelse, lader en blok sidst i hovedstilarket hver CSS-animation kun køre én gang, for kort til at kunne ses, forkorter overgange og slår blød scrolling fra. Hvor temaets script selv starter et slideshows automatiske afspilning, springes starten over for de besøgende. Bevægelse, som et tredjepartsscript styrer, ændres ikke af denne opskrift.

    Regler, den dækker
    • vs-motion AUTO
    Filtyper, den ændrer
    .css.liquid
    Før og efter Eksempeldata

    assets/base.css.liquid Ændringer i assets/base.css.liquid: 13 tilføjet, 0 fjernet

    Ændringer i assets/base.css.liquid: 13 tilføjet, 0 fjernet
    Linje før Linje efter Ændring Kode
    1866 1866 }
    1867 1867
    1868 1868 /* ----------------------------------------------------------------- motion */
    1869 Tilføjet
    1870 Tilføjet /* validiscan:reduced-motion-guard */
    1871 Tilføjet @media (prefers-reduced-motion: reduce) {
    1872 Tilføjet *,
    1873 Tilføjet *::before,
    1874 Tilføjet *::after {
    1875 Tilføjet animation-duration: 0.01ms !important;
    1876 Tilføjet animation-iteration-count: 1 !important;
    1877 Tilføjet transition-duration: 0.01ms !important;
    1878 Tilføjet scroll-behavior: auto !important;
    1879 Tilføjet }
    1880 Tilføjet }
    1881 Tilføjet /* /validiscan:reduced-motion-guard */
  • En pauseknap til slideshows i bevægelse slider-pause-control Et slideshow, der bevæger sig af sig selv, får en synlig, oversat knap til pause og afspilning, forbundet med slideshowets egen automatiske afspilning.

    Et slideshow, der bevæger sig af sig selv, får blandt sine betjeningselementer en synlig, oversat knap til pause og afspilning, som kun vises, når automatisk afspilning er slået til. Et kort script i temaets hovedscriptfil forbinder knappen med slideshowets egen automatiske afspilning: Dawns slideshow, Swiper, Slick, Flickity, Splide eller en CSS-animation. For besøgende, hvis enhed beder om reduceret bevægelse, er slideshowet sat på pause fra starten.

    Regler, den dækker
    • vs-carousel AUTO
    Filtyper, den ændrer
    .css.liquid.js.json.liquid
    Før og efter Eksempeldata

    assets/base.css.liquid Ændringer i assets/base.css.liquid: 21 tilføjet, 0 fjernet

    Ændringer i assets/base.css.liquid: 21 tilføjet, 0 fjernet
    Linje før Linje efter Ændring Kode
    1866 1866 }
    1867 1867
    1868 1868 /* ----------------------------------------------------------------- motion */
    1869 Tilføjet
    1870 Tilføjet /* validiscan:slider-pause-control */
    1871 Tilføjet [data-autoplay-paused],
    1872 Tilføjet [data-autoplay-paused] * {
    1873 Tilføjet animation-play-state: paused !important;
    1874 Tilføjet }
    1875 Tilføjet
    1876 Tilføjet .slider-pause {
    1877 Tilføjet display: inline-flex;
    1878 Tilføjet align-items: center;
    1879 Tilføjet justify-content: center;
    1880 Tilføjet min-width: 2.75rem;
    1881 Tilføjet min-height: 2.75rem;
    1882 Tilføjet padding: 0.5rem 1rem;
    1883 Tilføjet border: 1px solid currentColor;
    1884 Tilføjet background: transparent;
    1885 Tilføjet color: inherit;
    1886 Tilføjet font: inherit;
    1887 Tilføjet cursor: pointer;
    1888 Tilføjet }
    1889 Tilføjet /* /validiscan:slider-pause-control */

    assets/global.js Ændringer i assets/global.js: 53 tilføjet, 0 fjernet

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

    locales/en.default.json Ændringer i locales/en.default.json: 3 tilføjet, 1 fjernet

    Ændringer i locales/en.default.json: 3 tilføjet, 1 fjernet
    Linje før Linje efter Ændring Kode
    34 34 "total_reviews": "{{ count }} reviews",
    35 35 "link_messages": {
    36 36 "new_window": "Opens in a new window."
    37 Fjernet }
    37 Tilføjet },
    38 Tilføjet "pause_slideshow": "Pause slideshow",
    39 Tilføjet "play_slideshow": "Play slideshow"
    38 40 },
    39 41 "sections": {
    40 42 "header": {

    sections/slideshow.liquid Ændringer i sections/slideshow.liquid: 3 tilføjet, 0 fjernet

    Ændringer i sections/slideshow.liquid: 3 tilføjet, 0 fjernet
    Linje før Linje efter Ændring Kode
    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 Tilføjet {%- if autoplay %}
    72 Tilføjet <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 Tilføjet {%- endif %}
    71 74 </div>
    72 75 </slideshow-component>
    73 76
  • Ingen lyd, der starter af sig selv mute-autoplay En video, der afspilles af sig selv, gøres lydløs, og lyd starter ikke længere af sig selv, undtagen i indlejrede YouTube- og Vimeo-afspillere; på Shopify bruges opskriften ikke til fund fra vs-media.

    En video, der afspilles af sig selv, får muted og playsinline, så den fortsætter med at spille lydløst, som en baggrundsvideo gør, og Shopifys video_tag-filter får muted: true. Lyd, der startede af sig selv, gør det ikke længere. Indlejrede YouTube- og Vimeo-afspillere overlades til et menneske. I en Validiscan-scanning rapporteres lyd, der starter af sig selv, af mediekontrollen vs-media, som erstatter den axe-core-regel, som denne opskrift dækker. vs-media har niveau MANUAL, og på Shopify bruges denne opskrift ikke til dens fund.

    Regler, den dækker
    • no-autoplay-audio AUTO kontrolleres via vs-media
    Filtyper, den ændrer
    .liquid
    Før og efter Eksempeldata

    sections/announcement-bar.liquid Ændringer i sections/announcement-bar.liquid: 2 tilføjet, 2 fjernet

    Ændringer i sections/announcement-bar.liquid: 2 tilføjet, 2 fjernet
    Linje før Linje efter Ændring Kode
    3 3 -%}
    4 4 <div class="announcement-bar color-accent"{% if bar_lang != '' %} lang="{{ bar_lang }}"{% endif %}>
    5 5 <div class="page-width">
    6 Fjernet <audio class="announcement-bar__chime" src="{{ 'chime.wav' | asset_url }}" autoplay></audio>
    7 Fjernet <video class="announcement-bar__clip" src="{{ 'chime.wav' | asset_url }}" autoplay loop width="16" height="16"></video>
    6 Tilføjet <audio class="announcement-bar__chime" src="{{ 'chime.wav' | asset_url }}"></audio>
    7 Tilføjet <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>

Formularer, priser og kurven

  • Etiketter knyttet til deres felter label-association En etiket, der allerede er synlig på siden, men ikke knyttet til sit formularfelt, bliver knyttet til det, uden at layoutet ændres.

    Et formularfelt, hvis etiket allerede er synlig som tekst på siden, men ikke er knyttet til feltet, bliver knyttet til det: Et <label>-element ved siden af får en for-attribut, der peger på feltet, eller en tekst lige før feltet, for eksempel navnet på et størrelses- eller farvevalg, bliver dets etiket via aria-labelledby, så layoutet ikke ændres. Skærmlæsere læser så etiketten op, når feltet får fokus. Et felt, der kun har en pladsholdertekst, overlades til et menneske, fordi det er en beslutning om indhold at skrive en etiket.

    Regler, den dækker
    • label AUTO kontrolleres via vs-forms-ecommerce
    • select-name ASSISTED
    • vs-forms-ecommerce AUTO
    Filtyper, den ændrer
    .liquid
    Før og efter Eksempeldata

    sections/main-collection.liquid Ændringer i sections/main-collection.liquid: 2 tilføjet, 2 fjernet

    Ændringer i sections/main-collection.liquid: 2 tilføjet, 2 fjernet
    Linje før Linje efter Ændring Kode
    64 64 <div class="collection__products">
    65 65 <div class="collection__toolbar">
    66 66 <div class="collection__sort">
    67 Fjernet <label class="collection__sort-label">Sort by</label>
    68 Fjernet <select name="sort_by" class="select__select" form="FacetFiltersForm">
    67 Tilføjet <label class="collection__sort-label" for="SortBy-{{ section.id }}">Sort by</label>
    68 Tilføjet <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 Ændringer i sections/main-product.liquid: 2 tilføjet, 2 fjernet

    Ændringer i sections/main-product.liquid: 2 tilføjet, 2 fjernet
    Linje før Linje efter Ændring Kode
    94 94 </div>
    95 95 {%- else %}
    96 96 <div class="product-form__input product-form__input--dropdown">
    97 Fjernet <p class="form__label">{{ option.name | escape }}</p>
    97 Tilføjet <p class="form__label" id="Options-{{ section.id }}-{{ forloop.index0 }}-label">{{ option.name | escape }}</p>
    98 98 <div class="select">
    99 Fjernet <select class="select__select" name="options[{{ option.name | escape }}]" data-option-index="{{ option_index }}">
    99 Tilføjet <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 %}
  • Adresse-, konto- og loginfelter, som browsere kan udfylde autocomplete-tokens Adresse-, konto-, login- og kontaktfelter, som scanningen markerede, får den autocomplete-værdi, der svarer til det, de spørger efter, hvor koden viser det.

    Adresse-, konto-, login- og kontaktfelter, som scanningen markerede, får den autocomplete-værdi, der svarer til det, de spørger efter, for eksempel e-mail, for- og efternavn, vejadresse, postnummer, land, telefonnummer eller adgangskode. Værdien udledes af feltets type, navn, etiket og pladsholdertekst. Hvor et snippet udskriver sine felter ud fra parametre, udskriver felterne en autocomplete-parameter, og hvert render-kald af snippettet sender den værdi, som kaldets egne argumenter tilsiger. Browsere kan så udfylde felterne, og hjælpemidler kan se, hvad hvert felt skal bruges til. Et felt, hvis formål koden ikke viser, bliver, som det er.

    Regler, den dækker
    • autocomplete-valid AUTO kontrolleres via vs-forms-ecommerce
    • vs-forms-ecommerce AUTO
    Filtyper, den ændrer
    .liquid
    Før og efter Eksempeldata

    sections/contact-form.liquid Ændringer i sections/contact-form.liquid: 1 tilføjet, 1 fjernet

    Ændringer i sections/contact-form.liquid: 1 tilføjet, 1 fjernet
    Linje før Linje efter Ændring Kode
    14 14 {%- form 'contact', id: 'ContactForm', class: 'contact__form' %}
    15 15 <div class="contact__fields">
    16 16 <div class="field">
    17 Fjernet <input class="field__input" type="text" name="contact[name]" placeholder="{{ 'templates.contact.form.name' | t }}">
    17 Tilføjet <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 Ændringer i sections/footer.liquid: 1 tilføjet, 1 fjernet

    Ændringer i sections/footer.liquid: 1 tilføjet, 1 fjernet
    Linje før Linje efter Ændring Kode
    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 Fjernet <input type="email" name="contact[email]" class="field__input" placeholder="{{ 'newsletter.label' | t }}" autocorrect="off" autocapitalize="off">
    14 Tilføjet <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 Ændringer i sections/main-login.liquid: 1 tilføjet, 1 fjernet

    Ændringer i sections/main-login.liquid: 1 tilføjet, 1 fjernet
    Linje før Linje efter Ændring Kode
    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 Fjernet <input class="field__input" type="email" name="customer[email]" id="CustomerEmail" autocorrect="off" autocapitalize="off">
    13 Tilføjet <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 Ændringer i snippets/checkout-field.liquid: 4 tilføjet, 4 fjernet

    Ændringer i snippets/checkout-field.liquid: 4 tilføjet, 4 fjernet
    Linje før Linje efter Ændring Kode
    15 15 <div class="field">
    16 16 {%- case legacy %}
    17 17 {%- when 'placeholder' %}
    18 Fjernet <input class="field__input" type="{{ field_type }}" id="{{ field_id }}" name="{{ field_name }}" placeholder="{{ label }}"{% if required %} required{% endif %}>
    18 Tilføjet <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 Fjernet <input class="field__input" type="{{ field_type }}" id="{{ field_id }}" name="{{ field_name }}">
    21 Tilføjet <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 Fjernet <input class="field__input" type="{{ field_type }}" id="{{ field_id }}" name="{{ field_name }}" autocomplete="off"{% if required %} required{% endif %}>
    24 Tilføjet <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 Fjernet <input class="field__input" type="{{ field_type }}" id="{{ field_id }}" name="{{ field_name }}"{% if required %} required{% endif %}>
    27 Tilføjet <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>
  • Ændringer i pris, lagerstatus og kurv bliver oplæst live-region-cart-variant Prisen, beskeden om lagerstatus eller subtotalen i kurven, som temaets script omskriver, markeres som et statusområde, som skærmlæsere læser op, medmindre området også rummer knapper eller links.

    Den del af en side, som temaets script omskriver, når en kunde vælger en anden variant eller ændrer et antal, for eksempel prisen, beskeden om lagerstatus eller subtotalen i kurven, markeres som et statusområde. Skærmlæsere læser så den nye værdi op, uden at kunden behøver at gå derhen. Temaets script ændres ikke. Et område, der også rummer knapper eller links, som ville blive læst op sammen med det, bliver, som det er.

    Regler, den dækker
    • vs-live-updates AUTO
    Filtyper, den ændrer
    .liquid
    Før og efter Eksempeldata

    sections/main-cart.liquid Ændringer i sections/main-cart.liquid: 1 tilføjet, 1 fjernet

    Ændringer i sections/main-cart.liquid: 1 tilføjet, 1 fjernet
    Linje før Linje efter Ændring Kode
    37 37
    38 38 <div class="cart__footer">
    39 39 <h2 class="cart__summary-title">Order summary</h2>
    40 Fjernet <p class="totals">
    40 Tilføjet <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 Ændringer i sections/main-product.liquid: 1 tilføjet, 1 fjernet

    Ændringer i sections/main-product.liquid: 1 tilføjet, 1 fjernet
    Linje før Linje efter Ændring Kode
    71 71 </div>
    72 72 {%- endif %}
    73 73
    74 Fjernet <div class="product__price" data-price-container>
    74 Tilføjet <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>

Navne til ikoner, billeder og indlejret indhold

  • Navne til knapper og links, der kun består af et ikon icon-accessible-name Knapper og links, der kun viser et ikon, får et navn, der siger, hvad de gør, hvor koden viser deres formål.

    Knapper og links, der kun viser et ikon, for eksempel søgning, kurv, konto, pile i slideshows, knapper til antal og cookievalg, får et navn, der siger, hvad de gør, hvor koden viser deres formål. Navnet er visuelt skjult tekst inde i betjeningselementet eller en aria-label, hvor temaet ikke har nogen klasse til skjult tekst. Et logolink, hvis billede ikke har noget tekstalternativ, får din webshops navn. Et betjeningselement, hvis navn skulle komme fra dit eget indhold, overlades til et menneske.

    Regler, den dækker
    • button-name ASSISTED
    • link-name ASSISTED
    • image-alt ASSISTED
    • vs-carousel AUTO
    • vs-cookie-banner ASSISTED
    Filtyper, den ændrer
    .json.liquid
    buttons Eksempeldata

    locales/en.default.json Ændringer i locales/en.default.json: 3 tilføjet, 1 fjernet

    Ændringer i locales/en.default.json: 3 tilføjet, 1 fjernet
    Linje før Linje efter Ændring Kode
    34 34 "total_reviews": "{{ count }} reviews",
    35 35 "link_messages": {
    36 36 "new_window": "Opens in a new window."
    37 Fjernet }
    37 Tilføjet },
    38 Tilføjet "accept_cookies": "Accept cookies",
    39 Tilføjet "reject_cookies": "Reject cookies"
    38 40 },
    39 41 "sections": {
    40 42 "header": {

    sections/header.liquid Ændringer i sections/header.liquid: 1 tilføjet, 0 fjernet

    Ændringer i sections/header.liquid: 1 tilføjet, 0 fjernet
    Linje før Linje efter Ændring Kode
    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 Tilføjet <span class="visually-hidden">{{ 'general.search.search' | t }}</span>
    43 44 </button>
    44 45 </form>
    45 46 </div>

    sections/main-product.liquid Ændringer i sections/main-product.liquid: 1 tilføjet, 1 fjernet

    Ændringer i sections/main-product.liquid: 1 tilføjet, 1 fjernet
    Linje før Linje efter Ændring Kode
    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 Fjernet <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 Tilføjet <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 Ændringer i sections/slideshow.liquid: 2 tilføjet, 0 fjernet

    Ændringer i sections/slideshow.liquid: 2 tilføjet, 0 fjernet
    Linje før Linje efter Ændring Kode
    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 Tilføjet <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 Tilføjet <span class="visually-hidden">{{ 'accessibility.next_slide' | t }}</span>
    70 72 </button>
    71 73 </div>
    72 74 </slideshow-component>

    snippets/cookie-banner.liquid Ændringer i snippets/cookie-banner.liquid: 2 tilføjet, 0 fjernet

    Ændringer i snippets/cookie-banner.liquid: 2 tilføjet, 0 fjernet
    Linje før Linje efter Ændring Kode
    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 Tilføjet <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 Tilføjet <span class="visually-hidden">{{ 'accessibility.reject_cookies' | t }}</span>
    29 31 </button>
    30 32 </div>
    31 33 </div>

    snippets/quantity-input.liquid Ændringer i snippets/quantity-input.liquid: 2 tilføjet, 0 fjernet

    Ændringer i snippets/quantity-input.liquid: 2 tilføjet, 0 fjernet
    Linje før Linje efter Ændring Kode
    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 Tilføjet <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 Tilføjet <span class="visually-hidden">{{ 'products.product.quantity.increase' | t: product: product_title }}</span>
    16 18 </button></div>
    links Eksempeldata

    sections/footer.liquid Ændringer i sections/footer.liquid: 1 tilføjet, 0 fjernet

    Ændringer i sections/footer.liquid: 1 tilføjet, 0 fjernet
    Linje før Linje efter Ændring Kode
    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 Tilføjet <span class="visually-hidden">{{ 'general.social.links.' | append: social.icon | t }}</span>
    40 41 </a>
    41 42 {%- endfor %}
    42 43 </ul>

    sections/header.liquid Ændringer i sections/header.liquid: 3 tilføjet, 1 fjernet

    Ændringer i sections/header.liquid: 3 tilføjet, 1 fjernet
    Linje før Linje efter Ændring Kode
    22 22 </details>
    23 23
    24 24 {% if logo_is_heading %}<h1 class="header__heading">{% else %}<div class="header__heading">{% endif %}
    25 Fjernet <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 Tilføjet <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 Tilføjet <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 Tilføjet <span class="visually-hidden">{{ 'sections.header.cart' | t }}</span>
    60 62 </a>
    61 63 </div>
    62 64 </header>

    sections/main-cart.liquid Ændringer i sections/main-cart.liquid: 1 tilføjet, 0 fjernet

    Ændringer i sections/main-cart.liquid: 1 tilføjet, 0 fjernet
    Linje før Linje efter Ændring Kode
    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 Tilføjet <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">
  • Dekorative billeder skjult for skærmlæsere decorative-image-alt Kun billeder, som koden beviser er dekorative, skjules for skærmlæsere; tekstalternativet til alle andre billeder overlades til et menneske.

    Et billede markeres kun som dekorativt, når koden beviser, at det ikke tilføjer noget: Det sidder i et link eller en knap, der har sin egen tekst, det er et ikon ved siden af sin egen tekstetiket, eller det er en afstandsholder eller en skillelinje. Et <img>-element får så et tomt alt="", og et SVG-ikon får aria-hidden="true", så skærmlæsere springer det over i stedet for at læse et filnavn eller ordet »billede« op. Ethvert andet billede er indhold, og dets tekstalternativ overlades til et menneske.

    Regler, den dækker
    • image-alt ASSISTED
    • role-img-alt ASSISTED
    • svg-img-alt ASSISTED
    Filtyper, den ændrer
    .liquid
    Før og efter Eksempeldata

    sections/footer.liquid Ændringer i sections/footer.liquid: 1 tilføjet, 1 fjernet

    Ændringer i sections/footer.liquid: 1 tilføjet, 1 fjernet
    Linje før Linje efter Ændring Kode
    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 Fjernet <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 Tilføjet <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 Ændringer i sections/header.liquid: 1 tilføjet, 1 fjernet

    Ændringer i sections/header.liquid: 1 tilføjet, 1 fjernet
    Linje før Linje efter Ændring Kode
    46 46
    47 47 <div class="header__icons">
    48 48 {%- if section.settings.show_help_link %}
    49 Fjernet <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 Tilføjet <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 -%}
  • Titler til indlejrede kort og videoer iframe-title En indlejret ramme uden titel får en oversat titel, der siger, hvad den viser, hvor rammens kildeadresse eller indhold fortæller det.

    En indlejret ramme uden titel, for eksempel et kort eller en YouTube- eller Vimeo-video, får en oversat titel, der siger, hvad den viser. Opskriften udleder det af rammens kildeadresse eller indhold. En ramme, hvis indhold koden ikke viser, får ingen generisk titel; den overlades til et menneske.

    Regler, den dækker
    • frame-title AUTO
    Filtyper, den ændrer
    .json.liquid
    Før og efter Eksempeldata

    locales/en.default.json Ændringer i locales/en.default.json: 2 tilføjet, 1 fjernet

    Ændringer i locales/en.default.json: 2 tilføjet, 1 fjernet
    Linje før Linje efter Ændring Kode
    34 34 "total_reviews": "{{ count }} reviews",
    35 35 "link_messages": {
    36 36 "new_window": "Opens in a new window."
    37 Fjernet }
    37 Tilføjet },
    38 Tilføjet "embed_map": "Map"
    38 39 },
    39 40 "sections": {
    40 41 "header": {

    sections/contact-form.liquid Ændringer i sections/contact-form.liquid: 1 tilføjet, 1 fjernet

    Ændringer i sections/contact-form.liquid: 1 tilføjet, 1 fjernet
    Linje før Linje efter Ændring Kode
    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 Fjernet <iframe class="store-map" srcdoc="{{ map_document | escape }}" width="600" height="360"></iframe>
    11 Tilføjet <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' %}
Detaljer: niveauerne, testtemaet og tekst på din webshops sprog

En opskrift er en deterministisk ændring for én slags fejl: Den samme kode får altid den samme ændring. Validiscan har 20 opskrifter til Shopify-temaer. Hver af dem foretager kun en ændring, hvor temaets kode viser, hvad den rigtige ændring er; hvor den ikke gør det, ændrer opskriften intet, og fundet overlades til et menneske.

Under hver opskrift finder du de regler, den dækker, med hver regels niveau i Validiscans regelkatalog. AUTO betyder, at en opskrift er reglens standardrettelse. ASSISTED betyder, at rettelsen kræver en vurdering, så en ændring udarbejdes som udkast og gennemgås derefter. MANUAL betyder, at reglen kræver en persons beslutning, og at Validiscan giver vejledning i stedet for en kodeændring. I et projekt anvendes opskrifter på fund af regler på niveau AUTO. Hvor en opskrift også angiver en regel på niveau ASSISTED eller MANUAL, følger et fund af den regel i stedet ASSISTED- eller MANUAL-forløbet. En regel, der er markeret »kontrolleres via« en anden kontrol, køres ikke selvstændigt i en scanning: Den anden kontrol rapporterer den samme fejl.

Filtyperne og før-og-efter-visningen for hver opskrift stammer fra applikationens egne tests. De kører på applikationens Shopify-testtema, et Liquid-tema, der er bygget som Shopifys Dawn-tema, og hvor der med vilje er lagt tilgængelighedsfejl ind. De kontrollerer, at fejlen er væk efter ændringen; de fleste kontrollerer desuden, at ændringen ikke giver en ny fejl for den samme regel. Dit temas filer ser anderledes ud. Testtemaet indeholder stadig en layout/checkout.liquid-fil og et snippet til et felt i kassen, snippets/checkout-field.liquid, så nogle af diffene ændrer dem; som beskrevet ovenfor bruger Shopify ikke længere den fil til trinnene med oplysninger, forsendelse og betaling.

Når en opskrift tilføjer tekst, for eksempel ordene i et spring over-link eller navnet på en ikonknap, genbruger den en oversættelse, som temaet allerede har, hvor det er muligt. Ellers tilføjer den teksten på engelsk og, hvor temaet har en tysk sprogfil, også på tysk. Tekst på webshoppens andre sprog tilføjes ikke: Et tema, hvis standardsprog hverken er engelsk eller tysk, får dér den engelske tekst.

Hvad forbliver på niveau MANUAL på Shopify?

Fejl, der kræver en beslutning om indhold eller adfærd, som ingen på forhånd bestemt kodeændring kan træffe, for eksempel undertekster og transskriptioner til dine videoer og dit lydindhold, forbliver på niveau MANUAL på Shopify. For et fund på en MANUAL-regel giver Validiscan vejledning i, hvordan det rettes, ikke en ændring af din kode.

Reglerne herunder køres i en scanning og har rettelsesniveauet MANUAL på Shopify.

  • meta-refresh Forsinket genindlæsning under 20 timer må ikke bruges
  • nested-interactive Interaktive betjeningselementer må ikke være indlejret i hinanden
  • scrollable-region-focusable Scrollbare områder skal kunne nås med tastaturet
  • server-side-image-map Serverside-billedkort må ikke bruges
  • vs-keyboard-trap Tastaturfokus må aldrig sidde fast
  • vs-focus-order Fokusrækkefølgen skal følge den visuelle rækkefølge
  • vs-dragging Elementer, der kun kan betjenes ved at trække, skal have et alternativ med et enkelt klik eller tryk
  • vs-media Video skal have undertekster, lyd skal have en transskription, og intet må afspille lyd automatisk
  • vs-documents Linkede dokumenter skal gennemgås manuelt for tilgængelighed
Detaljer: kontrollen af fokusrækkefølgen, og hvad et projekt ikke omfatter

For et fund på en MANUAL-regel giver Validiscan vejledning i, hvordan det rettes, ikke en ændring af din kode. Disse fejl kræver en beslutning om indhold eller adfærd, som ingen på forhånd bestemt kodeændring kan træffe, for eksempel undertekster og transskriptioner til dine videoer og dit lydindhold, en vej ud af en widget, hvor tastaturfokus sidder fast, eller en anden måde at bruge et betjeningselement på, som kun virker ved at trække. Kontrollen af fokusrækkefølgen, vs-focus-order, har niveau MANUAL, fordi en fokusrækkefølge, der ikke svarer til skærmbilledet, er et spørgsmål om, hvordan skabelonerne er ordnet; hvor et af dens fund handler om et tabindex over 0, fjerner opskriften om tab-rækkefølgen ovenfor det tabindex.

Arbejdet med fund på niveau MANUAL, der kræver dine egne beslutninger om indhold, er ikke en del af et projekt, og det samme gælder PDF-filer. Mellem reglerne på niveau AUTO og dem på niveau MANUAL ligger reglerne på niveau ASSISTED, for eksempel tekstalternativer til billeder eller navne til knapper: Deres rettelser kræver en vurdering, og Validiscan gennemgår hver rettelse, før den leveres. Hvad automatiseret test af webtilgængelighed kan og ikke kan bevise

Hvad stiller du til rådighed?

Til et Shopify-projekt stiller du fem ting til rådighed: skriftlig tilladelse til en fuld scanning af din webshop, én vej ind i dit tema, dit svar på, om AI må udarbejde rettelser på niveau ASSISTED, en gennemgang af ændringerne og dine beslutninger om det, der forbliver MANUAL.

  1. Skriftlig tilladelse til en fuld scanning af din webshop. En fuld scanning lægger et produkt i kurven og åbner det første trin i kassen uden at gennemføre et køb eller indtaste betalingsoplysninger.
  2. Én vej ind i dit tema: adgang til det GitHub-repository, der rummer det; en Theme Access-adgangskode og din webshops myshopify.com-adresse; eller en temafil, der er uploadet i kundeportalen.
  3. Dit svar på, om AI må udarbejde rettelser på niveau ASSISTED. AI-udkast er slået fra, indtil du siger ja.
  4. En gennemgang af ændringerne: Publicer temakopien, merge pull requesten eller anvend patchpakken.
  5. Dine beslutninger om det, der forbliver MANUAL, for eksempel undertekster til dine videoer.
Detaljer: når ændringerne er live, og hvad et projekt dækker

Når ændringerne er live, kontrollerer en verifikationsscanning de berørte sider igen, og Remediation Evidence Package registrerer resultatet. Sådan forløber et projekt, trin for trin

Et projekt dækker én webshop: ét domæne og ét tema.

Kilder

6 kilder, alle kontrolleret til denne side den 6. oktober 2026.

Shopifys dokumentation, Help Center og App Store 6
  1. Manage theme access · Shopify · kontrolleret
  2. Downloading themes · Shopify Help Center · kontrolleret
  3. Publishing themes · Shopify Help Center · kontrolleret
  4. Shopify GitHub integration for themes · Shopify · kontrolleret
  5. checkout.liquid · Shopify · kontrolleret
  6. Theme Access · Shopify App Store · kontrolleret

Begynd med et gratis tjek af din webshop.

Send din webshops adresse. Validiscan scanner den og svarer med hver fejl, scanningen kan påvise, med siden og koden.

Bestil et gratis tjek

Eller skriv til info@validiscan.com.

Hvad det gratis tjek omfatter, og hvad det udelader
Du sender
din webshops adresse
Sider, der scannes
op til 15
Du får
hver fejl, scanningen kan påvise, med siden og koden
På din webshop
kun offentlige sider; intet login, intet købt, ingen formularer sendt
Hvad det ikke er
et fuldt audit

Skriv til Validiscan

Til et gratis tjek skal du skrive din webshops adresse og platform.

Validiscan bruger det, du sender, til at svare dig. Privatlivspolitik