Skip to content

Accessibility

Governs the accessibility targets every other foundation must meet, and the gate nothing enters foundations/ or patterns/ without passing.

Status
Approved
Status note
Canonical. The gate every other foundation must pass, targeting WCAG 2.2 Level AA; two items are acknowledged and intentionally excluded, both limitations of the toolchain rather than of the targets.
Version
3
Updated
2026-08-26
Approved by
Fernando Kylas
Approved
2026-08-26
Supersedes
Nothing.
Open items
2 open, 2 resolved, of 4 recorded
Canonical source
foundations/accessibility.md

The gate every other foundation must pass. Nothing enters foundations/ or patterns/ without meeting these targets.

What is approved

Fernando Kylas approved Accessibility on 2026-08-26. The approval covers the conformance target and every threshold this chapter states: WCAG 2.2 Level AA, the contrast minimums, the focus indicator, keyboard operability, the 24 by 24 target minimum, the text-spacing and 200% resize targets, the motion rules, and the documents limitation.

Two items are acknowledged and intentionally excluded, and both are limits of the toolchain rather than of the targets:

A threshold does not move because a standard does. This targets WCAG 2.2, not "the current WCAG". Adopting a later version is a superseding decision.

Conformance target

WCAG 2.2, Level AA. Locked by Fernando on 2026-08-26 (A11Y-04, DECISIONS.md).

It confirms what the chapter was already written to rather than choosing something new. Every criterion cited below is a 2.2 AA criterion, and 2.5.8 Target Size (Minimum) exists only in 2.2, so the chapter could not have been describing 2.1. The lock removes an assumption, not a possibility.

AA rather than AAA, and the reason is a value you have already approved. AAA requires 7:1 for body text. The paper tone #F6F4F1 with primary ink measures 18.03:1 and clears it, but text-secondary at 8.07:1 and text-tertiary at 5.64:1 do not, so AAA would retire two of the three reading tiers and with them the editorial grey the system is built on. AA is the target the palette was designed against.

A version, not a moving target. This is WCAG 2.2, not "the current WCAG". When 3.0 arrives it does not silently become the standard here: adopting it would be a superseding decision, because a threshold that changes without anyone deciding is the failure this lock exists to prevent.

Colour

Complete and measured. This section and the focus indicator below are what other chapters cite as the gate.

ElementMinimum
Body text (below 24px, or below 18.66px bold)4.5:1
Large text (24px and above, or 18.66px bold and above)3:1
UI components and graphical objects, including a meaning-bearing rule3:1
Focus indicator, against adjacent colours3:1
Data marks, against the ground and against each other3:1
Decorative surface or rulenone, but never the sole carrier of anything
Disabled controlexempt

Colour is never the sole carrier of meaning. This is brand-principles.md §3.3; the thresholds it must clear are below. Anything communicated by colour must also be carried by text, shape, or position. The Report Engine's four channels exist for this reason: severity as a square, state as a circle, confidence as dots, coverage as a bar.

All approved pairs, with measured ratios for every ground in the system, are recorded in the contrast matrix in colour.md §7.2. colour.md is authoritative for colour values; this file is authoritative for the targets they must meet.

Focus indicator: decided 2026-07-25

GroundRing valueRatio
Light paper #F6F4F1#0A0A0A18.03:1
Raised card #FCFCFB#0A0A0A19.29:1
Green wash #EBF0E9#0A0A0A17.13:1
Dark ink #090909#FAFAF719.04:1
Dark raised #2A2A2A#FAFAF713.73:1

2 px ring at 2 px offset. One ink ring is legal on every light surface in the system, so no per-surface exception is needed. Token: focus-ring.

Green is not a focus colour. It measures 2.65:1 against paper, below the 3:1 minimum.

The previous --shadow-focus token is Superseded. It composited to roughly 1.1:1 and was not a focus indicator at all. It must not be carried into v3.1.

Never outline: none without a replacement that measures 3:1 against adjacent colours.

Increased contrast

Under prefers-contrast: more, text-secondary and text-tertiary rise to text-primary and border is promoted to border-strong. No new colours are introduced.

Known colour defects

Output issued before that date still carries the defect, and this is the honest position rather than an oversight. Fernando's decision of 2026-08-26 applies the fix to new output only; validated report PDFs already delivered are not reissued. A conformance claim is a claim about a specific document, so a report carrying the 4.38:1 pair does not become conforming because a later stylesheet does. Anything reissued from source picks the fix up automatically.

Typography

Specified 2026-08-25. Every figure below was measured against the built site or is a WCAG 2.2 AA success criterion, named where it applies.

TargetValueBasis
Minimum body size in content16pxThe system sets 17px. The floor is declared in tokens.css beside the token
Minimum line height for body copy1.5The system sets 1.647, measured 28px on 17px
Roles permitted below 16pxcaption 13px, footnote and label 12pxMetadata, captions and labels only. colour.md §4.2 forbids body copy at these sizes
Text resizable to 200%no loss of content or functionWCAG 1.4.4. Measured: root raised to 32px, scrollWidth stayed 1440 against a 1440 client, no horizontal overflow
Text spacing override toleratedline 1.5, letter 0.12em, word 0.16em, paragraph 2emWCAG 1.4.12. Measured with all four applied at once: no overflow
Reflow320px, no horizontal scrollingWCAG 1.4.10. The engine's validation record measures this per report

The root font size is never overridden. It resolves to the browser's own 16px, and 40 token declarations are in rem, so a reader who raises their default carries the whole scale with them. A pixel type scale would silently ignore that preference, which is why there is not one.

Interaction

Specified 2026-08-25.

TargetValueBasis
Visible focus indicator2px primary ink, 2px offset, on every focusable elementDecided 2026-07-25, above. Measured 18.03:1 on paper and 19.04:1 on ink, against a 3:1 requirement
Focus never removedoutline: none only inside :focus:not(:focus-visible)WCAG 2.4.7. A pointer press may hide the ring; a keyboard focus may never
Keyboard operabilityevery control reachable and operable, DOM order, no positive tabindexWCAG 2.1.1 and 2.4.3. Measured on the home page: 36 focusable elements, 0 positive tabindex
Target size24 by 24 CSS px minimum, except inline linksWCAG 2.2 AA 2.5.8, with its own inline exception

Measured, and unresolved. The theme control is 40 by 40. Fourteen targets on the home page render below 24 by 24, all of them text links between 19px and 22px tall. WCAG 2.5.8 exempts a target "in a sentence or whose size is constrained by the line height of non-target text", which covers a link inside a paragraph and plainly does not cover a standalone control. The navigation links sit between those two readings. See A11Y-01 below.

Motion

Specified 2026-08-25.

TargetValueBasis
prefers-reduced-motion: reducehonoured system-widebase.css sets animation-duration: 0.01ms and --fk-dur falls from 200ms to 1ms
Duration under the preference1ms, not 0So transitionend still fires and a product listening for it does not hang
Meaning survives the preferencethe end state is kept, only the travel is removedThe theme control's mark flips instantly rather than not at all
Flashingnothing flashes more than three times per secondWCAG 2.3.1. Nothing in the system animates at that rate; there is no video and no auto-playing content

Documents

Specified 2026-08-25, and the specification is a limitation rather than a target.

The HTML is the accessible form of every publication. The PDF is a print artefact derived from it. That is a statement of fact about the toolchain, not a preference:

PropertyStateMeasured
Tagged PDFnot producedAll four specimen PDFs carry StructTreeRoot: 0 and /Marked: 0
Reading order in the PDFnot encodedFollows from the above
Alt text in the PDFnot carriedFollows from the above
Alt text in the HTMLrequiredEvery chart and dial takes role="img" and a label
Print reading typestated in points against an accessible floorprint.css re-declares the reading roles

PDFs are produced by headless Chrome --print-to-pdf, which emits no structure tree. No accessibility claim may be made for a Fernando Kylas PDF, and a reader who needs assistive technology is served the HTML. Changing this needs a different toolchain, which is A11Y-02.

Testing

Specified 2026-08-25.

MethodCadenceStatus
Contrast matrix over every token pair, every groundOn any colour changeIn force, colour.md §7.2
Rendered-text contrast in a browserPer releaseIn force. 80 nodes measured, lowest 5.64:1 on light
Keyboard order and focus indicatorPer releaseIn force
Reflow at 320px, both themesPer releaseIn force
Forced colours and greyscalePer releaseIn force
Automated audit, axe or equivalentnot runThe validation record states this plainly

Accessibility here is checked by construction and by measurement, not by a tool. That is a real position and not an excuse: an automated pass catches categories a human misses, and no tool catches a colour that carries meaning alone. Adding one is A11Y-03.

Who signs off: Fernando, as with every other foundation. AGENTS.md §2.


Open items

A11Y-01: Does the target-size minimum apply to navigation links? · RESOLVED 2026-08-26

Fourteen targets measured below 24 by 24 CSS px, all of them text links, 19 to 22px tall.

The question was framed around the wrong exception. 2.5.8's inline exception covers a link inside a sentence and does not cover a standalone control, and a navigation row is neither, so arguing it either way could not settle anything. 2.5.8's SPACING exception settles it without an opinion: an undersized target conforms if a 24px circle centred on it does not meet another target's circle. The navigation declares gap: 12px 24px and the links measure ~20px tall, so centres sit 32px apart vertically and further horizontally, against the 24px the test requires. The navigation already conformed.

So the decision was a quality one rather than a compliance one, and the hit areas were raised anyway. Fernando's decision, 2026-08-26: inline-flex with a 24px min-height on every navigation link. The text does not move; the box grows around the label. It costs 4px of masthead height and nothing else.

Why raise a target that already conformed. Relying on an exception is reasonable for a document and poor for a control someone uses on a phone. A 24px target is easier to hit than a 20px one, and the exception remains true underneath, so the system now satisfies the criterion twice over rather than narrowly.

A11Y-02: The PDF cannot be made accessible by the current toolchain · Open

Headless Chrome emits no structure tree, so no Fernando Kylas PDF is tagged. Resolving this means a different PDF pipeline, which is a platform decision rather than a brand one, and it belongs with the engine.

A11Y-03: No automated accessibility audit runs · Open

Everything is checked by construction and by measurement. An automated pass would catch a different class of defect. Whether one is added, and where it runs, is open.

A11Y-04: The WCAG version and level are not locked · RESOLVED 2026-08-26

The conformance target read "default assumption: WCAG 2.2 AA", and every threshold in this chapter was written against 2.2 AA. Locked by Fernando on 2026-08-26, which made explicit what was assumed and changed no threshold.

It had to be settled before this chapter could be approved: it governs the gate nothing enters foundations/ or patterns/ without passing, and approving a gate whose standard is an assumption approves a standard nobody set.