Co oznacza to kryterium
Gdy litera, cyfra lub symbol uruchamia funkcję, trzeba zapewnić co najmniej jedną ochronę: wyłączenie skrótu, przemapowanie z dodatkowym klawiszem niedrukowalnym albo działanie wyłącznie przy fokusie właściwego komponentu. Sama instrukcja nie chroni przed przypadkowym wywołaniem. Po wyłączeniu funkcja powinna nadal mieć dostępną drogę obsługi.
To pomaga osobom sterującym głosem i osobom z ograniczoną precyzją ruchów: znaki rozpoznanej wypowiedzi lub przypadkowe naciśnięcie mogą wywołać polecenie. Przemapowanie może też ograniczyć mylenie skrótów między aplikacjami, ale kryterium nie żąda pełnego edytora skrótów. Test czytnika nie zastępuje wejścia, którego dotyczy ta bariera.
Przykłady błędów i poprawek
Globalne s przy innym przycisku
Własna „Pracownia” używa zamówienia #1042, adresu ul. Przykładowa 10 i początkowo pustej notatki. Wszystkie skutki są lokalne i syntetyczne. Materiały: Flutter/Cupertino, iPhone 17 Simulator / iOS 26.5, 2026-10-02.
- Problem
- Skrót s lub S ujawnia adres również przy fokusie Wyczyść wynik. Wyłączenie jest nieaktywne, nie ma przemapowania.
- Skutek
- Znak może niezamierzenie uruchomić inną funkcję. Pomijanie pola notatki nie chroni pozostałych kontrolek.
- Poprawka
- Udostępnij działające wyłączenie obu wielkości znaku albo inną z dwóch dróg spełnienia wymagania.
- W bad wpisane s przy fokusie notatki staje się tekstem bez aktywacji. To rzeczywiste pole, bez dyktowania.
- Tab prowadzi do „Pokaż adres”; s pokazuje adres. Space na „Wyczyść wynik” go ukrywa.
- Przy fokusie „Wyczyść wynik” ponowne s i Shift+s są odebrane, lecz ujawniają adres. Wyłączenie pozostaje niedostępne.

Notatka zawiera wcześniej wpisane s. Jest to stan przed kolejnym rzeczywistym klawiszem.

Globalny skutek przy innym komponencie z fokusem. Dowód odbioru pochodzi z obserwacji klawiszy.
Wyłączenie zachowuje standardową akcję
Good ma ten sam globalny skrót poza notatką, ale działającą kontrolę.
- Tab osiąga „Wyłącz skrót”, a Space wyłącza s i S.
- Ponowne s oraz Shift+s są odebrane bez ujawnienia adresu i bez zwiększenia licznika aktywacji.
- Shift+Tab wraca do „Pokaż adres”. Litera nadal nie działa, ale Space wykonuje funkcję.

Skrót wyłączony po rzeczywistej akcji. Sam napis nie dowodzi skuteczności; źródło potwierdza ponowne odebrane s i S.

Standardowa aktywacja pozostaje dostępna. To końcowy stan sekwencji.
Jawny reset przywraca stan początkowy z włączonym skrótem. Nie ma timeoutu samoczynnie cofającego ustawienie. Wybór wariantu i reset są narzędziami demonstracji, poza wejściem oceny.
Skrót właściwego komponentu
Control reaguje na s/S tylko przy primary focus dokładnie „Pokaż adres”. Przy notatce wpisuje tekst, a przy „Wyczyść wynik” nie ujawnia adresu. Kontrola może wyglądać podobnie do błędnego skrótu, ale ma inną granicę fokusu. Nie wystarczy fokus całego ekranu.

Brak akcji potwierdziło nowe odebrane zdarzenie. Identyczny obraz przed i po nie pozwala odróżnić braku wejścia od skutecznego ograniczenia.
We wszystkich wariantach Ctrl/Alt/Meta nie uruchamiają akcji. Odrzucenie Ctrl+s jest kontrolą handlera, a nie testem przemapowania. Space na przycisku zachowuje standardową aktywację.
Kiedy obowiązuje i gdzie są wyjątki
Znak, modyfikator i sekwencja
Liczy się wynikowy znak, nie liczba fizycznych klawiszy. Wielkie S, znak zapytania uzyskany Shiftem lub znak przez AltGr nadal wymagają oceny. Sekwencja samych znaków, np. g potem a, też jest w zakresie. Zmiana s na x lub S nie spełnia przemapowania: trzeba umożliwić dodanie klawisza niedrukowalnego.
Ctrl, Command lub Alt użyte jako klawisz polecenia mogą usunąć zależność od samych znaków. AltGr i kombinacji potrzebnej do wpisania znaku nie uznawaj automatycznie za taką ochronę. Jeśli autor od początku używa tylko kombinacji polecenia, warunek skrótu z samych znaków nie powstaje.
Fokus i dostępność mechanizmu
Skrót ograniczony fokusem ma działać w komponencie, którego dotyczy. Fokus dowolnego elementu, panelu lub okna nie wystarcza. Pisanie w polu nie jest samo w sobie skrótem polecenia; wybór pozycji listy literami przy jej fokusie jest dopuszczalnym kontekstem. Pomijanie edytorów pomaga, ale nie rozwiązuje globalnego skrótu przy innych kontrolkach.
Tab, strzałki, Escape oraz standardowa aktywacja przycisku Space/Enter nie są tu skrótami autora z liter, cyfr, interpunkcji lub symboli. Pomocnicza F99 pomija też Space, natomiast proponowana reguła ACT ma szerszy zbiór drukowalnych znaków Unicode. Jej status proposed i zakres HTML/DOM nie oznaczają uruchomionego walidatora mobilnego. Źródło wskazuje odwróconą zależność w ostatnim zdaniu Expected Results F99; ocenę oparto na wymaganiu i działaniu, bez mechanicznego powielania tego zdania.
Mechanizm musi być dostępny i skuteczny. Nieaktywny „Wyłącz skrót”, globalne odcięcie klawiatury lub utrata jedynej drogi do funkcji nie potwierdzają poprawki. G217 opisuje wyłączenie i przemapowanie jako technikę pomocniczą; nie wymaga obu.
Platformy
Interpretacja AI: 2026-10-02. Dla WWW obowiązuje WCAG 2.2; poza WWW źródło stosuje informacyjne WCAG2ICT bez zmiany wymagania. Draft nie podaje daty wydania użytej noty; nie jest to ustalenie prawne.
| Środowisko | Warunek i granica | Wykonanie źródłowe |
|---|---|---|
| WWW, także telefon | Skrót implementowany przez treść. Skróty przeglądarki ocenia się osobno. | Niewykonane. |
| Mobile | Oprogramowanie ze skrótem; wejście może pochodzić z klawiatury zewnętrznej lub innego oprogramowania. | Flutter/iOS Simulator; bez Androida. |
| Desktop | Własne skróty ze znaków. | Niewykonane. |
| Dokumenty | Skrót samego dokumentu; skrót czytnika nie staje się skrótem dokumentu. | Niewykonane. |
| Kiosk | Taki skrót w treści lub oprogramowaniu; zamknięta funkcjonalność wymaga dodatkowej oceny. | Niewykonane. |
WCAG2ICT wyłącza z definicji skrótu platformowe funkcje dostępności, w tym przytrzymanie przez co najmniej 2 s. Nie pozwala to autorowi opakować zwykłego skrótu w opóźnienie. Brak testu nie oznacza wyłączenia platformy.
Rozwiązania w technologiach
Oficjalne API sprawdzono w źródle 2026-10-02. Zachowaj dostępną drogę do tej samej funkcji i sprawdź kolizje z pisaniem oraz skrótami systemu.
Flutter
import 'package:flutter/cupertino.dart';
import 'package:flutter/services.dart';
Focus(
canRequestFocus: false,
onKeyEvent: (_, event) {
final keyboard = HardwareKeyboard.instance;
if (showNode.hasPrimaryFocus && event is KeyDownEvent &&
event.character?.toLowerCase() == 's' &&
!keyboard.isControlPressed && !keyboard.isAltPressed &&
!keyboard.isMetaPressed) {
showAddress();
return KeyEventResult.handled;
}
return KeyEventResult.ignored;
},
child: CupertinoButton(
focusNode: showNode,
onPressed: showAddress,
child: const Text('Pokaż adres'),
),
)Osadź w StatefulWidget z istniejącymi showNode i showAddress. FocusNode utwórz raz w State i zwolnij w dispose. character oznacza wynikowy znak; logical/physical key go nie potwierdzają. W pełnym ekranie pole notatki jawnie omija handler, a HardwareKeyboard tylko obserwuje, zwracając false. Flutter 3.44.9 / Dart 3.12.2: analiza, host i iOS pełnego pliku PASS; skrócony fragment nie był osobno kompilowany.
iOS / SwiftUI
import SwiftUI
struct AddressShortcuts: View {
@State private var command = true
@State private var shown = false
var body: some View {
VStack {
Toggle("Używaj Command+s", isOn: $command)
Button("Pokaż adres") { shown = true }
.keyboardShortcut("s", modifiers: command ? .command : [])
if shown { Text("Adres: ul. Przykładowa 10.") }
}
}
}Toggle umożliwia wymaganie Command. Domyślny modifier SwiftUI to command, a pusta lista świadomie go usuwa. Przypisanie skrótu do Button nie ogranicza go automatycznie do fokusu przycisku: może działać w aktywnym oknie/scenie. Sprawdź wolną kombinację i edytory. Typecheck Xcode 27.0 / SDK Simulator 27.0, arm64/iOS 17: PASS; runtime niewykonany.
Android / Compose
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
@Composable
fun ShowAddress(showAddress: () -> Unit) {
Button(onClick = showAddress) { Text("Pokaż adres") }
}Usuń niepotrzebny globalny onPreviewKeyEvent dla Key.S, zachowując Button. Jeśli skrót pozostaje, uzależnij onKeyEvent/onPreviewKeyEvent od ustawienia lub właściwego fokusu. Handler rodzica widzi zdarzenia potomków. Dokumentacja sprawdzona; fragment i Android nie były budowane ani uruchamiane.
React Native
import React from 'react';
import { Pressable, Text } from 'react-native';
export function ShowAddress({ showAddress }: { showAddress: () => void }) {
return (
<Pressable accessibilityRole="button" onPress={showAddress}>
<Text>Pokaż adres</Text>
</Pressable>
);
}Usuń listener globalnego s w warstwie, która go dodaje. TextInput.onKeyPress jest callbackiem pola; na Androidzie dokumentacja ogranicza go do klawiatury ekranowej. disableKeyboardShortcuts iOS dotyczy undo/redo oraz kontrolek kopiowania TextInput, a nie wszystkich skrótów autora. Ustawienie i fokus muszą działać także w użytym adapterze natywnym lub warstwie webowej. Dokumentacja sprawdzona; kompilacja, klawiatura i semantyka Pressable niewykonane.
Jak sprawdzić
- Zinwentaryzuj skróty autora z kodu lub wiarygodnego opisu. Uwzględnij wielkość liter, symbole, sekwencje i miejsca poza edytorem.
- Potwierdź znak, odbiór i skutek przy różnych komponentach z fokusem. Callback lub nazwa kontrolki nie wystarczy.
- Sprawdź tekst w notatce bez akcji, działanie przy właściwej kontrolce i reakcję przy innych kontrolkach.
- W wybranej drodze sprawdź rzeczywiste wyłączenie, przemapowanie lub ograniczenie fokusem. Po wyłączeniu ponów znak i zachowaj standardową akcję.
- Oddziel układ, Caps Lock, dead keys, AltGr, IME, dyktowanie i emulację klawiszy. Jeden znak s nie potwierdza tych ścieżek.
Weryfikacja i ograniczenia
Historyczne wyniki z 2026-10-02: Flutter 3.44.9 / Dart 3.12.2, iPhone 17 Simulator / iOS 26.5 (23F77), Xcode 27.0 / SDK Simulator 27.0, 402 × 874 pt i 1206 × 2622 px.
| Sprawdzenie | Wynik źródła |
|---|---|
| Analiza, host i build | PASS; 15 hostowych testów, build iOS 9,1 s. Host nie potwierdza systemowego IME. |
| XCTest | PASS, 2 testy, 0 failures, 269,025 s; bez tap i bez wywołania callbacku w natywnej próbie. |
| Wejście znaków | 18 żądań S obejmujących s/Shift+s/Ctrl+s; każde z nowym KeyDownEvent HID 458774. 15 bez Ctrl miało character s lub S. |
| Good/bad/control | Good wyłącza oba znaki i zachowuje Space; bad odtwarza FAIL; control reaguje tylko przy show. Ctrl+s odrzucono, bez testu przemapowania. |
| Sekwencja i materiały | 50 żądań, 25 snapshotów, 11 PNG i drzew; pokazano pięć PNG. AI obejrzała materiały. |
| SwiftUI | Typecheck PASS, runtime niewykonany. Początkowe błędy drivera poprawiono przed końcowym buildem. |
| FKA, fizyczny iPhone/klawiatura, VoiceOver, głos, człowiek i inne platformy | Każde osobno niewykonane. Return/Enter nie powtarzano. |
Fokus mierzy primary focus Fluttera, bez potwierdzenia FKA lub VoiceOver. Zegar XCTest i timestamp KeyEvent są różnymi źródłami; nie odejmowano ich od siebie. Nie nagrywano filmu/audio. Brak reakcji bez dowodu odbioru może oznaczać niewłaściwy stan lub wejście, a nie wyłączenie. Drzewo nie ujawnia wszystkich listenerów i IME. Oczekiwania, raporty i węzeł shortcut-observation trzeba wyłączyć z wejścia niezależnego walidatora; takiego walidatora nie uruchomiono.
Jak sprawdza Clearship
Metoda z 2026-10-07 wskazuje na Androidzie litery a, j, k, s, które zmieniają treść poza komponentem z fokusem. Pomiar kontrolny: 6/6 usterek i 2 fałszywe alarmy na 80 poprawnych ekranach, próg spełniony. To ograniczony detektor kandydatów, z ręczną oceną drogi spełnienia.
Działający przełącznik wyłączenia może nadal dać znalezisko, bo analizator nie używa go ani nie sprawdza przemapowania. Zmiana przy właściwym komponencie, nieustalony skutek lub pominięte litery wymagają dalszej oceny. Cyfry, interpunkcja, wielkie litery, sekwencje, inne komponenty z fokusem, osobna treść webowa i iOS pozostają poza metodą. Wynik bez kandydatów dotyczy tylko wykonanych liter i osiągniętych stanów.