vision-accessibility 1.0.0 → 1.0.1
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/dist/components/AccessibilityPanel/AccessibilityPanel.d.ts.map +1 -1
- package/dist/index.esm.js +263 -74
- package/dist/index.esm.js.map +1 -1
- package/dist/index.umd.js +7 -2
- package/dist/index.umd.js.map +1 -1
- package/dist/lib/css-applier.d.ts +9 -1
- package/dist/lib/css-applier.d.ts.map +1 -1
- package/dist/style.css +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +21 -13
- package/src/components/AccessibilityPanel/AccessibilityPanel.module.scss +32 -12
- package/src/components/AccessibilityPanel/AccessibilityPanel.stories.tsx +105 -0
- package/src/components/AccessibilityPanel/AccessibilityPanel.tsx +29 -19
- package/src/components/AccessibilityToggle/AccessibilityToggle.module.scss +1 -1
- package/src/components/AccessibilityToggle/AccessibilityToggle.stories.tsx +34 -0
- package/src/components/AccessibilityToggle/AccessibilityToggle.tsx +1 -1
- package/src/components/ColorSchemeControl/ColorSchemeControl.module.scss +1 -1
- package/src/components/ColorSchemeControl/ColorSchemeControl.stories.tsx +34 -0
- package/src/components/ColorSchemeControl/ColorSchemeControl.tsx +1 -1
- package/src/components/FontSizeControl/FontSizeControl.module.scss +1 -1
- package/src/components/FontSizeControl/FontSizeControl.stories.tsx +34 -0
- package/src/components/FontSizeControl/FontSizeControl.tsx +1 -1
- package/src/components/ImageControl/ImageControl.module.scss +1 -1
- package/src/components/ImageControl/ImageControl.stories.tsx +43 -0
- package/src/components/ImageControl/ImageControl.tsx +1 -1
- package/src/lib/css-applier.ts +127 -4
- package/src/styles/global.scss +7 -7
- package/src/types/index.ts +1 -1
package/src/lib/css-applier.ts
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* - 3.1, 3.2, 3.3: Настройка размера шрифта
|
|
8
8
|
* - 4.1, 4.2: Управление отображением изображений
|
|
9
9
|
*/
|
|
10
|
-
|
|
10
|
+
import cn from 'classnames';
|
|
11
11
|
import { ColorScheme, FontSize, AccessibilitySettings } from '../types';
|
|
12
12
|
import {
|
|
13
13
|
getImageElements,
|
|
@@ -25,7 +25,7 @@ import {
|
|
|
25
25
|
* CSS классы для различных настроек доступности
|
|
26
26
|
*/
|
|
27
27
|
export const CSS_CLASSES = {
|
|
28
|
-
HIGH_CONTRAST: 'accessibility-high-contrast',
|
|
28
|
+
HIGH_CONTRAST: cn('accessibility-high-contrast'),
|
|
29
29
|
FONT_SMALL: 'accessibility-font-small',
|
|
30
30
|
FONT_LARGE: 'accessibility-font-large',
|
|
31
31
|
HIDE_IMAGES: 'accessibility-hide-images',
|
|
@@ -42,21 +42,25 @@ export const applyColorScheme = (scheme: ColorScheme): void => {
|
|
|
42
42
|
safeDOMOperation(() => {
|
|
43
43
|
if (!isDOMAvailable()) return;
|
|
44
44
|
|
|
45
|
-
// Удаляем существующие классы и стили
|
|
45
|
+
// Удаляем существующие классы и стили высокого контраста перед применением нового режима
|
|
46
46
|
document.body.classList.remove(CSS_CLASSES.HIGH_CONTRAST);
|
|
47
47
|
document.body.style.filter = '';
|
|
48
|
+
// Также удаляем стили высокого контраста со всех элементов
|
|
49
|
+
removeHighContrastStylesFromAllElements();
|
|
48
50
|
|
|
49
51
|
switch (scheme) {
|
|
50
52
|
case 'high-contrast':
|
|
51
53
|
// Требование 2.1: Контрастный белый на черном
|
|
52
54
|
document.body.classList.add(CSS_CLASSES.HIGH_CONTRAST);
|
|
55
|
+
// Также применяем стили высокого контраста ко всем элементам на странице
|
|
56
|
+
applyHighContrastStylesToAllElements();
|
|
53
57
|
break;
|
|
54
58
|
case 'grayscale':
|
|
55
59
|
// Требование 2.2: Черно-белый режим через CSS фильтр
|
|
56
60
|
document.body.style.filter = 'grayscale(100%)';
|
|
57
61
|
break;
|
|
58
62
|
case 'standard':
|
|
59
|
-
// Требование 2.3: Стандартное оформление
|
|
63
|
+
// Требование 2.3: Стандартное оформление
|
|
60
64
|
break;
|
|
61
65
|
default:
|
|
62
66
|
console.warn(`Неизвестная цветовая схема: ${scheme}`);
|
|
@@ -119,6 +123,9 @@ export const removeAllAccessibilityStyles = (): void => {
|
|
|
119
123
|
// Удаляем классы с изображений
|
|
120
124
|
const imageElements = getImageElements();
|
|
121
125
|
removeClassFromElements(imageElements, CSS_CLASSES.HIDE_IMAGES);
|
|
126
|
+
|
|
127
|
+
// Удаляем стили высокого контраста со всех элементов
|
|
128
|
+
removeHighContrastStylesFromAllElements();
|
|
122
129
|
}, 'Ошибка при удалении всех стилей доступности');
|
|
123
130
|
};
|
|
124
131
|
|
|
@@ -139,6 +146,122 @@ export const applyAllSettings = (settings: AccessibilitySettings): void => {
|
|
|
139
146
|
applyImageVisibility(settings.showImages);
|
|
140
147
|
};
|
|
141
148
|
|
|
149
|
+
/**
|
|
150
|
+
* Применение стилей высокого контраста ко всем элементам на странице
|
|
151
|
+
*/
|
|
152
|
+
export const applyHighContrastStylesToAllElements = (): void => {
|
|
153
|
+
safeDOMOperation(() => {
|
|
154
|
+
if (!isDOMAvailable()) return;
|
|
155
|
+
|
|
156
|
+
// Получаем все элементы на странице
|
|
157
|
+
const allElements = document.querySelectorAll('*');
|
|
158
|
+
|
|
159
|
+
allElements.forEach(element => {
|
|
160
|
+
// Проверяем, что элемент является HTMLElement (имеет стиль)
|
|
161
|
+
if (element instanceof HTMLElement) {
|
|
162
|
+
// Применяем стили высокого контраста к каждому элементу
|
|
163
|
+
element.style.backgroundColor = '#000';
|
|
164
|
+
element.style.color = '#fff';
|
|
165
|
+
element.style.borderColor = '#fff';
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
// Особые стили для ссылок
|
|
170
|
+
const links = document.querySelectorAll('a');
|
|
171
|
+
links.forEach(link => {
|
|
172
|
+
if (link instanceof HTMLElement) {
|
|
173
|
+
link.style.color = '#ffff00'; // желтый цвет для ссылок
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
// Особые стили для посещенных ссылок
|
|
178
|
+
const visitedLinks = document.querySelectorAll('a:visited');
|
|
179
|
+
visitedLinks.forEach(link => {
|
|
180
|
+
if (link instanceof HTMLElement) {
|
|
181
|
+
link.style.color = '#ff00ff'; // пурпурный для посещенных
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
// Особые стили для кнопок
|
|
186
|
+
const buttons = document.querySelectorAll('button');
|
|
187
|
+
buttons.forEach(button => {
|
|
188
|
+
if (button instanceof HTMLElement) {
|
|
189
|
+
button.style.backgroundColor = '#fff';
|
|
190
|
+
button.style.color = '#000';
|
|
191
|
+
button.style.border = '2px solid #fff';
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
// Особые стили для полей ввода
|
|
196
|
+
const inputs = document.querySelectorAll('input, textarea, select');
|
|
197
|
+
inputs.forEach(input => {
|
|
198
|
+
if (input instanceof HTMLElement) {
|
|
199
|
+
input.style.backgroundColor = '#fff';
|
|
200
|
+
input.style.color = '#000';
|
|
201
|
+
input.style.border = '2px solid #fff';
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
}, 'Ошибка при применении стилей высокого контраста ко всем элементам');
|
|
205
|
+
};
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Удаление стилей высокого контраста со всех элементов на странице
|
|
209
|
+
*/
|
|
210
|
+
export const removeHighContrastStylesFromAllElements = (): void => {
|
|
211
|
+
safeDOMOperation(() => {
|
|
212
|
+
if (!isDOMAvailable()) return;
|
|
213
|
+
|
|
214
|
+
// Получаем все элементы на странице
|
|
215
|
+
const allElements = document.querySelectorAll('*');
|
|
216
|
+
|
|
217
|
+
allElements.forEach(element => {
|
|
218
|
+
// Проверяем, что элемент является HTMLElement (имеет стиль)
|
|
219
|
+
if (element instanceof HTMLElement) {
|
|
220
|
+
// Удаляем инлайновые стили высокого контраста
|
|
221
|
+
element.style.backgroundColor = '';
|
|
222
|
+
element.style.color = '';
|
|
223
|
+
element.style.borderColor = '';
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
// Сбрасываем особые стили для ссылок
|
|
228
|
+
const links = document.querySelectorAll('a');
|
|
229
|
+
links.forEach(link => {
|
|
230
|
+
if (link instanceof HTMLElement) {
|
|
231
|
+
link.style.color = '';
|
|
232
|
+
}
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
// Сбрасываем особые стили для посещенных ссылок
|
|
236
|
+
const visitedLinks = document.querySelectorAll('a:visited');
|
|
237
|
+
visitedLinks.forEach(link => {
|
|
238
|
+
if (link instanceof HTMLElement) {
|
|
239
|
+
link.style.color = '';
|
|
240
|
+
}
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
// Сбрасываем особые стили для кнопок
|
|
244
|
+
const buttons = document.querySelectorAll('button');
|
|
245
|
+
buttons.forEach(button => {
|
|
246
|
+
if (button instanceof HTMLElement) {
|
|
247
|
+
button.style.backgroundColor = '';
|
|
248
|
+
button.style.color = '';
|
|
249
|
+
button.style.border = '';
|
|
250
|
+
}
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
// Сбрасываем особые стили для полей ввода
|
|
254
|
+
const inputs = document.querySelectorAll('input, textarea, select');
|
|
255
|
+
inputs.forEach(input => {
|
|
256
|
+
if (input instanceof HTMLElement) {
|
|
257
|
+
input.style.backgroundColor = '';
|
|
258
|
+
input.style.color = '';
|
|
259
|
+
input.style.border = '';
|
|
260
|
+
}
|
|
261
|
+
});
|
|
262
|
+
}, 'Ошибка при удалении стилей высокого контраста со всех элементов');
|
|
263
|
+
};
|
|
264
|
+
|
|
142
265
|
/**
|
|
143
266
|
* Применение конкретной настройки с проверкой общего режима
|
|
144
267
|
* Применяет настройку только если общий режим доступности включен
|
package/src/styles/global.scss
CHANGED
|
@@ -12,14 +12,14 @@
|
|
|
12
12
|
background: #000 !important;
|
|
13
13
|
color: #fff !important;
|
|
14
14
|
|
|
15
|
-
/* Применяем стили ко всем элементам,
|
|
16
|
-
|
|
15
|
+
/* Применяем стили ко всем элементам, включая панель доступности */
|
|
16
|
+
* {
|
|
17
17
|
background: #000 !important;
|
|
18
18
|
color: #fff !important;
|
|
19
19
|
border-color: #fff !important;
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
a
|
|
22
|
+
a {
|
|
23
23
|
color: #ffff00 !important;
|
|
24
24
|
|
|
25
25
|
&:visited {
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
button
|
|
34
|
+
button {
|
|
35
35
|
background: #fff !important;
|
|
36
36
|
color: #000 !important;
|
|
37
37
|
border: 2px solid #fff !important;
|
|
@@ -42,9 +42,9 @@
|
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
-
input
|
|
46
|
-
textarea
|
|
47
|
-
select
|
|
45
|
+
input,
|
|
46
|
+
textarea,
|
|
47
|
+
select {
|
|
48
48
|
background: #fff !important;
|
|
49
49
|
color: #000 !important;
|
|
50
50
|
border: 2px solid #fff !important;
|
package/src/types/index.ts
CHANGED
|
@@ -43,7 +43,7 @@ export interface AccessibilityPanelProps {
|
|
|
43
43
|
/** Обработчик закрытия панели */
|
|
44
44
|
onClose: () => void;
|
|
45
45
|
/** Позиция панели относительно кнопки */
|
|
46
|
-
position?: 'top-right' | 'top-left';
|
|
46
|
+
position?: 'top-right' | 'top-left' | 'bottom-left' | 'bottom-right';
|
|
47
47
|
}
|
|
48
48
|
|
|
49
49
|
/**
|