@erclx/canon 5.61.0 → 5.63.0
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/CHANGELOG.md +19 -0
- package/README.md +1 -1
- package/claude/.claude-plugin/plugin.json +1 -1
- package/claude/skills/canon-cli/SKILL.md +2 -1
- package/claude/skills/create-skill/references/skill-practice.md +1 -0
- package/claude/skills/design-identity/references/card-route.md +3 -3
- package/claude/skills/design-record/references/design.md +1 -1
- package/claude/skills/design-taste/REQUIREMENT.md +2 -1
- package/claude/skills/design-taste/SKILL.md +6 -5
- package/claude/skills/design-taste/references/adopted.md +136 -8
- package/claude/skills/design-taste/references/craft.md +1 -1
- package/claude/skills/design-taste/references/kinds.md +8 -2
- package/claude/skills/design-taste/references/preflight.md +3 -3
- package/claude/skills/design-taste/references/tells.md +26 -5
- package/claude/skills/plan-feature/SKILL.md +2 -2
- package/claude/skills/plan-feature/references/plan.md +24 -3
- package/claude/skills/review-craft/SKILL.md +1 -1
- package/claude/skills/role-worker/SKILL.md +2 -1
- package/claude/skills/target-update/SKILL.md +9 -1
- package/claude/skills/ui-checklist/SKILL.md +1 -1
- package/claude/skills/ui-craft/REQUIREMENT.md +29 -0
- package/claude/skills/ui-craft/SKILL.md +44 -0
- package/{governance/rules/ui → claude/skills/ui-craft/references}/a11y.md +2 -10
- package/claude/skills/ui-craft/references/adopted.md +27 -0
- package/{governance/rules/ui/surface-capture.md → claude/skills/ui-craft/references/capture.md} +5 -15
- package/claude/skills/ui-craft/references/controls.md +18 -0
- package/claude/skills/ui-craft/references/copy.md +45 -0
- package/{governance/rules/ui → claude/skills/ui-craft/references}/forms.md +0 -9
- package/{governance/rules/ui → claude/skills/ui-craft/references}/keyboard.md +3 -16
- package/{governance/rules/ui → claude/skills/ui-craft/references}/motion.md +0 -10
- package/claude/skills/ui-craft/references/pointer.md +13 -0
- package/{governance/rules/ui/ux-completeness.md → claude/skills/ui-craft/references/states.md} +2 -20
- package/claude/skills/ux-audit/SKILL.md +1 -1
- package/claude/skills/write-human/references/adopted.md +4 -1
- package/docs/agents/install-and-sync.md +47 -13
- package/docs/index.md +1 -1
- package/docs/target/migrations.md +6 -8
- package/docs/target/sync.md +21 -1
- package/docs/workflow/ai-workflow.md +1 -1
- package/docs/workflow/index.md +3 -3
- package/docs/workflow/skill-map.md +1 -0
- package/docs/workflow/visual-design-workflow.md +58 -32
- package/governance/detect.toml +1 -37
- package/governance/ledger/lib/test-scope.md +1 -1
- package/governance/ledger/{ui → skills/ui-craft}/a11y.md +11 -9
- package/governance/ledger/{ui/surface-capture.md → skills/ui-craft/capture.md} +15 -15
- package/governance/ledger/skills/ui-craft/controls.md +31 -0
- package/governance/ledger/skills/ui-craft/copy.md +102 -0
- package/governance/ledger/{ui → skills/ui-craft}/forms.md +3 -3
- package/governance/ledger/skills/ui-craft/keyboard.md +67 -0
- package/governance/ledger/{ui → skills/ui-craft}/motion.md +3 -3
- package/governance/ledger/skills/ui-craft/pointer.md +24 -0
- package/governance/ledger/{ui/ux-completeness.md → skills/ui-craft/states.md} +14 -26
- package/governance/ledger/ui/craft.md +19 -0
- package/governance/renames.toml +17 -3
- package/governance/rules/lib/test-scope.md +1 -1
- package/governance/rules/ui/craft.md +22 -0
- package/governance/splits.toml +13 -0
- package/package.json +1 -1
- package/src/claude/cases/misc.ts +5 -0
- package/src/claude/skills-audit.ts +150 -12
- package/src/commands/claude.ts +5 -0
- package/src/commands/sync.ts +3 -1
- package/src/commands/tooling.ts +332 -10
- package/src/gate/measures.ts +4 -3
- package/src/gov/adapter.ts +53 -4
- package/src/gov/audit.ts +6 -1
- package/src/gov/splits.ts +36 -0
- package/src/inventory/subjects.ts +1 -1
- package/src/sync/check.ts +9 -1
- package/src/sync/stamp.ts +135 -11
- package/src/tooling/disposition.ts +167 -0
- package/src/tooling/inject.ts +17 -2
- package/src/tooling/package.ts +22 -13
- package/src/tooling/scan.ts +86 -7
- package/src/tooling/stamp.ts +51 -7
- package/tooling/web/reference.md +3 -1
- package/governance/ledger/ui/copy.md +0 -49
- package/governance/ledger/ui/design-taste.md +0 -19
- package/governance/ledger/ui/interface-casing.md +0 -47
- package/governance/ledger/ui/keyboard.md +0 -68
- package/governance/ledger/ui/link-behavior.md +0 -29
- package/governance/rules/ui/copy.md +0 -28
- package/governance/rules/ui/design-taste.md +0 -18
- package/governance/rules/ui/interface-casing.md +0 -29
- package/governance/rules/ui/link-behavior.md +0 -19
- /package/tooling/web/{configs → seeds}/e2e/home.spec.ts +0 -0
|
@@ -1,57 +1,83 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Visual design workflow
|
|
3
|
-
description:
|
|
3
|
+
description: How canon plans, builds, and reviews a UI, from the design reference a plan cites to the browser pass that holds a pull request open
|
|
4
4
|
category: Workflow
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Visual design workflow
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
Canon runs a UI feature through one loop. A plan cites the design, a worker builds against it and captures what it painted, and two independent reviews check the result. A project with no graphical design tool runs all of it, since the design lives in prose and in tracked frames.
|
|
10
10
|
|
|
11
|
-
##
|
|
11
|
+
## Plan
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
`canon:plan-feature` reads `canon/DESIGN.md` and `canon/design/index.md` before it places a UI change. It loads `canon:design-taste`, which decides the layer order a surface is designed in, the coherence locks that keep it consistent, and the defaults a model reaches for that the surface should reach past.
|
|
14
14
|
|
|
15
|
-
- The
|
|
15
|
+
- The plan carries a `## Design references` section naming the accepted design for each surface it changes, or `None identified.` when there is none.
|
|
16
|
+
- A design becomes a reference through `canon:design-record`, which lands an accepted pick in `canon/design/` and carries its values into `canon/DESIGN.md`.
|
|
16
17
|
|
|
17
|
-
|
|
18
|
+
## Build
|
|
18
19
|
|
|
19
|
-
|
|
20
|
-
- `canon:pick-by-eye` drafts candidates as frames on a [Frameboard](https://www.npmjs.com/package/frameboard) board and takes your pick
|
|
21
|
-
- `canon:design-record` lands a pick in `canon/design/` and carries its values into `canon/DESIGN.md`
|
|
22
|
-
- `canon:design-identity` drafts a logo mark and social card
|
|
20
|
+
The worker opens each cited reference, light and dark, before its first edit to that surface. It takes sizes, spacing, and colors from the frame HTML rather than the image, and reports a reference that does not resolve instead of building without it.
|
|
23
21
|
|
|
24
|
-
|
|
22
|
+
- The `craft` rule fires on the files the worker edits and loads `ui-craft` for behavior and `design-taste` for look.
|
|
23
|
+
- The `ui-craft` capture reference has the worker capture the full page in every theme the surface ships, against a preview server and never a dev server.
|
|
24
|
+
- It sets the widths too, being 320 plus each breakpoint in `canon/DESIGN.md` for a layout case, and one width for a state case.
|
|
25
25
|
|
|
26
|
-
##
|
|
26
|
+
## Self-check
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
Before the pull request opens, the worker runs two checks.
|
|
29
29
|
|
|
30
|
-
-
|
|
31
|
-
-
|
|
32
|
-
- Chrome DevTools MCP ([`ChromeDevTools/chrome-devtools-mcp`](https://github.com/ChromeDevTools/chrome-devtools-mcp)) for traces, network, DOM, and CSS
|
|
33
|
-
- Claude Design for codebase extraction or a polished handoff bundle
|
|
34
|
-
- A frontend design skill: [pbakaus/impeccable](https://github.com/pbakaus/impeccable), [nextlevelbuilder/ui-ux-pro-max-skill](https://github.com/nextlevelbuilder/ui-ux-pro-max-skill), or Anthropic's `frontend-design`
|
|
30
|
+
- `canon:ui-checklist` writes the boxes a reviewer reads beside the captures. Each box is one observable behavior, and a box that needs eyes carries a `(taste)` mark.
|
|
31
|
+
- `canon:pr-evidence` posts the captures and the checklist on the pull request as one comment, which the reviews read.
|
|
35
32
|
|
|
36
|
-
|
|
33
|
+
`canon drive <url> <run>` covers states a first render cannot reach. A run file walks a page through named interactions and measures each state, with three probes:
|
|
37
34
|
|
|
38
|
-
|
|
35
|
+
- `focus` reads where keyboard focus lands and whether it shows
|
|
36
|
+
- `details` reads disclosure state
|
|
37
|
+
- `axe` runs the accessibility engine
|
|
39
38
|
|
|
40
|
-
|
|
39
|
+
Run `canon drive --help` for the step kinds and the run file shape.
|
|
41
40
|
|
|
42
|
-
|
|
41
|
+
## Review
|
|
43
42
|
|
|
44
|
-
|
|
45
|
-
- Claude Design with its Claude Code handoff bundle for teams without Figma. The handoff is one-way.
|
|
46
|
-
- The Playwright and Chrome DevTools MCPs from tier 1
|
|
43
|
+
Two reviews run beside each other and finish on their own clocks.
|
|
47
44
|
|
|
48
|
-
|
|
45
|
+
- `canon:review-pr` reads the code and the stills in the evidence comment, and posts under `## Review`.
|
|
46
|
+
- `canon:review-ui` never reads the diff. It drives each checklist box in the running app through the pinned `@playwright/cli` and posts under `## UI review`.
|
|
47
|
+
- Every box gets one verdict, being pass, fail, needs eyes, or not driven.
|
|
49
48
|
|
|
50
|
-
|
|
49
|
+
After the boxes, `review-ui` sweeps every route they reached:
|
|
51
50
|
|
|
52
|
-
|
|
51
|
+
- console errors on each route
|
|
52
|
+
- sideways overflow at each width a box named
|
|
53
|
+
- the `focus`, `details`, and `axe` probes through `canon drive`
|
|
53
54
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
55
|
+
## What holds a review open
|
|
56
|
+
|
|
57
|
+
A UI review stays open while the branch owes a fix. Three things owe one:
|
|
58
|
+
|
|
59
|
+
- a failed box
|
|
60
|
+
- a sweep finding, being a console error, an overflow, or an axe violation of a gated class
|
|
61
|
+
- a box the page kept the pass from driving
|
|
62
|
+
|
|
63
|
+
Two kinds of result report without holding the review open.
|
|
64
|
+
|
|
65
|
+
- A taste box needs eyes, so the pass captures both themes and leaves the call to you.
|
|
66
|
+
- Every other probe result, and every axe `incomplete`, is a reading to confirm, since each probe carries a known class of false finding.
|
|
67
|
+
|
|
68
|
+
At the time of writing, the gated axe classes are contrast, target size, accessible names, labels, alt text, document title and language, valid ARIA, and nested interactive controls. A rule leaves the list on its first false finding, so `canon drive --help` and the `review-ui` skill carry the current one.
|
|
69
|
+
|
|
70
|
+
A close posts as `## UI review closed`. The reviewers lift the draft mark on their close, and you merge.
|
|
71
|
+
|
|
72
|
+
## Design authoring
|
|
73
|
+
|
|
74
|
+
Most projects author design in the loop above and need nothing more. Start with `canon:pick-by-eye`, which drafts candidates as frames on a [Frameboard](https://www.npmjs.com/package/frameboard) board and takes your pick, then record the pick with `canon:design-record`. `canon:design-identity` drafts a logo mark and social card the same way.
|
|
75
|
+
|
|
76
|
+
A graphical tool earns its place when design is the product, a designer owns it, and it changes more often than code. Then the tool is the source of truth, and `canon/DESIGN.md` carries a top note naming the upstream project.
|
|
77
|
+
|
|
78
|
+
- Figma with the official [Figma Dev Mode MCP](https://www.figma.com/blog/introducing-claude-code-to-figma/), for a team already on Figma. It syncs both ways and captures a running UI into editable frames.
|
|
79
|
+
- [Claude Design](../../wiki/claude/design.md) with its Claude Code handoff bundle, for a team without Figma. The handoff is one-way.
|
|
80
|
+
|
|
81
|
+
The loop above runs unchanged on either, with the tool's export standing in for the pick.
|
|
82
|
+
|
|
83
|
+
For the skills by moment, see the [skill map](skill-map.md).
|
package/governance/detect.toml
CHANGED
|
@@ -160,46 +160,10 @@ deps = [
|
|
|
160
160
|
]
|
|
161
161
|
files = ["**/migrations", "**/schema.prisma", "**/*.sql"]
|
|
162
162
|
|
|
163
|
-
["
|
|
164
|
-
deps = ["react", "vue", "svelte", "astro", "next", "solid-js", "preact"]
|
|
165
|
-
files = ["index.html", "*/index.html"]
|
|
166
|
-
|
|
167
|
-
["a11y"]
|
|
168
|
-
deps = ["react", "vue", "svelte", "astro", "next", "solid-js", "preact"]
|
|
169
|
-
files = ["index.html", "*/index.html"]
|
|
170
|
-
|
|
171
|
-
["keyboard"]
|
|
172
|
-
deps = ["react", "vue", "svelte", "astro", "next", "solid-js", "preact"]
|
|
173
|
-
files = ["index.html", "*/index.html"]
|
|
174
|
-
|
|
175
|
-
["forms"]
|
|
176
|
-
deps = ["react", "vue", "svelte", "astro", "next", "solid-js", "preact"]
|
|
177
|
-
files = ["index.html", "*/index.html"]
|
|
178
|
-
|
|
179
|
-
["ux-completeness"]
|
|
180
|
-
deps = ["react", "vue", "svelte", "astro", "next", "solid-js", "preact"]
|
|
181
|
-
files = ["index.html", "*/index.html"]
|
|
182
|
-
|
|
183
|
-
["surface-capture"]
|
|
184
|
-
deps = ["react", "vue", "svelte", "astro", "next", "solid-js", "preact"]
|
|
185
|
-
files = ["index.html", "*/index.html"]
|
|
186
|
-
|
|
187
|
-
["link-behavior"]
|
|
188
|
-
deps = ["react", "vue", "svelte", "astro", "next", "solid-js", "preact"]
|
|
189
|
-
files = ["index.html", "*/index.html"]
|
|
190
|
-
|
|
191
|
-
["design-taste"]
|
|
163
|
+
["craft"]
|
|
192
164
|
deps = ["react", "vue", "svelte", "astro", "next", "solid-js", "preact"]
|
|
193
165
|
files = ["canon/DESIGN.md", "index.html", "*/index.html"]
|
|
194
166
|
|
|
195
|
-
["interface-casing"]
|
|
196
|
-
deps = ["react", "vue", "svelte", "astro", "next", "solid-js", "preact"]
|
|
197
|
-
files = ["index.html", "*/index.html"]
|
|
198
|
-
|
|
199
|
-
["motion"]
|
|
200
|
-
deps = ["react", "vue", "svelte", "astro", "next", "solid-js", "preact"]
|
|
201
|
-
files = ["index.html", "*/index.html"]
|
|
202
|
-
|
|
203
167
|
["design-reference"]
|
|
204
168
|
deps = []
|
|
205
169
|
files = ["canon/design/*/"]
|
|
@@ -25,7 +25,7 @@ The field is browser test automation, and the authority is the Playwright docume
|
|
|
25
25
|
| ---------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
|
|
26
26
|
| A script, not the suite | House choice: a suite run answers a question about the page only through assertions written for another question, and costs the whole run | 2026-10-18 |
|
|
27
27
|
| No `fullyParallel` | [Parallelism](https://playwright.dev/docs/test-parallel): by default "Tests in a single file are run in order, in the same worker process", and parallel tests "cannot share any state or global variables" | 2026-10-18 |
|
|
28
|
-
| Pointer to `
|
|
28
|
+
| Pointer to `ui-craft` | House choice: a pointer to the skill that owns capture scope, claiming no practice of its own | 2026-10-18 |
|
|
29
29
|
| Pointer to `e2e-reliability` | House choice: a pointer to the rule that owns waits and guards, claiming no practice of its own | 2026-10-18 |
|
|
30
30
|
|
|
31
31
|
## Declined
|
|
@@ -1,20 +1,21 @@
|
|
|
1
1
|
---
|
|
2
|
-
title: Accessibility
|
|
3
|
-
description: Sources for
|
|
2
|
+
title: Accessibility reference ledger
|
|
3
|
+
description: Sources for claude/skills/ui-craft/references/a11y.md, one row per bullet
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Accessibility
|
|
6
|
+
# Accessibility reference ledger
|
|
7
7
|
|
|
8
8
|
The field is web accessibility, and the authority is the W3C, through WCAG 2.2 and its Understanding documents, the WAI tutorials, and the ARIA notes. The keyboard and focus half of the old rule moved to `keyboard.md`, whose ledger records those bullets.
|
|
9
9
|
|
|
10
10
|
## Semantics
|
|
11
11
|
|
|
12
|
-
| Bullet | Source
|
|
13
|
-
| ----------------------------------------- |
|
|
14
|
-
| Native `<button>` or `<a>` over a `<div>` | [Using ARIA, first rule](https://www.w3.org/TR/using-aria/): "If you can use a native HTML element or attribute with the semantics and behavior you require already built in", use it "instead of re-purposing an element and adding an ARIA role"
|
|
15
|
-
| Attribute spelling per syntax | [React common components](https://react.dev/reference/react-dom/components/common): the DOM prop is `tabIndex`, "A number. Overrides the default Tab button behavior", where HTML spells it `tabindex`
|
|
16
|
-
| Role and synchronized state | [Understanding Name, Role, Value](https://www.w3.org/WAI/WCAG22/Understanding/name-role-value.html): "the name and role can be programmatically determined" and "notification of changes to these items is available to user agents"
|
|
17
|
-
| Name for a control with no visible text | [Understanding Name, Role, Value](https://www.w3.org/WAI/WCAG22/Understanding/name-role-value.html): every user interface component's "name and role can be programmatically determined"
|
|
12
|
+
| Bullet | Source | Read |
|
|
13
|
+
| ----------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------- |
|
|
14
|
+
| Native `<button>` or `<a>` over a `<div>` | [Using ARIA, first rule](https://www.w3.org/TR/using-aria/): "If you can use a native HTML element or attribute with the semantics and behavior you require already built in", use it "instead of re-purposing an element and adding an ARIA role" | 2026-10-18 |
|
|
15
|
+
| Attribute spelling per syntax | [React common components](https://react.dev/reference/react-dom/components/common): the DOM prop is `tabIndex`, "A number. Overrides the default Tab button behavior", where HTML spells it `tabindex` | 2026-10-18, React 19 |
|
|
16
|
+
| Role and synchronized state | [Understanding Name, Role, Value](https://www.w3.org/WAI/WCAG22/Understanding/name-role-value.html): "the name and role can be programmatically determined" and "notification of changes to these items is available to user agents" | 2026-10-18, WCAG 2.2 |
|
|
17
|
+
| Name for a control with no visible text | [Understanding Name, Role, Value](https://www.w3.org/WAI/WCAG22/Understanding/name-role-value.html): every user interface component's "name and role can be programmatically determined" | 2026-10-18, WCAG 2.2 |
|
|
18
|
+
| Name contains the visible label | [Understanding Label in Name](https://www.w3.org/WAI/WCAG22/Understanding/label-in-name.html): "the name contains the text that is presented visually", and the start position is "A best practice". "People who operate with voice interaction use the visible labels in their commands" | 2026-10-23, WCAG 2.2 |
|
|
18
19
|
|
|
19
20
|
## Text alternatives
|
|
20
21
|
|
|
@@ -28,6 +29,7 @@ The field is web accessibility, and the authority is the W3C, through WCAG 2.2 a
|
|
|
28
29
|
| Bullet | Source | Read |
|
|
29
30
|
| ------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------- |
|
|
30
31
|
| 3:1 for boundaries and graphics | [Understanding Non-text Contrast](https://www.w3.org/WAI/WCAG22/Understanding/non-text-contrast.html): "Ensure meaningful visual cues achieve 3:1 against the background" | 2026-10-18, WCAG 2.2 |
|
|
32
|
+
| 4.5:1 for text | [Understanding Contrast (Minimum)](https://www.w3.org/WAI/WCAG22/Understanding/contrast-minimum.html): "The visual presentation of text and images of text has a contrast ratio of at least 4.5:1", with "Large-scale text" at 3:1 | 2026-10-23, WCAG 2.2 |
|
|
31
33
|
| Color never the only carrier | [Understanding Use of Color](https://www.w3.org/WAI/WCAG22/Understanding/use-of-color.html): "Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element" | 2026-10-18, WCAG 2.2 |
|
|
32
34
|
|
|
33
35
|
## Reflow
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
---
|
|
2
|
-
title: Surface capture
|
|
3
|
-
description: Sources for
|
|
2
|
+
title: Surface capture reference ledger
|
|
3
|
+
description: Sources for claude/skills/ui-craft/references/capture.md, one row per bullet
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Surface capture
|
|
6
|
+
# Surface capture reference ledger
|
|
7
7
|
|
|
8
8
|
The rule states canon's own evidence procedure for a rendered change, so most rows are house choices naming the bug the bullet prevents. The 320 floor rests on WCAG 2.2, and each explanation the old rule carried moved into a row here.
|
|
9
9
|
|
|
@@ -16,21 +16,21 @@ The rule states canon's own evidence procedure for a rendered change, so most ro
|
|
|
16
16
|
|
|
17
17
|
## When to capture
|
|
18
18
|
|
|
19
|
-
| Bullet
|
|
20
|
-
|
|
|
21
|
-
| Preview, not dev server
|
|
22
|
-
| Every theme, and again
|
|
19
|
+
| Bullet | Source | Read |
|
|
20
|
+
| ---------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
|
|
21
|
+
| Preview, not dev server | House choice: a dev server injects overlays and skips the production build's transforms, so its frame differs from what ships | 2026-10-18 |
|
|
22
|
+
| Every theme, and again | House choice: a defect in the dark theme passes a light-only capture, and a repair inside a shared stylesheet can cancel a rule written earlier in the same file | 2026-10-18 |
|
|
23
|
+
| Read the capture before the pull request | House choice: a defect visible in the worker's own capture, such as a 20px target under the 24px bullet in `pointer.md`, reached review because nobody read the frame against the checklist first, and each review round re-runs both reviews. The skill ships with the plugin, so the bullet carries a report-if-missing clause | 2026-10-23 |
|
|
23
24
|
|
|
24
25
|
## What a capture covers
|
|
25
26
|
|
|
26
|
-
| Bullet
|
|
27
|
-
|
|
|
28
|
-
| Full page
|
|
29
|
-
| 320 plus breakpoints
|
|
30
|
-
| Chrome at both clamps
|
|
31
|
-
| State case at one width
|
|
32
|
-
|
|
|
33
|
-
| Case lives with the surface | House choice: a surface with no case ships uncaptured, and a case left after its surface goes fails every later capture run | 2026-10-18 |
|
|
27
|
+
| Bullet | Source | Read |
|
|
28
|
+
| ------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------- |
|
|
29
|
+
| Full page | House choice: a component captured alone shows none of the spacing, overflow, or stacking its page imposes on it | 2026-10-18 |
|
|
30
|
+
| 320 plus breakpoints | [Understanding Reflow](https://www.w3.org/WAI/WCAG22/Understanding/reflow.html): the criterion tests "a width equivalent to 320 CSS pixels". A 320 frame proves a frame was taken there, never that the page reflows, which `a11y.md` states. | 2026-10-18, WCAG 2.2 |
|
|
31
|
+
| Chrome at both clamps | House choice: a sidebar widened to its clamp leaves the content under the floor at a window width the criterion passes, and a frame where the chrome turned into an overlay shows none of the width it takes | 2026-10-18 |
|
|
32
|
+
| State case at one width, driven | House choice: a case driving a menu open tests the state, and repeating it at every layout width multiplies the evidence with no layout to compare, and an initial render reports nothing about a menu that opens, an answer that is chosen, or a rail that tracks scrolling | 2026-10-18 |
|
|
33
|
+
| Case lives with the surface | House choice: a surface with no case ships uncaptured, and a case left after its surface goes fails every later capture run | 2026-10-18 |
|
|
34
34
|
|
|
35
35
|
## Sharing a capture
|
|
36
36
|
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: UX controls reference ledger
|
|
3
|
+
description: Sources for claude/skills/ui-craft/references/controls.md, one row per bullet
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# UX controls reference ledger
|
|
7
|
+
|
|
8
|
+
The field is interaction design, and the authorities are the Nielsen Norman Group, WCAG 2.2, Primer, Cloudscape, MDN, and web.dev. These bullets were split from `ux-completeness.md`.
|
|
9
|
+
|
|
10
|
+
## Destructive actions
|
|
11
|
+
|
|
12
|
+
| Bullet | Source | Read |
|
|
13
|
+
| ----------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
|
|
14
|
+
| Confirm unless undoable | [Confirmation dialogs](https://www.nngroup.com/articles/confirmation-dialog/): "consider a confirmation dialog before actions that cannot be undone", and "do try your best to offer undo" | 2026-10-18 |
|
|
15
|
+
| Cancelled edit restores, never discards unasked | [Primer, Edit pattern](https://primer.style/product/scenario-patterns/edit): "Put the content back to the value it had before the edit when someone cancels", and "Confirm before discarding an edit someone has put work into". The anti-pattern is to "Discard a half-written edit because someone pressed Escape or clicked outside the editor" | 2026-10-23 |
|
|
16
|
+
|
|
17
|
+
## Element states
|
|
18
|
+
|
|
19
|
+
| Bullet | Source | Read |
|
|
20
|
+
| ----------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
|
|
21
|
+
| Distinct interaction states | [Visibility of system status](https://www.nngroup.com/articles/visibility-system-status/): "Did the system actually catch that button press", and an element with no pressed or hover response leaves the person unable to tell | 2026-10-18 |
|
|
22
|
+
| Say why a control is disabled | [Cloudscape, Disabled and read-only states](https://cloudscape.design/patterns/general/disabled-and-read-only-states/): "Use disabled reasons where adequate context is not provided through disabled button or label text", and `aria-disabled="true"` is used "so that it will remain focusable" | 2026-10-23 |
|
|
23
|
+
| Declare `color-scheme` | [MDN, color-scheme](https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/color-scheme): the user agent adapts "The default colors of scrollbars and other interaction UI" and "The default colors of form controls", and the page opts in by declaring it on the `:root` element | 2026-10-23 |
|
|
24
|
+
| No intermediate flash | [Cumulative Layout Shift](https://web.dev/articles/cls): "Unexpected layout shifts can disrupt the user experience", caused by content "dynamically added to the page before existing content" | 2026-10-18 |
|
|
25
|
+
|
|
26
|
+
## Hover and focus effects
|
|
27
|
+
|
|
28
|
+
| Bullet | Source | Read |
|
|
29
|
+
| -------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------- |
|
|
30
|
+
| Hover and focus content | [Understanding Content on Hover or Focus](https://www.w3.org/WAI/WCAG22/Understanding/content-on-hover-or-focus.html): additional content is "Dismissible" without moving hover or focus, "Hoverable" so the pointer can move over it, and "Persistent" until "the hover or focus trigger is removed, the user dismisses it, or its information is no longer valid" | 2026-10-23, WCAG 2.2 |
|
|
31
|
+
| No change of context on focus or input | [Understanding On Focus](https://www.w3.org/WAI/WCAG22/Understanding/on-focus.html): "When any user interface component receives focus, it does not initiate a change of context". [Understanding On Input](https://www.w3.org/WAI/WCAG22/Understanding/on-input.html): changing a setting does not cause one "unless the user has been advised of the behavior before using the component" | 2026-10-23, WCAG 2.2 |
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: UI copy reference ledger
|
|
3
|
+
description: Sources for claude/skills/ui-craft/references/copy.md, one row per bullet
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# UI copy reference ledger
|
|
7
|
+
|
|
8
|
+
The reference joins three rules, and its sections keep their order, so each source below covers a run of them.
|
|
9
|
+
|
|
10
|
+
Content design governs the first four sections, where the authority for researched interface copy is the GOV.UK Design System and its style guide.
|
|
11
|
+
|
|
12
|
+
The four casing sections rest on the GOV.UK style guide, which sets sentence case for every heading and title, and canon set the label count and the scope bullets itself. The two link sections are interaction design, sourced from the Nielsen Norman Group's research on new windows and tabs.
|
|
13
|
+
|
|
14
|
+
## Punctuation
|
|
15
|
+
|
|
16
|
+
| Bullet | Source | Read |
|
|
17
|
+
| ----------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
|
|
18
|
+
| No em dash or semicolon | House choice: both read as generated copy in an interface, and a comma, a period, or a split sentence carries the same meaning in a shorter line | 2026-10-18 |
|
|
19
|
+
| No trailing label punctuation | [Button](https://design-system.service.gov.uk/components/button/): every example label, such as "Start now", "Sign in", and "Continue", carries no trailing punctuation | 2026-10-18 |
|
|
20
|
+
|
|
21
|
+
## Button copy
|
|
22
|
+
|
|
23
|
+
| Bullet | Source | Read |
|
|
24
|
+
| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | ---------- |
|
|
25
|
+
| The action's verb | [Button](https://design-system.service.gov.uk/components/button/): "Write button text in sentence case, describing the action it performs" | 2026-10-18 |
|
|
26
|
+
|
|
27
|
+
## Error messages
|
|
28
|
+
|
|
29
|
+
| Bullet | Source | Read |
|
|
30
|
+
| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
|
|
31
|
+
| Say how to fix it | [Error message](https://design-system.service.gov.uk/components/error-message/): "Describe what has happened and tell them how to fix it", and "'Enter your first name' is clearer, more direct and natural than 'First name must have an entry'" | 2026-10-18 |
|
|
32
|
+
| Short and plain | [Error message](https://design-system.service.gov.uk/components/error-message/): "The message must be in plain English, use positive language and get to the point", with no "technical jargon like 'form post error'" | 2026-10-18 |
|
|
33
|
+
|
|
34
|
+
## Placeholder text
|
|
35
|
+
|
|
36
|
+
| Bullet | Source | Read |
|
|
37
|
+
| ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------- |
|
|
38
|
+
| No placeholder, a hint instead | [Text input](https://design-system.service.gov.uk/components/text-input/): "Do not use placeholder text in place of a label, or for hints or examples", since "it vanishes when the user starts typing" and "not all screen readers read it out" | 2026-10-18 |
|
|
39
|
+
|
|
40
|
+
## Sentence case
|
|
41
|
+
|
|
42
|
+
| Bullet | Source | Read |
|
|
43
|
+
| ------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
|
|
44
|
+
| Sentence case | [A to Z of GOV.UK style](https://www.gov.uk/guidance/style-guide/a-to-z-of-gov-uk-style): "Always use sentence case, even in page titles and service names" | 2026-10-18 |
|
|
45
|
+
| Proper nouns keep casing | [A to Z of GOV.UK style](https://www.gov.uk/guidance/style-guide/a-to-z-of-gov-uk-style): "The exceptions to this are proper nouns" | 2026-10-18 |
|
|
46
|
+
|
|
47
|
+
## Uppercase labels
|
|
48
|
+
|
|
49
|
+
| Bullet | Source | Read |
|
|
50
|
+
| ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------- |
|
|
51
|
+
| Label count | House choice: an uppercase eyebrow over every section is the template tell `design-taste` reaches past, and the count makes the cap checkable against a page | 2026-10-18 |
|
|
52
|
+
|
|
53
|
+
## Where it applies
|
|
54
|
+
|
|
55
|
+
| Bullet | Source | Read |
|
|
56
|
+
| ---------------------- | ---------------------------------------------------------------------------------------------------------------- | ---------- |
|
|
57
|
+
| Copy outside the globs | House choice: a locale file holds the same rendered strings, so title case there ships with no rule firing on it | 2026-10-18 |
|
|
58
|
+
|
|
59
|
+
## Overriding
|
|
60
|
+
|
|
61
|
+
| Bullet | Source | Read |
|
|
62
|
+
| ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
|
|
63
|
+
| Depart where needed | House choice: an acronym or brand mark lowered to sentence case misnames it, the same reason GOV.UK keeps "proper nouns" as its one exception | 2026-10-18 |
|
|
64
|
+
|
|
65
|
+
## Default target
|
|
66
|
+
|
|
67
|
+
| Bullet | Source | Read |
|
|
68
|
+
| --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------- |
|
|
69
|
+
| Same tab, new tab by task | [Opening links in new browser windows and tabs](https://www.nngroup.com/articles/new-browser-windows-and-tabs/): "There is generally one good reason to open a page in a new window, and that is that the user will need to refer to that content in order to complete a task in another window" | 2026-10-18 |
|
|
70
|
+
| No blanket external new tab | [Opening links in new browser windows and tabs](https://www.nngroup.com/articles/new-browser-windows-and-tabs/): "New windows or tabs prevent the use of the Back button" and "can cause disorientation" | 2026-10-18 |
|
|
71
|
+
|
|
72
|
+
## mailto: links
|
|
73
|
+
|
|
74
|
+
| Bullet | Source | Read |
|
|
75
|
+
| ------------------ | -------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
|
|
76
|
+
| `mailto:` same tab | House choice: the link opens the mail client and leaves the page in place, so `target="_blank"` only adds an empty tab the person must close | 2026-10-18 |
|
|
77
|
+
|
|
78
|
+
## Declined
|
|
79
|
+
|
|
80
|
+
Every bullet the rewrite removed or reshaped, grouped by why.
|
|
81
|
+
|
|
82
|
+
### Contradicted by the source
|
|
83
|
+
|
|
84
|
+
- Replaced "show format examples over instructions in placeholder text" with the hint text bullet, since GOV.UK says not to use a placeholder "for hints or examples".
|
|
85
|
+
- Cut "reserve instructions for labels or helper text", which the new placeholder bullet now carries.
|
|
86
|
+
|
|
87
|
+
### Merged or reworded
|
|
88
|
+
|
|
89
|
+
- Merged the imperative verb and padded phrasing bullets. The `Save` over `Save changes` example went, since GOV.UK adds words "to better describe the action".
|
|
90
|
+
- Merged "keep messages short and actionable" and "one sentence maximum" into the plain language bullet.
|
|
91
|
+
- Reworded the error example to `Enter an email address`, the instruction form GOV.UK prefers over a description.
|
|
92
|
+
- Folded "treat title case on every heading as a template tell" into the sentence case bullet as its reason.
|
|
93
|
+
- Shortened the uppercase label bullet under 200 characters, keeping the `ceil(sections / 3)` count and the delete remedy.
|
|
94
|
+
- Reworded the scope bullet from a statement of what the rule covers to the directive a session can act on.
|
|
95
|
+
|
|
96
|
+
### Cut without a check
|
|
97
|
+
|
|
98
|
+
- Cut "treat the count as a judgment, since a glob cannot check it", which tells a session nothing it can verify against a line.
|
|
99
|
+
|
|
100
|
+
### Rewritten to what the source says
|
|
101
|
+
|
|
102
|
+
- Reworded the new tab exception from "a destination that would discard in-progress work" to a page the person must consult while finishing a task, the one reason NN/g names.
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
---
|
|
2
|
-
title: Forms
|
|
3
|
-
description: Sources for
|
|
2
|
+
title: Forms reference ledger
|
|
3
|
+
description: Sources for claude/skills/ui-craft/references/forms.md, one row per bullet
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Forms
|
|
6
|
+
# Forms reference ledger
|
|
7
7
|
|
|
8
8
|
The field is form design inside interaction design, and the authority for researched form patterns is the GOV.UK Design System, with WCAG 2.2 for the two authentication criteria. NN/g was read beside it and disagrees on validation timing, recorded under `## Declined`.
|
|
9
9
|
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Keyboard reference ledger
|
|
3
|
+
description: Sources for claude/skills/ui-craft/references/keyboard.md, one row per bullet
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Keyboard reference ledger
|
|
7
|
+
|
|
8
|
+
The field is web accessibility, and the authorities are the W3C, through WCAG 2.2 and the ARIA Authoring Practices Guide, MDN for CSS behavior, and the platform guidelines from Apple and Android for native targets. Every bullet here was split from `a11y.md`.
|
|
9
|
+
|
|
10
|
+
## Focus styles
|
|
11
|
+
|
|
12
|
+
| Bullet | Source | Read |
|
|
13
|
+
| ---------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------- |
|
|
14
|
+
| One project focus ring | House choice: per-component focus styles drift apart, and `canon inventory` reports the ring by computed style, so a one-off treatment shows as its own row | 2026-10-18 |
|
|
15
|
+
| No outline removal without a replacement | [outline](https://developer.mozilla.org/en-US/docs/Web/CSS/outline): "Assigning outline a value of 0 or none will remove the browser's default focus style. If an element can be interacted with it must have a visible focus indicator." | 2026-10-18 |
|
|
16
|
+
| 3:1 ring in every theme | [Understanding Non-text Contrast](https://www.w3.org/WAI/WCAG22/Understanding/non-text-contrast.html): visual information needed to identify a state needs "a contrast ratio of at least 3:1 against adjacent color(s)" | 2026-10-18, WCAG 2.2 |
|
|
17
|
+
| Ring kept whole | [CSS UI 4](https://www.w3.org/TR/css-ui-4/): "By default, the outline is drawn starting just outside the border edge", and negative `outline-offset` values "must cause the outline to shrink into the border box". [MDN overflow](https://developer.mozilla.org/en-US/docs/Web/CSS/overflow): with `hidden`, "Overflow content is clipped at the element's padding box". [Understanding Focus Appearance](https://www.w3.org/WAI/WCAG22/Understanding/focus-appearance.html), Level AAA, asks for an indicator "at least as large as the area of a 2 CSS pixel thick perimeter". A partial clip passes AA, so the bullet rests on the project's own ring rule | 2026-10-23 |
|
|
18
|
+
|
|
19
|
+
## Keyboard operation
|
|
20
|
+
|
|
21
|
+
| Bullet | Source | Read |
|
|
22
|
+
| -------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------- |
|
|
23
|
+
| Escape closes | [Dialog (modal) pattern](https://www.w3.org/WAI/ARIA/apg/patterns/dialog-modal/): "Escape : Closes the dialog", and the [combobox pattern](https://www.w3.org/WAI/ARIA/apg/patterns/combobox/) gives Escape the same job for a popup | 2026-10-18, APG |
|
|
24
|
+
| No bare character shortcut | [Understanding Character Key Shortcuts](https://www.w3.org/WAI/WCAG22/Understanding/character-key-shortcuts.html): a character-only shortcut needs a way to "Turn off", to "Remap", or to be "Active only on focus" | 2026-10-18, WCAG 2.2 |
|
|
25
|
+
| No keyboard trap | [Understanding No Keyboard Trap](https://www.w3.org/WAI/WCAG22/Understanding/no-keyboard-trap.html): "If keyboard focus can be moved to a component of the page using a keyboard interface, then focus can be moved away from that component using only a keyboard interface" | 2026-10-23, WCAG 2.2 |
|
|
26
|
+
|
|
27
|
+
## Composite widgets
|
|
28
|
+
|
|
29
|
+
| Bullet | Source | Read |
|
|
30
|
+
| --------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------- |
|
|
31
|
+
| One item in the tab sequence | [Developing a keyboard interface](https://www.w3.org/WAI/ARIA/apg/practices/keyboard-interface/): "the tab sequence should include only one focusable element of a composite UI component", managed by "a roving tabindex" or "the aria-activedescendant property" | 2026-10-18, APG |
|
|
32
|
+
| Combobox keys | [Combobox pattern](https://www.w3.org/WAI/ARIA/apg/patterns/combobox/): "Down Arrow : If the popup is available, moves focus into the popup", Enter accepts the focused option, and "Escape : Dismisses the popup if it is visible" | 2026-10-18, APG |
|
|
33
|
+
| Spinbutton keys and the pattern pointer | [Spinbutton pattern](https://www.w3.org/WAI/ARIA/apg/patterns/spinbutton/): Up Arrow "Increases the value", Down Arrow decreases it, Home and End set the limits where they exist, and Page Up is optional, "by a larger step than Up Arrow". The pointer to other patterns rests on the [APG patterns index](https://www.w3.org/WAI/ARIA/apg/patterns/), "How to build accessibility semantics into web patterns and widgets", and a bullet per pattern is declined below | 2026-10-23, APG |
|
|
34
|
+
|
|
35
|
+
## Focus management
|
|
36
|
+
|
|
37
|
+
| Bullet | Source | Read |
|
|
38
|
+
| ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------- |
|
|
39
|
+
| Focus into a dialog and back | [Dialog (modal) pattern](https://www.w3.org/WAI/ARIA/apg/patterns/dialog-modal/): "When a dialog opens, focus moves to an element inside the dialog", and "When a dialog closes, focus returns to the element that invoked the dialog" | 2026-10-18, APG |
|
|
40
|
+
| Focus never covered | [Understanding Focus Not Obscured (Minimum)](https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-minimum.html): "the component is not entirely hidden due to author-created content" | 2026-10-18, WCAG 2.2 |
|
|
41
|
+
|
|
42
|
+
## Declined
|
|
43
|
+
|
|
44
|
+
Every bullet the split removed or reshaped, grouped by why.
|
|
45
|
+
|
|
46
|
+
### Left to axe or to a person
|
|
47
|
+
|
|
48
|
+
- Declined a bullet per APG pattern. One pointer to the pattern page costs a line, and a bullet per pattern costs context on every component edit.
|
|
49
|
+
|
|
50
|
+
### Browser defaults
|
|
51
|
+
|
|
52
|
+
- Cut the Tab, Enter, and Space bullets of the old keyboard model. A native element does each by default, and `a11y.md` already sends a session to the native element.
|
|
53
|
+
|
|
54
|
+
### Rewritten to what the source says
|
|
55
|
+
|
|
56
|
+
- Replaced "do not introduce non-standard key bindings" with the character key bullet. No reviewer can check "non-standard", and the criterion names the binding that breaks.
|
|
57
|
+
- Narrowed "move focus into any overlay, popover, or dialog on open" to a dialog. The APG moves focus into a modal dialog, and a non-modal popover such as a tooltip leaves focus on its trigger.
|
|
58
|
+
|
|
59
|
+
### Cut without a source or a bug class
|
|
60
|
+
|
|
61
|
+
- Cut "never move focus on hover", a convention Claude already follows that no cited page takes a side on.
|
|
62
|
+
|
|
63
|
+
### Merged or reworded
|
|
64
|
+
|
|
65
|
+
- Merged "arrow keys navigate within composite widgets" into the roving `tabindex` bullet, which names the arrow keys.
|
|
66
|
+
- Merged "Escape cancels in-progress edits" into the Escape bullet, and took in the inline confirmation case from the `ux-completeness.md` rewrite so the Escape behavior has one copy.
|
|
67
|
+
- Reworded the combobox bullet to the pattern's own keys, dropping "typing filters", which the APG leaves to each autocomplete behavior.
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
---
|
|
2
|
-
title: Motion
|
|
3
|
-
description: Sources for
|
|
2
|
+
title: Motion reference ledger
|
|
3
|
+
description: Sources for claude/skills/ui-craft/references/motion.md, one row per bullet
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Motion
|
|
6
|
+
# Motion reference ledger
|
|
7
7
|
|
|
8
8
|
The field is web accessibility, and the authorities are the W3C, through WCAG 2.2 and the ARIA Authoring Practices Guide, and MDN for the media feature.
|
|
9
9
|
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Pointer reference ledger
|
|
3
|
+
description: Sources for claude/skills/ui-craft/references/pointer.md, one row per bullet
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Pointer reference ledger
|
|
7
|
+
|
|
8
|
+
The field is web accessibility, and the authorities are the W3C, through WCAG 2.2 and the ARIA Authoring Practices Guide, MDN for popover behavior, and the platform guidelines from Apple and Android for native targets. These bullets were split from `keyboard.md`.
|
|
9
|
+
|
|
10
|
+
## Pointer actions
|
|
11
|
+
|
|
12
|
+
| Bullet | Source | Read |
|
|
13
|
+
| ------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------- |
|
|
14
|
+
| Drag has a single-pointer path | [Understanding Dragging Movements](https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html): "For any action that involves dragging, provide a simple pointer alternative" | 2026-10-18, WCAG 2.2 |
|
|
15
|
+
| Outside press and focus leave dismiss | [Using the Popover API](https://developer.mozilla.org/en-US/docs/Web/API/Popover_API/Using): you can hide the popover "by clicking outside it", and [the APG disclosure navigation example](https://www.w3.org/WAI/ARIA/apg/patterns/disclosure/examples/disclosure-navigation/): "Moving focus out of the navigation region also closes an open dropdown" | 2026-10-23 |
|
|
16
|
+
| Pointer action on release | [Understanding Pointer Cancellation](https://www.w3.org/WAI/WCAG22/Understanding/pointer-cancellation.html): one of "No Down-Event", "Abort or Undo", or "Up Reversal" holds for single-pointer functionality | 2026-10-23, WCAG 2.2 |
|
|
17
|
+
| Gestures have a single-pointer path | [Understanding Pointer Gestures](https://www.w3.org/WAI/WCAG22/Understanding/pointer-gestures.html): "All functionality that uses multipoint or path-based gestures for operation can be operated with a single pointer without a path-based gesture" | 2026-10-23, WCAG 2.2 |
|
|
18
|
+
|
|
19
|
+
## Pointer targets
|
|
20
|
+
|
|
21
|
+
| Bullet | Source | Read |
|
|
22
|
+
| ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------- |
|
|
23
|
+
| 24 by 24 on the web | [Understanding Target Size (Minimum)](https://www.w3.org/WAI/WCAG22/Understanding/target-size-minimum.html): "at least 24 by 24 CSS pixels", except where "a 24 CSS pixel diameter circle is centered on the bounding box of each" and "the circles do not intersect" | 2026-10-18, WCAG 2.2 |
|
|
24
|
+
| Native figures | [Apple accessibility guidelines](https://developer.apple.com/design/human-interface-guidelines/accessibility): a default "44x44 pt" control size on iOS and iPadOS, and [Android accessibility](https://developer.android.com/guide/topics/ui/accessibility/apps): "a focusable area, or touch target size , of at least 48dpx48dp" | 2026-10-18 |
|