ru-a11y-toolkit 0.1.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/LICENSE +22 -0
- package/README.md +208 -0
- package/index.js +34 -0
- package/package.json +68 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 biondohod
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
22
|
+
|
package/README.md
ADDED
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
# ru-a11y-toolkit
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/ru-a11y-toolkit)
|
|
4
|
+
[](./LICENSE)
|
|
5
|
+
|
|
6
|
+
**Toolkit** для автоматизированной проверки веб-доступности React/JS-приложений под **российские нормативы**:
|
|
7
|
+
|
|
8
|
+
- [ГОСТ Р 52872-2019](https://meganorm.ru/Data/547/54797.pdf) — требования доступности интернет-ресурсов
|
|
9
|
+
- [Постановление Правительства РФ №102](http://publication.pravo.gov.ru/document/0001202602100010?index=1) — доступность официальных сайтов для инвалидов по зрению _(вступает в силу 01.03.2026)_
|
|
10
|
+
|
|
11
|
+
> Все сообщения — на **русском языке** с указанием конкретных пунктов ГОСТ и Постановления №102.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Варианты установки
|
|
16
|
+
|
|
17
|
+
Все инструменты сразу:
|
|
18
|
+
```bash
|
|
19
|
+
npm install --save-dev ru-a11y-toolkit
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Или только нужный модуль:
|
|
23
|
+
```bash
|
|
24
|
+
npm install --save-dev ru-a11y-toolkit-eslint # только ESLint-плагин
|
|
25
|
+
npm install --save-dev ru-a11y-toolkit-cli # только CLI (скоро)
|
|
26
|
+
npm install --save-dev ru-a11y-toolkit-overlay # только React Overlay (скоро)
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## Состав пакета
|
|
32
|
+
|
|
33
|
+
| Пакет | Статус | Назначение |
|
|
34
|
+
|-------|--------|------------|
|
|
35
|
+
| [`ru-a11y-toolkit-eslint`](#-eslint-плагин) | ✅ Готов | Статическая проверка JSX/HTML в процессе разработки |
|
|
36
|
+
| [`ru-a11y-toolkit-cli`](#-cli-сканер-в-разработке) | 🚧 В разработке | Проверка готовых страниц по URL |
|
|
37
|
+
| [`ru-a11y-toolkit-overlay`](#-react-overlay-в-разработке) | 🚧 В разработке | Runtime-визуализация ошибок в браузере |
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## 📦 ESLint-плагин
|
|
42
|
+
|
|
43
|
+
### Установка
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
npm install --save-dev ru-a11y-toolkit-eslint eslint eslint-plugin-jsx-a11y
|
|
47
|
+
# или через umbrella:
|
|
48
|
+
npm install --save-dev ru-a11y-toolkit eslint eslint-plugin-jsx-a11y
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### Настройка
|
|
52
|
+
|
|
53
|
+
**`eslint.config.js`** (ESLint 9 Flat Config):
|
|
54
|
+
```js
|
|
55
|
+
const ruA11yEslint = require('ru-a11y-toolkit-eslint');
|
|
56
|
+
|
|
57
|
+
module.exports = [
|
|
58
|
+
ruA11yEslint.configs['gost-aa'],
|
|
59
|
+
];
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
**`.eslintrc.js`** (ESLint 8 Legacy):
|
|
63
|
+
```js
|
|
64
|
+
module.exports = {
|
|
65
|
+
extends: ['ru-a11y-toolkit-eslint/gost-aa'],
|
|
66
|
+
};
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Уровни конфигурации
|
|
70
|
+
|
|
71
|
+
| Конфиг | Уровень | Для кого |
|
|
72
|
+
|--------|---------|----------|
|
|
73
|
+
| `/recommended` | ГОСТ A | Все проекты — базовая доступность |
|
|
74
|
+
| `/gost-aa` | ГОСТ AA + №102 | Гос. органы, порталы под Постановление №102 |
|
|
75
|
+
| `/strict` | ГОСТ AAA | Критически важные сервисы |
|
|
76
|
+
|
|
77
|
+
### Пример вывода
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
✖ Отсутствует ссылка пропуска навигации (ГОСТ Р 52872-2019 §5.2.3.1, уровень A).
|
|
81
|
+
Добавьте <a href="#main">Перейти к содержанию</a> в начало <body>.
|
|
82
|
+
[Постановление №102 п. а)]
|
|
83
|
+
src/App.jsx:3:5 @ru-a11y/gost-a11y/require-skip-link
|
|
84
|
+
|
|
85
|
+
✖ Элемент <html> должен иметь атрибут lang (например, lang="ru").
|
|
86
|
+
[ГОСТ Р 52872-2019 §5.2.4; Постановление №102 п. а)]
|
|
87
|
+
src/index.jsx:1:1 @ru-a11y/gost-a11y/jsx-a11y/html-has-lang
|
|
88
|
+
|
|
89
|
+
⚠ Значение maximum-scale=1.0 ограничивает масштабирование ниже 200%.
|
|
90
|
+
[Постановление №102 п. б)]
|
|
91
|
+
public/index.html:7:3 @ru-a11y/gost-a11y/zoom-200-warning
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### Что проверяет
|
|
95
|
+
|
|
96
|
+
**7 кастомных правил** (специфика РФ):
|
|
97
|
+
|
|
98
|
+
| Правило | Нормативная база |
|
|
99
|
+
|---------|----------------|
|
|
100
|
+
| `require-skip-link` — ссылка «Перейти к содержанию» | ГОСТ §5.2.3.1; №102 п. а) |
|
|
101
|
+
| `require-lang-attr` — `lang="ru"` на `<html>` | ГОСТ §5.2.4; №102 п. а), д) |
|
|
102
|
+
| `require-title-semantic` — информативный `<title>` | ГОСТ §5.2.3; №102 п. е) |
|
|
103
|
+
| `no-frame-structure` — запрет `<frame>`/`<frameset>` | ГОСТ §5.1.1; №102 п. а) |
|
|
104
|
+
| `table-requires-th` — `<th scope>` в таблицах данных | ГОСТ §5.1.5; №102 п. а) |
|
|
105
|
+
| `no-table-layout` — запрет таблиц для вёрстки | ГОСТ §5.1.5; №102 п. а) |
|
|
106
|
+
| `zoom-200-warning` — масштабирование 200% | №102 п. б) |
|
|
107
|
+
|
|
108
|
+
**26 правил jsx-a11y** — переведены на русский с привязкой к нормативам.
|
|
109
|
+
|
|
110
|
+
→ [Подробная документация ESLint-плагина](./packages/eslint-preset/README.md)
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## 🔧 CLI-сканер _(в разработке)_
|
|
115
|
+
|
|
116
|
+
Планируется: проверка готовых страниц по URL через Puppeteer + axe-core с отчётом, привязанным к пунктам ГОСТ и Постановления №102.
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
# Будущий API:
|
|
120
|
+
npx ru-a11y-toolkit-cli scan https://example.gov.ru --format html --out report.html
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
→ [README](./packages/cli/README.md)
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## 🖥 React Overlay _(в разработке)_
|
|
128
|
+
|
|
129
|
+
Планируется: runtime-визуализация нарушений доступности прямо на странице — подсветка элементов, всплывающие подсказки с описанием на русском языке и ссылками на нормативные документы.
|
|
130
|
+
|
|
131
|
+
```jsx
|
|
132
|
+
// Будущий API:
|
|
133
|
+
import { A11yOverlay } from 'ru-a11y-toolkit-overlay';
|
|
134
|
+
|
|
135
|
+
function App() {
|
|
136
|
+
return (
|
|
137
|
+
<>
|
|
138
|
+
{process.env.NODE_ENV === 'development' && <A11yOverlay />}
|
|
139
|
+
<YourApp />
|
|
140
|
+
</>
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
→ [README](./packages/react-overlay/README.md)
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## Нормативная база
|
|
150
|
+
|
|
151
|
+
### ГОСТ Р 52872-2019
|
|
152
|
+
Введён в действие с 01.04.2020. Устанавливает требования доступности для интернет-ресурсов и приложений. Основан на WCAG 2.1, адаптирован для РФ.
|
|
153
|
+
|
|
154
|
+
### Постановление Правительства РФ №102 от 07.02.2026
|
|
155
|
+
Вступает в силу **01.03.2026**. Обязательно для официальных сайтов государственных органов:
|
|
156
|
+
|
|
157
|
+
| Пункт | Требование | Что проверяет |
|
|
158
|
+
|-------|-----------|--------------|
|
|
159
|
+
| п. а) | Доступ с клавиатуры, корректное считывание скринридерами | `require-skip-link`, `no-frame-structure`, `no-table-layout` и др. |
|
|
160
|
+
| п. б) | Масштабирование текста не менее 200% | `zoom-200-warning` |
|
|
161
|
+
| п. г) | Текстовые альтернативы для нетекстового контента | `jsx-a11y/alt-text`, `jsx-a11y/media-has-caption` |
|
|
162
|
+
| п. д) | CAPTCHA на государственном языке РФ | `require-lang-attr` (enforceRussian) |
|
|
163
|
+
| п. е) | Информативные заголовки страниц | `require-title-semantic` |
|
|
164
|
+
| п. ж) | Цель ссылок определяется из их текста | `jsx-a11y/anchor-has-content` |
|
|
165
|
+
| п. м) | Подписи к полям форм | `jsx-a11y/label-has-associated-control` |
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## Разработка
|
|
170
|
+
|
|
171
|
+
```bash
|
|
172
|
+
git clone https://github.com/biondohod/ru-a11y.git
|
|
173
|
+
cd ru-a11y
|
|
174
|
+
npm install
|
|
175
|
+
npm test # тесты ESLint-плагина
|
|
176
|
+
npm run test:all # тесты всех пакетов
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### Структура репозитория
|
|
180
|
+
|
|
181
|
+
```
|
|
182
|
+
ru-a11y/
|
|
183
|
+
├── index.js # umbrella-реэкспорт (ru-a11y-toolkit)
|
|
184
|
+
├── package.json # ru-a11y-toolkit
|
|
185
|
+
├── packages/
|
|
186
|
+
│ ├── eslint-preset/ # ru-a11y-toolkit-eslint ✅
|
|
187
|
+
│ ├── cli/ # ru-a11y-toolkit-cli 🚧
|
|
188
|
+
│ └── react-overlay/ # ru-a11y-toolkit-overlay 🚧
|
|
189
|
+
├── README.md # этот файл
|
|
190
|
+
└── LICENSE
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
### Публикация отдельного пакета
|
|
194
|
+
|
|
195
|
+
```bash
|
|
196
|
+
# ESLint-плагин
|
|
197
|
+
cd packages/eslint-preset
|
|
198
|
+
npm publish --access public
|
|
199
|
+
|
|
200
|
+
# umbrella (после публикации всех зависимостей)
|
|
201
|
+
cd ../..
|
|
202
|
+
npm publish --access public
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
## Лицензия
|
|
206
|
+
|
|
207
|
+
MIT © [biondohod](https://github.com/biondohod)
|
|
208
|
+
|
package/index.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* ru-a11y-toolkit — umbrella-пакет
|
|
5
|
+
*
|
|
6
|
+
* Реэкспортирует все готовые модули toolkit.
|
|
7
|
+
* По мере выхода CLI и React Overlay они будут добавлены сюда.
|
|
8
|
+
*
|
|
9
|
+
* Использование:
|
|
10
|
+
* const toolkit = require('ru-a11y-toolkit');
|
|
11
|
+
* // toolkit.eslint — ESLint-плагин
|
|
12
|
+
* // toolkit.eslint.configs['gost-aa'] — конфиг напрямую
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
const eslint = require('ru-a11y-toolkit-eslint');
|
|
16
|
+
|
|
17
|
+
module.exports = {
|
|
18
|
+
/** ESLint-плагин с правилами и конфигами */
|
|
19
|
+
eslint,
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Конфиги для прямого использования в eslint.config.js (Flat Config):
|
|
23
|
+
* const { configs } = require('ru-a11y-toolkit');
|
|
24
|
+
* module.exports = [configs.recommended];
|
|
25
|
+
*/
|
|
26
|
+
configs: eslint.configs,
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Все правила плагина:
|
|
30
|
+
* const { rules } = require('ru-a11y-toolkit');
|
|
31
|
+
*/
|
|
32
|
+
rules: eslint.rules,
|
|
33
|
+
};
|
|
34
|
+
|
package/package.json
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "ru-a11y-toolkit",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Toolkit для автоматизированной проверки веб-доступности React/JS-приложений под российские нормативы (ГОСТ Р 52872-2019, Постановление №102)",
|
|
5
|
+
"main": "index.js",
|
|
6
|
+
"workspaces": [
|
|
7
|
+
"packages/*"
|
|
8
|
+
],
|
|
9
|
+
"scripts": {
|
|
10
|
+
"test": "jest --passWithNoTests",
|
|
11
|
+
"test:all": "npm run test --workspaces",
|
|
12
|
+
"lint": "eslint packages --ext .js,.jsx,.ts,.tsx",
|
|
13
|
+
"build": "npm run build --workspaces --if-present"
|
|
14
|
+
},
|
|
15
|
+
"dependencies": {
|
|
16
|
+
"ru-a11y-toolkit-eslint": "1.0.1"
|
|
17
|
+
},
|
|
18
|
+
"keywords": [
|
|
19
|
+
"accessibility",
|
|
20
|
+
"a11y",
|
|
21
|
+
"eslint",
|
|
22
|
+
"eslint-plugin",
|
|
23
|
+
"ГОСТ",
|
|
24
|
+
"доступность",
|
|
25
|
+
"React",
|
|
26
|
+
"JSX",
|
|
27
|
+
"wcag",
|
|
28
|
+
"russia",
|
|
29
|
+
"ru-a11y"
|
|
30
|
+
],
|
|
31
|
+
"author": {
|
|
32
|
+
"name": "biondohod",
|
|
33
|
+
"url": "https://github.com/biondohod"
|
|
34
|
+
},
|
|
35
|
+
"license": "MIT",
|
|
36
|
+
"repository": {
|
|
37
|
+
"type": "git",
|
|
38
|
+
"url": "https://github.com/biondohod/ru-a11y.git"
|
|
39
|
+
},
|
|
40
|
+
"homepage": "https://github.com/biondohod/ru-a11y#readme",
|
|
41
|
+
"bugs": {
|
|
42
|
+
"url": "https://github.com/biondohod/ru-a11y/issues"
|
|
43
|
+
},
|
|
44
|
+
"files": [
|
|
45
|
+
"index.js",
|
|
46
|
+
"README.md",
|
|
47
|
+
"LICENSE"
|
|
48
|
+
],
|
|
49
|
+
"devDependencies": {
|
|
50
|
+
"@babel/core": "^7.23.0",
|
|
51
|
+
"@babel/eslint-parser": "^7.23.0",
|
|
52
|
+
"@babel/preset-env": "^7.23.0",
|
|
53
|
+
"@babel/preset-react": "^7.22.0",
|
|
54
|
+
"eslint": "^9.0.0",
|
|
55
|
+
"eslint-plugin-jsx-a11y": "^6.8.0",
|
|
56
|
+
"jest": "^29.7.0",
|
|
57
|
+
"babel-jest": "^29.7.0"
|
|
58
|
+
},
|
|
59
|
+
"jest": {
|
|
60
|
+
"testEnvironment": "node",
|
|
61
|
+
"testMatch": [
|
|
62
|
+
"**/tests/**/*.test.js"
|
|
63
|
+
],
|
|
64
|
+
"transform": {
|
|
65
|
+
"^.+\\.jsx?$": "babel-jest"
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|