@bettercms-ai/mcp 0.83.0 → 0.83.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +86 -86
- package/SKILL.md +160 -160
- package/dist/index.js +38 -9
- package/dist/index.js.map +1 -1
- package/dist/kit-catalog.json +1509 -1509
- package/dist/skills/bettercms/SKILL.md +206 -206
- package/dist/skills/bettercms/references/accessibility.md +171 -171
- package/dist/skills/bettercms/references/animation.md +296 -296
- package/dist/skills/bettercms/references/astro.md +148 -148
- package/dist/skills/bettercms/references/bindings.md +366 -366
- package/dist/skills/bettercms/references/componentize.md +185 -185
- package/dist/skills/bettercms/references/components.md +415 -415
- package/dist/skills/bettercms/references/content-experiments.md +62 -62
- package/dist/skills/bettercms/references/content-modeling.md +382 -382
- package/dist/skills/bettercms/references/detection.md +465 -465
- package/dist/skills/bettercms/references/dock-input.md +121 -121
- package/dist/skills/bettercms/references/editor-chrome.md +92 -92
- package/dist/skills/bettercms/references/external-content.md +78 -78
- package/dist/skills/bettercms/references/finish-site.md +377 -377
- package/dist/skills/bettercms/references/forms-and-interactions.md +245 -245
- package/dist/skills/bettercms/references/frameworks.md +159 -159
- package/dist/skills/bettercms/references/getting-started.md +156 -156
- package/dist/skills/bettercms/references/integrations.md +364 -364
- package/dist/skills/bettercms/references/kit-catalog.md +3259 -3259
- package/dist/skills/bettercms/references/kit-scenarios.md +712 -712
- package/dist/skills/bettercms/references/localization.md +85 -85
- package/dist/skills/bettercms/references/media-and-brand.md +181 -181
- package/dist/skills/bettercms/references/next.md +189 -189
- package/dist/skills/bettercms/references/other-frameworks.md +85 -85
- package/dist/skills/bettercms/references/portable-text.md +213 -213
- package/dist/skills/bettercms/references/programmatic-seo.md +98 -98
- package/dist/skills/bettercms/references/publishing.md +289 -289
- package/dist/skills/bettercms/references/seo.md +357 -357
- package/dist/skills/bettercms/references/shopify-headless.md +52 -52
- package/dist/skills/bettercms/references/site-blueprints.md +895 -895
- package/dist/skills/bettercms/references/site-review.md +74 -74
- package/dist/skills/bettercms/references/worked-examples-advanced.md +509 -509
- package/dist/skills/bettercms/references/worked-examples.md +885 -885
- package/dist/skills/bettercms/references/write-limits.md +217 -217
- package/package.json +1 -1
|
@@ -1,171 +1,171 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: "Accessibility"
|
|
3
|
-
description: "WCAG 2.2 AA rules for converted and built sites: alt text, media, forms, contrast, links, motion, the audit codes, and the manual check list to run before reporting done."
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Accessibility
|
|
7
|
-
|
|
8
|
-
**Outcome.** A converted or built site meets WCAG 2.2 AA where BetterCMS lets an agent control
|
|
9
|
-
it, and the report says plainly what was checked and what was not.
|
|
10
|
-
|
|
11
|
-
`list_seo_issues` reports the checkable items as `a11y.` codes, from the stored blocks of
|
|
12
|
-
published pages: image alt missing, h1 missing, several h1, an h1 inside body text, a skipped
|
|
13
|
-
heading level, generic link or button text, a video with no transcript. Each names the page and
|
|
14
|
-
its block ids. It cannot see inside a `component` or `collection` block, an entry's fields, or a
|
|
15
|
-
route the repo's code renders, and a clean result says nothing about contrast, focus order,
|
|
16
|
-
keyboard use or form behaviour. Those stay manual: read the rendered page, then report what you
|
|
17
|
-
saw. Never write "WCAG compliant"; write "checked against this list, with these exceptions".
|
|
18
|
-
|
|
19
|
-
Related: [media-and-brand.md](media-and-brand.md) (assets, SVG, video, focal point),
|
|
20
|
-
[forms-and-interactions.md](forms-and-interactions.md) (form fields, interactive patterns),
|
|
21
|
-
[portable-text.md](portable-text.md) (heading levels, lists, tables), [seo.md](seo.md).
|
|
22
|
-
|
|
23
|
-
## Contents
|
|
24
|
-
|
|
25
|
-
- [Where each fact is stored](#where-each-fact-is-stored) · [Alt text](#alt-text)
|
|
26
|
-
- [Video and audio](#video-and-audio) · [Forms](#forms) · [Structure and links](#structure-and-links)
|
|
27
|
-
- [Colour, contrast and motion](#colour-contrast-and-motion) · [Check list before done](#check-list-before-done)
|
|
28
|
-
- [What to report](#what-to-report)
|
|
29
|
-
|
|
30
|
-
## Where each fact is stored
|
|
31
|
-
|
|
32
|
-
| Fact | Lives in | Write with |
|
|
33
|
-
|---|---|---|
|
|
34
|
-
| Alt text of an image | `altText` on the image value, and on the media asset | the value in the entry or page write; `update_media` `altText` for the asset |
|
|
35
|
-
| Caption | `caption` on the asset | `update_media` `caption` |
|
|
36
|
-
| Transcript (video or audio) | the asset, published wherever the file is used | `update_media` `transcript` (at most 100,000 characters) |
|
|
37
|
-
| Decorative image | `decorative` on the asset; an empty `altText` on one value | `update_media` `decorative: true`; the value in the entry or page write |
|
|
38
|
-
| Captions track (`.vtt`) | not stored by any tool | report as missing; the owner adds it |
|
|
39
|
-
| Form label, required mark, help text, consent wording | the Form's fields | `create_form` / `update_form` |
|
|
40
|
-
| Icon-only link or button label | the element's `aria-label` or visually hidden text in the code, or the component prop that feeds it | code, or the component prop |
|
|
41
|
-
| Page language | the page or entry `locale` | see [localization.md](localization.md) |
|
|
42
|
-
| Page title | `metaTitle` | see [seo.md](seo.md) |
|
|
43
|
-
|
|
44
|
-
An image value is an object, never a bare string. Alt on the asset is the default; alt on the
|
|
45
|
-
value is for this placement only. Set both when the same file reads differently in two places.
|
|
46
|
-
|
|
47
|
-
## Alt text
|
|
48
|
-
|
|
49
|
-
An asset that is decoration wherever it is used takes `update_media` `decorative: true`: the
|
|
50
|
-
audit stops asking for its alt text. An image VALUE has no such flag; an empty alt marks that one
|
|
51
|
-
placement as decoration. A missing alt and a deliberately empty alt look the same to the next
|
|
52
|
-
reader, so list every empty alt you left on purpose.
|
|
53
|
-
|
|
54
|
-
| Image | Alt |
|
|
55
|
-
|---|---|
|
|
56
|
-
| Informative | What it shows that matters in this place. Never the file name, "image of", "photo" or "logo" |
|
|
57
|
-
| Logo | The company name. A linked logo says where it goes ("Caldera home") |
|
|
58
|
-
| Person | "Portrait of {name}" |
|
|
59
|
-
| Product | The product name and what the photo shows |
|
|
60
|
-
| Chart or diagram | One sentence with the trend or the point; put the numbers in real text nearby |
|
|
61
|
-
| Image of text (size guide, menu) | Rebuild it as a table or list; keep the image only as a diagram |
|
|
62
|
-
| Background image that carries meaning | Make it an image with alt, or mark it decorative |
|
|
63
|
-
| Decorative (rule, flourish, duplicate of nearby text) | Empty alt; `decorative: true` on the asset when it is never informative |
|
|
64
|
-
|
|
65
|
-
- Copy the source's real alt when it is good. Rewrite "image of ..." and file-name alt to
|
|
66
|
-
describe the image.
|
|
67
|
-
- Missing or junk alt on a meaningful image: write it from the visible context and flag
|
|
68
|
-
`alt-written` for review. With no context to draw on, leave it empty and flag `alt-missing`.
|
|
69
|
-
- An empty alt is right for decoration and wrong on a portfolio, product or team photo. Flag
|
|
70
|
-
every empty alt on a content image.
|
|
71
|
-
- Generated images (`generate_image`, `transform_image`) always get `altText`.
|
|
72
|
-
|
|
73
|
-
## Video and audio
|
|
74
|
-
|
|
75
|
-
- Never invent captions or a transcript. If the source has none, leave the field empty, and
|
|
76
|
-
report it.
|
|
77
|
-
- A transcript you produced from your own speech-to-text goes on the asset with `update_media`
|
|
78
|
-
`transcript`. It then publishes on the page, the Markdown twin, llms-full.txt and the delivery
|
|
79
|
-
API. BetterCMS does not generate transcripts.
|
|
80
|
-
- Captions are `.vtt` files and no BetterCMS field stores them. State "captions missing" in the
|
|
81
|
-
report for any video with speech.
|
|
82
|
-
- A video needs a poster image and autoplays only muted.
|
|
83
|
-
- An embed needs a `title` naming the provider and what it shows. Write one when missing.
|
|
84
|
-
- An animation, Lottie or 3D scene needs a poster or fallback image and a text label, and must
|
|
85
|
-
stop for reduced motion.
|
|
86
|
-
|
|
87
|
-
## Forms
|
|
88
|
-
|
|
89
|
-
Forms are Form records, so the rules apply to the form's fields ([forms-and-interactions.md](forms-and-interactions.md)).
|
|
90
|
-
|
|
91
|
-
- Every field has a `label`, which the renderer shows as a visible label. A placeholder is not a
|
|
92
|
-
label. If the source used placeholders only, write a label from each, and flag it.
|
|
93
|
-
- Mark required fields with `required: true`. The hosted renderer adds an asterisk; say in the
|
|
94
|
-
field's `helpText` or the form intro that starred fields are required, so colour or a symbol is
|
|
95
|
-
never the only signal.
|
|
96
|
-
- `helpText` carries the format or constraint ("Use the number on your invoice"). A refused
|
|
97
|
-
submission returns `issues[].field` and `issues[].rule`; show the field name and the fix in the
|
|
98
|
-
form's error copy.
|
|
99
|
-
- Consent: a `consent` field starts unticked and must be ticked to submit. Import a source's
|
|
100
|
-
pre-ticked box as unticked, and flag it. Import confirmshaming copy as written, then flag it
|
|
101
|
-
with a neutral rewrite.
|
|
102
|
-
- `autocomplete` is not a field setting. The hosted and Next renderers set it where they know
|
|
103
|
-
it (phone). For a self-hosted form with its own markup, keep the source's values (`email`,
|
|
104
|
-
`given-name`, `tel`, `postal-code`).
|
|
105
|
-
- A form result (success, error) must be announced. The Next `BcmsForm` uses a live region; check
|
|
106
|
-
that a custom form does too.
|
|
107
|
-
|
|
108
|
-
## Structure and links
|
|
109
|
-
|
|
110
|
-
- Heading levels follow the outline: one H1, no skipped level. How a heading level is chosen and
|
|
111
|
-
stored is in [portable-text.md](portable-text.md). Size is a style token, never a reason to
|
|
112
|
-
pick a level.
|
|
113
|
-
- Lists, tables and quotes use their real Portable Text blocks, never lines of text with
|
|
114
|
-
bullets or spaces.
|
|
115
|
-
- Link text says where it goes. Replace "click here", "read more" and "learn more" on their own
|
|
116
|
-
with the target ("Read the care guide"). Where the card layout forces a short visible label,
|
|
117
|
-
add the target as visually hidden text or an `aria-label` in code.
|
|
118
|
-
- Icon-only links and buttons (social icons, close, menu, carousel arrows) have an `aria-label`
|
|
119
|
-
or hidden text. A dot or a map pin that links needs one too. Draft the label and flag it; never
|
|
120
|
-
leave it empty.
|
|
121
|
-
- Navigation, footer and announcement bar belong in Global Layout (`update_layout`). Check the
|
|
122
|
-
skip link, the landmark roles (`header`, `nav`, `main`, `footer`) and that the mobile menu
|
|
123
|
-
opens by keyboard and returns focus.
|
|
124
|
-
- Set the page `locale`. Mark a foreign phrase inside text with `lang` in code.
|
|
125
|
-
- DOM order is reading order; never reorder with CSS. Targets are at least 24 by 24 CSS pixels.
|
|
126
|
-
|
|
127
|
-
## Colour, contrast and motion
|
|
128
|
-
|
|
129
|
-
- Contrast: 4.5:1 for body text, 3:1 for large text (24px, or 19px bold) and for borders of
|
|
130
|
-
controls and icons that carry meaning. Check each theme and each variant the editor can pick,
|
|
131
|
-
including text over photos.
|
|
132
|
-
- Take colour from brand tokens and section styles, never from a copied hex
|
|
133
|
-
([media-and-brand.md](media-and-brand.md)). A brand colour that fails contrast is reported
|
|
134
|
-
with the pair and ratio; never change the kit unasked.
|
|
135
|
-
- Information is never colour alone: a status dot has a word beside it; a check mark has
|
|
136
|
-
"Included" beside it.
|
|
137
|
-
- Respect reduced motion: scroll stories stack, parallax goes still, Lottie shows its fallback.
|
|
138
|
-
- Carousels, marquees and auto-advancing tabs need a pause control and stop when focused.
|
|
139
|
-
|
|
140
|
-
## Check list before done
|
|
141
|
-
|
|
142
|
-
Run `list_seo_issues` first and fix every `a11y.` code (rows 1, 3, 4 and 5 for hosted pages).
|
|
143
|
-
Then run these on the rendered pages (desktop and a 390 px mobile width), not on the stored data.
|
|
144
|
-
Cover the home page, one page per template, one entry per collection, and every form page.
|
|
145
|
-
|
|
146
|
-
| # | Check | How |
|
|
147
|
-
|---|---|---|
|
|
148
|
-
| 1 | Every informative image has alt; every empty alt is intentional | read each image's `altText` in the page output; list empties |
|
|
149
|
-
| 2 | No alt is a file name, "image of" or "logo" | scan the same list |
|
|
150
|
-
| 3 | Video and audio: transcript on the asset, captions reported | `get_media`, then the player |
|
|
151
|
-
| 4 | One H1, no skipped heading levels | outline the headings in order |
|
|
152
|
-
| 5 | Link text is meaningful out of context | list all links; fix vague ones |
|
|
153
|
-
| 6 | Icon-only controls have a name | inspect each; draft and flag |
|
|
154
|
-
| 7 | Every form field has a visible label, required is stated in text, consent is unticked | `get_form`, then the page |
|
|
155
|
-
| 8 | A refused submission names the field and the fix | send one bad test submission |
|
|
156
|
-
| 9 | Contrast meets 4.5:1 and 3:1 in every theme | measure real colour pairs |
|
|
157
|
-
| 10 | Whole page works by keyboard: tab order, visible focus, menu, dialog, accordion, tabs | tab through it |
|
|
158
|
-
| 12 | Motion stops or stills under reduced motion | emulate the preference |
|
|
159
|
-
| 13 | Page has a title and a language | `list_seo_issues` for title; check `locale` |
|
|
160
|
-
| 14 | Embeds have a title; moving content can pause | inspect each |
|
|
161
|
-
|
|
162
|
-
## What to report
|
|
163
|
-
|
|
164
|
-
Report accessibility as its own short block in the final report:
|
|
165
|
-
|
|
166
|
-
- Checked: the pages and the rows above you ran.
|
|
167
|
-
- Written: drafted alt (`alt-written`), labels and transcripts. Left empty on purpose: decorative
|
|
168
|
-
images, and each asset marked `decorative`.
|
|
169
|
-
- Open: `alt-missing`, captions missing, contrast failures with the measured ratio, controls you
|
|
170
|
-
could not test (a third-party embed, a payment step).
|
|
171
|
-
- Not claimed: conformance. No tool certifies it; the audit covers stored blocks only.
|
|
1
|
+
---
|
|
2
|
+
title: "Accessibility"
|
|
3
|
+
description: "WCAG 2.2 AA rules for converted and built sites: alt text, media, forms, contrast, links, motion, the audit codes, and the manual check list to run before reporting done."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Accessibility
|
|
7
|
+
|
|
8
|
+
**Outcome.** A converted or built site meets WCAG 2.2 AA where BetterCMS lets an agent control
|
|
9
|
+
it, and the report says plainly what was checked and what was not.
|
|
10
|
+
|
|
11
|
+
`list_seo_issues` reports the checkable items as `a11y.` codes, from the stored blocks of
|
|
12
|
+
published pages: image alt missing, h1 missing, several h1, an h1 inside body text, a skipped
|
|
13
|
+
heading level, generic link or button text, a video with no transcript. Each names the page and
|
|
14
|
+
its block ids. It cannot see inside a `component` or `collection` block, an entry's fields, or a
|
|
15
|
+
route the repo's code renders, and a clean result says nothing about contrast, focus order,
|
|
16
|
+
keyboard use or form behaviour. Those stay manual: read the rendered page, then report what you
|
|
17
|
+
saw. Never write "WCAG compliant"; write "checked against this list, with these exceptions".
|
|
18
|
+
|
|
19
|
+
Related: [media-and-brand.md](media-and-brand.md) (assets, SVG, video, focal point),
|
|
20
|
+
[forms-and-interactions.md](forms-and-interactions.md) (form fields, interactive patterns),
|
|
21
|
+
[portable-text.md](portable-text.md) (heading levels, lists, tables), [seo.md](seo.md).
|
|
22
|
+
|
|
23
|
+
## Contents
|
|
24
|
+
|
|
25
|
+
- [Where each fact is stored](#where-each-fact-is-stored) · [Alt text](#alt-text)
|
|
26
|
+
- [Video and audio](#video-and-audio) · [Forms](#forms) · [Structure and links](#structure-and-links)
|
|
27
|
+
- [Colour, contrast and motion](#colour-contrast-and-motion) · [Check list before done](#check-list-before-done)
|
|
28
|
+
- [What to report](#what-to-report)
|
|
29
|
+
|
|
30
|
+
## Where each fact is stored
|
|
31
|
+
|
|
32
|
+
| Fact | Lives in | Write with |
|
|
33
|
+
|---|---|---|
|
|
34
|
+
| Alt text of an image | `altText` on the image value, and on the media asset | the value in the entry or page write; `update_media` `altText` for the asset |
|
|
35
|
+
| Caption | `caption` on the asset | `update_media` `caption` |
|
|
36
|
+
| Transcript (video or audio) | the asset, published wherever the file is used | `update_media` `transcript` (at most 100,000 characters) |
|
|
37
|
+
| Decorative image | `decorative` on the asset; an empty `altText` on one value | `update_media` `decorative: true`; the value in the entry or page write |
|
|
38
|
+
| Captions track (`.vtt`) | not stored by any tool | report as missing; the owner adds it |
|
|
39
|
+
| Form label, required mark, help text, consent wording | the Form's fields | `create_form` / `update_form` |
|
|
40
|
+
| Icon-only link or button label | the element's `aria-label` or visually hidden text in the code, or the component prop that feeds it | code, or the component prop |
|
|
41
|
+
| Page language | the page or entry `locale` | see [localization.md](localization.md) |
|
|
42
|
+
| Page title | `metaTitle` | see [seo.md](seo.md) |
|
|
43
|
+
|
|
44
|
+
An image value is an object, never a bare string. Alt on the asset is the default; alt on the
|
|
45
|
+
value is for this placement only. Set both when the same file reads differently in two places.
|
|
46
|
+
|
|
47
|
+
## Alt text
|
|
48
|
+
|
|
49
|
+
An asset that is decoration wherever it is used takes `update_media` `decorative: true`: the
|
|
50
|
+
audit stops asking for its alt text. An image VALUE has no such flag; an empty alt marks that one
|
|
51
|
+
placement as decoration. A missing alt and a deliberately empty alt look the same to the next
|
|
52
|
+
reader, so list every empty alt you left on purpose.
|
|
53
|
+
|
|
54
|
+
| Image | Alt |
|
|
55
|
+
|---|---|
|
|
56
|
+
| Informative | What it shows that matters in this place. Never the file name, "image of", "photo" or "logo" |
|
|
57
|
+
| Logo | The company name. A linked logo says where it goes ("Caldera home") |
|
|
58
|
+
| Person | "Portrait of {name}" |
|
|
59
|
+
| Product | The product name and what the photo shows |
|
|
60
|
+
| Chart or diagram | One sentence with the trend or the point; put the numbers in real text nearby |
|
|
61
|
+
| Image of text (size guide, menu) | Rebuild it as a table or list; keep the image only as a diagram |
|
|
62
|
+
| Background image that carries meaning | Make it an image with alt, or mark it decorative |
|
|
63
|
+
| Decorative (rule, flourish, duplicate of nearby text) | Empty alt; `decorative: true` on the asset when it is never informative |
|
|
64
|
+
|
|
65
|
+
- Copy the source's real alt when it is good. Rewrite "image of ..." and file-name alt to
|
|
66
|
+
describe the image.
|
|
67
|
+
- Missing or junk alt on a meaningful image: write it from the visible context and flag
|
|
68
|
+
`alt-written` for review. With no context to draw on, leave it empty and flag `alt-missing`.
|
|
69
|
+
- An empty alt is right for decoration and wrong on a portfolio, product or team photo. Flag
|
|
70
|
+
every empty alt on a content image.
|
|
71
|
+
- Generated images (`generate_image`, `transform_image`) always get `altText`.
|
|
72
|
+
|
|
73
|
+
## Video and audio
|
|
74
|
+
|
|
75
|
+
- Never invent captions or a transcript. If the source has none, leave the field empty, and
|
|
76
|
+
report it.
|
|
77
|
+
- A transcript you produced from your own speech-to-text goes on the asset with `update_media`
|
|
78
|
+
`transcript`. It then publishes on the page, the Markdown twin, llms-full.txt and the delivery
|
|
79
|
+
API. BetterCMS does not generate transcripts.
|
|
80
|
+
- Captions are `.vtt` files and no BetterCMS field stores them. State "captions missing" in the
|
|
81
|
+
report for any video with speech.
|
|
82
|
+
- A video needs a poster image and autoplays only muted.
|
|
83
|
+
- An embed needs a `title` naming the provider and what it shows. Write one when missing.
|
|
84
|
+
- An animation, Lottie or 3D scene needs a poster or fallback image and a text label, and must
|
|
85
|
+
stop for reduced motion.
|
|
86
|
+
|
|
87
|
+
## Forms
|
|
88
|
+
|
|
89
|
+
Forms are Form records, so the rules apply to the form's fields ([forms-and-interactions.md](forms-and-interactions.md)).
|
|
90
|
+
|
|
91
|
+
- Every field has a `label`, which the renderer shows as a visible label. A placeholder is not a
|
|
92
|
+
label. If the source used placeholders only, write a label from each, and flag it.
|
|
93
|
+
- Mark required fields with `required: true`. The hosted renderer adds an asterisk; say in the
|
|
94
|
+
field's `helpText` or the form intro that starred fields are required, so colour or a symbol is
|
|
95
|
+
never the only signal.
|
|
96
|
+
- `helpText` carries the format or constraint ("Use the number on your invoice"). A refused
|
|
97
|
+
submission returns `issues[].field` and `issues[].rule`; show the field name and the fix in the
|
|
98
|
+
form's error copy.
|
|
99
|
+
- Consent: a `consent` field starts unticked and must be ticked to submit. Import a source's
|
|
100
|
+
pre-ticked box as unticked, and flag it. Import confirmshaming copy as written, then flag it
|
|
101
|
+
with a neutral rewrite.
|
|
102
|
+
- `autocomplete` is not a field setting. The hosted and Next renderers set it where they know
|
|
103
|
+
it (phone). For a self-hosted form with its own markup, keep the source's values (`email`,
|
|
104
|
+
`given-name`, `tel`, `postal-code`).
|
|
105
|
+
- A form result (success, error) must be announced. The Next `BcmsForm` uses a live region; check
|
|
106
|
+
that a custom form does too.
|
|
107
|
+
|
|
108
|
+
## Structure and links
|
|
109
|
+
|
|
110
|
+
- Heading levels follow the outline: one H1, no skipped level. How a heading level is chosen and
|
|
111
|
+
stored is in [portable-text.md](portable-text.md). Size is a style token, never a reason to
|
|
112
|
+
pick a level.
|
|
113
|
+
- Lists, tables and quotes use their real Portable Text blocks, never lines of text with
|
|
114
|
+
bullets or spaces.
|
|
115
|
+
- Link text says where it goes. Replace "click here", "read more" and "learn more" on their own
|
|
116
|
+
with the target ("Read the care guide"). Where the card layout forces a short visible label,
|
|
117
|
+
add the target as visually hidden text or an `aria-label` in code.
|
|
118
|
+
- Icon-only links and buttons (social icons, close, menu, carousel arrows) have an `aria-label`
|
|
119
|
+
or hidden text. A dot or a map pin that links needs one too. Draft the label and flag it; never
|
|
120
|
+
leave it empty.
|
|
121
|
+
- Navigation, footer and announcement bar belong in Global Layout (`update_layout`). Check the
|
|
122
|
+
skip link, the landmark roles (`header`, `nav`, `main`, `footer`) and that the mobile menu
|
|
123
|
+
opens by keyboard and returns focus.
|
|
124
|
+
- Set the page `locale`. Mark a foreign phrase inside text with `lang` in code.
|
|
125
|
+
- DOM order is reading order; never reorder with CSS. Targets are at least 24 by 24 CSS pixels.
|
|
126
|
+
|
|
127
|
+
## Colour, contrast and motion
|
|
128
|
+
|
|
129
|
+
- Contrast: 4.5:1 for body text, 3:1 for large text (24px, or 19px bold) and for borders of
|
|
130
|
+
controls and icons that carry meaning. Check each theme and each variant the editor can pick,
|
|
131
|
+
including text over photos.
|
|
132
|
+
- Take colour from brand tokens and section styles, never from a copied hex
|
|
133
|
+
([media-and-brand.md](media-and-brand.md)). A brand colour that fails contrast is reported
|
|
134
|
+
with the pair and ratio; never change the kit unasked.
|
|
135
|
+
- Information is never colour alone: a status dot has a word beside it; a check mark has
|
|
136
|
+
"Included" beside it.
|
|
137
|
+
- Respect reduced motion: scroll stories stack, parallax goes still, Lottie shows its fallback.
|
|
138
|
+
- Carousels, marquees and auto-advancing tabs need a pause control and stop when focused.
|
|
139
|
+
|
|
140
|
+
## Check list before done
|
|
141
|
+
|
|
142
|
+
Run `list_seo_issues` first and fix every `a11y.` code (rows 1, 3, 4 and 5 for hosted pages).
|
|
143
|
+
Then run these on the rendered pages (desktop and a 390 px mobile width), not on the stored data.
|
|
144
|
+
Cover the home page, one page per template, one entry per collection, and every form page.
|
|
145
|
+
|
|
146
|
+
| # | Check | How |
|
|
147
|
+
|---|---|---|
|
|
148
|
+
| 1 | Every informative image has alt; every empty alt is intentional | read each image's `altText` in the page output; list empties |
|
|
149
|
+
| 2 | No alt is a file name, "image of" or "logo" | scan the same list |
|
|
150
|
+
| 3 | Video and audio: transcript on the asset, captions reported | `get_media`, then the player |
|
|
151
|
+
| 4 | One H1, no skipped heading levels | outline the headings in order |
|
|
152
|
+
| 5 | Link text is meaningful out of context | list all links; fix vague ones |
|
|
153
|
+
| 6 | Icon-only controls have a name | inspect each; draft and flag |
|
|
154
|
+
| 7 | Every form field has a visible label, required is stated in text, consent is unticked | `get_form`, then the page |
|
|
155
|
+
| 8 | A refused submission names the field and the fix | send one bad test submission |
|
|
156
|
+
| 9 | Contrast meets 4.5:1 and 3:1 in every theme | measure real colour pairs |
|
|
157
|
+
| 10 | Whole page works by keyboard: tab order, visible focus, menu, dialog, accordion, tabs | tab through it |
|
|
158
|
+
| 12 | Motion stops or stills under reduced motion | emulate the preference |
|
|
159
|
+
| 13 | Page has a title and a language | `list_seo_issues` for title; check `locale` |
|
|
160
|
+
| 14 | Embeds have a title; moving content can pause | inspect each |
|
|
161
|
+
|
|
162
|
+
## What to report
|
|
163
|
+
|
|
164
|
+
Report accessibility as its own short block in the final report:
|
|
165
|
+
|
|
166
|
+
- Checked: the pages and the rows above you ran.
|
|
167
|
+
- Written: drafted alt (`alt-written`), labels and transcripts. Left empty on purpose: decorative
|
|
168
|
+
images, and each asset marked `decorative`.
|
|
169
|
+
- Open: `alt-missing`, captions missing, contrast failures with the measured ratio, controls you
|
|
170
|
+
could not test (a third-party embed, a payment step).
|
|
171
|
+
- Not claimed: conformance. No tool certifies it; the audit covers stored blocks only.
|