vision-accessibility 1.0.2 → 1.0.3
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/README.md +70 -1
- package/dist/components/AccessibilityPanel/AccessibilityPanel.d.ts.map +1 -1
- package/dist/components/AccessibilityToggle/AccessibilityToggle.d.ts +2 -0
- package/dist/components/AccessibilityToggle/AccessibilityToggle.d.ts.map +1 -1
- package/dist/components/ColorSchemeControl/ColorSchemeControl.d.ts +2 -0
- package/dist/components/ColorSchemeControl/ColorSchemeControl.d.ts.map +1 -1
- package/dist/components/FontSizeControl/FontSizeControl.d.ts +2 -0
- package/dist/components/FontSizeControl/FontSizeControl.d.ts.map +1 -1
- package/dist/components/ImageControl/ImageControl.d.ts +2 -0
- package/dist/components/ImageControl/ImageControl.d.ts.map +1 -1
- package/dist/config/translations.d.ts +57 -0
- package/dist/config/translations.d.ts.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.esm.js +371 -202
- package/dist/index.esm.js.map +1 -1
- package/dist/index.umd.js +3 -3
- package/dist/index.umd.js.map +1 -1
- package/dist/lib/css-applier.d.ts +1 -0
- package/dist/lib/css-applier.d.ts.map +1 -1
- package/dist/style.css +1 -1
- package/dist/types/index.d.ts +39 -1
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/components/AccessibilityPanel/AccessibilityPanel.module.scss +22 -31
- package/src/components/AccessibilityPanel/AccessibilityPanel.stories.tsx +50 -10
- package/src/components/AccessibilityPanel/AccessibilityPanel.tsx +72 -44
- package/src/components/AccessibilityToggle/AccessibilityToggle.stories.tsx +11 -0
- package/src/components/AccessibilityToggle/AccessibilityToggle.tsx +17 -10
- package/src/components/ColorSchemeControl/ColorSchemeControl.stories.tsx +15 -0
- package/src/components/ColorSchemeControl/ColorSchemeControl.tsx +99 -61
- package/src/components/FontSizeControl/FontSizeControl.stories.tsx +15 -0
- package/src/components/FontSizeControl/FontSizeControl.tsx +99 -61
- package/src/components/ImageControl/ImageControl.stories.tsx +11 -0
- package/src/components/ImageControl/ImageControl.tsx +17 -10
- package/src/config/translations.ts +82 -0
- package/src/hooks/useAccessibilitySettings.ts +12 -12
- package/src/index.ts +12 -8
- package/src/lib/css-applier.ts +54 -38
- package/src/styles/global.scss +1 -4
- package/src/types/index.ts +43 -1
package/src/index.ts
CHANGED
|
@@ -3,20 +3,24 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
// Основные типы
|
|
6
|
-
export type {
|
|
7
|
-
AccessibilitySettings,
|
|
8
|
-
ColorScheme,
|
|
9
|
-
FontSize,
|
|
6
|
+
export type {
|
|
7
|
+
AccessibilitySettings,
|
|
8
|
+
ColorScheme,
|
|
9
|
+
FontSize,
|
|
10
10
|
AccessibilityPanelProps,
|
|
11
11
|
ControlComponentProps,
|
|
12
12
|
AccessibilityContextType
|
|
13
13
|
} from './types';
|
|
14
14
|
|
|
15
|
-
export {
|
|
16
|
-
DEFAULT_ACCESSIBILITY_SETTINGS,
|
|
17
|
-
STORAGE_KEY
|
|
15
|
+
export {
|
|
16
|
+
DEFAULT_ACCESSIBILITY_SETTINGS,
|
|
17
|
+
STORAGE_KEY
|
|
18
18
|
} from './types';
|
|
19
19
|
|
|
20
|
+
// Типы и конфигурации для локализации
|
|
21
|
+
export type { AccessibilityTranslations } from './config/translations';
|
|
22
|
+
export { defaultTranslations } from './config/translations';
|
|
23
|
+
|
|
20
24
|
// Утилиты для работы с localStorage
|
|
21
25
|
export {
|
|
22
26
|
saveToStorage,
|
|
@@ -77,4 +81,4 @@ export { ImageControl } from './components/ImageControl/ImageControl';
|
|
|
77
81
|
|
|
78
82
|
// Стили (для импорта в основное приложение)
|
|
79
83
|
// Пользователи должны импортировать стили напрямую:
|
|
80
|
-
// import 'vision-accessibility/dist/style.css';
|
|
84
|
+
// import 'vision-accessibility/dist/style.css';
|
package/src/lib/css-applier.ts
CHANGED
|
@@ -69,6 +69,14 @@ export const applyColorScheme = (scheme: ColorScheme): void => {
|
|
|
69
69
|
}, `Ошибка при применении цветовой схемы: ${scheme}`);
|
|
70
70
|
};
|
|
71
71
|
|
|
72
|
+
/**
|
|
73
|
+
* Проверка, является ли элемент частью панели доступности
|
|
74
|
+
*/
|
|
75
|
+
const isAccessibilityPanelElement = (element: Element): boolean => {
|
|
76
|
+
return element.hasAttribute('data-accessibility-panel-container') ||
|
|
77
|
+
element.closest('[data-accessibility-panel-container]') !== null;
|
|
78
|
+
};
|
|
79
|
+
|
|
72
80
|
/**
|
|
73
81
|
* Применение настроек размера шрифта
|
|
74
82
|
* Реализует требования 3.1, 3.2, 3.3:
|
|
@@ -92,14 +100,19 @@ export const applyImageVisibility = (showImages: boolean): void => {
|
|
|
92
100
|
safeDOMOperation(() => {
|
|
93
101
|
if (!isDOMAvailable()) return;
|
|
94
102
|
|
|
95
|
-
|
|
103
|
+
// Получаем все изображения на странице
|
|
104
|
+
const images = document.querySelectorAll('img');
|
|
96
105
|
|
|
97
106
|
if (showImages) {
|
|
98
107
|
// Требование 4.2: Показывать изображения (восстановление видимости)
|
|
99
|
-
|
|
108
|
+
images.forEach(img => {
|
|
109
|
+
(img as HTMLElement).style.visibility = '';
|
|
110
|
+
});
|
|
100
111
|
} else {
|
|
101
|
-
// Требование 4.1: Скрывать изображения через
|
|
102
|
-
|
|
112
|
+
// Требование 4.1: Скрывать изображения через visibility: hidden
|
|
113
|
+
images.forEach(img => {
|
|
114
|
+
(img as HTMLElement).style.visibility = 'hidden';
|
|
115
|
+
});
|
|
103
116
|
}
|
|
104
117
|
}, `Ошибка при управлении отображением изображений: ${showImages}`);
|
|
105
118
|
};
|
|
@@ -120,9 +133,11 @@ export const removeAllAccessibilityStyles = (): void => {
|
|
|
120
133
|
// Сбрасываем все изменения размера шрифта
|
|
121
134
|
resetAllFontSizes();
|
|
122
135
|
|
|
123
|
-
//
|
|
124
|
-
const
|
|
125
|
-
|
|
136
|
+
// Сбрасываем inline-стили visibility для изображений
|
|
137
|
+
const images = document.querySelectorAll('img');
|
|
138
|
+
images.forEach(img => {
|
|
139
|
+
(img as HTMLElement).style.visibility = '';
|
|
140
|
+
});
|
|
126
141
|
|
|
127
142
|
// Удаляем стили высокого контраста со всех элементов
|
|
128
143
|
removeHighContrastStylesFromAllElements();
|
|
@@ -134,15 +149,12 @@ export const removeAllAccessibilityStyles = (): void => {
|
|
|
134
149
|
* Применяет все переданные настройки одновременно
|
|
135
150
|
*/
|
|
136
151
|
export const applyAllSettings = (settings: AccessibilitySettings): void => {
|
|
137
|
-
if (!settings.isEnabled) {
|
|
138
|
-
// Если режим доступности выключен, удаляем все стили
|
|
139
|
-
removeAllAccessibilityStyles();
|
|
140
|
-
return;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
152
|
// Применяем все настройки
|
|
144
|
-
|
|
145
|
-
|
|
153
|
+
if (settings.isEnabled) {
|
|
154
|
+
applyColorScheme(settings.colorScheme);
|
|
155
|
+
applyFontSize(settings.fontSize);
|
|
156
|
+
}
|
|
157
|
+
// Применяем настройку отображения изображений независимо от общего режима
|
|
146
158
|
applyImageVisibility(settings.showImages);
|
|
147
159
|
};
|
|
148
160
|
|
|
@@ -153,12 +165,13 @@ export const applyHighContrastStylesToAllElements = (): void => {
|
|
|
153
165
|
safeDOMOperation(() => {
|
|
154
166
|
if (!isDOMAvailable()) return;
|
|
155
167
|
|
|
156
|
-
// Получаем все элементы на
|
|
168
|
+
// Получаем все элементы на странице, исключая элементы панели доступности
|
|
157
169
|
const allElements = document.querySelectorAll('*');
|
|
158
170
|
|
|
159
171
|
allElements.forEach(element => {
|
|
160
172
|
// Проверяем, что элемент является HTMLElement (имеет стиль)
|
|
161
|
-
|
|
173
|
+
// и не является частью панели доступности
|
|
174
|
+
if (element instanceof HTMLElement && !isAccessibilityPanelElement(element)) {
|
|
162
175
|
// Применяем стили высокого контраста к каждому элементу
|
|
163
176
|
element.style.backgroundColor = '#000';
|
|
164
177
|
element.style.color = '#fff';
|
|
@@ -166,26 +179,26 @@ export const applyHighContrastStylesToAllElements = (): void => {
|
|
|
166
179
|
}
|
|
167
180
|
});
|
|
168
181
|
|
|
169
|
-
// Особые стили для ссылок
|
|
170
|
-
const links = document.querySelectorAll('a');
|
|
182
|
+
// Особые стили для ссылок (исключая элементы панели доступности)
|
|
183
|
+
const links = document.querySelectorAll('a:not([data-accessibility-panel-container])');
|
|
171
184
|
links.forEach(link => {
|
|
172
|
-
if (link instanceof HTMLElement) {
|
|
185
|
+
if (link instanceof HTMLElement && !isAccessibilityPanelElement(link)) {
|
|
173
186
|
link.style.color = '#ffff00'; // желтый цвет для ссылок
|
|
174
187
|
}
|
|
175
188
|
});
|
|
176
189
|
|
|
177
190
|
// Особые стили для посещенных ссылок
|
|
178
|
-
const visitedLinks = document.querySelectorAll('a:visited');
|
|
191
|
+
const visitedLinks = document.querySelectorAll('a:visited:not([data-accessibility-panel-container])');
|
|
179
192
|
visitedLinks.forEach(link => {
|
|
180
|
-
if (link instanceof HTMLElement) {
|
|
193
|
+
if (link instanceof HTMLElement && !isAccessibilityPanelElement(link)) {
|
|
181
194
|
link.style.color = '#ff00ff'; // пурпурный для посещенных
|
|
182
195
|
}
|
|
183
196
|
});
|
|
184
197
|
|
|
185
198
|
// Особые стили для кнопок
|
|
186
|
-
const buttons = document.querySelectorAll('button');
|
|
199
|
+
const buttons = document.querySelectorAll('button:not([data-accessibility-panel-container])');
|
|
187
200
|
buttons.forEach(button => {
|
|
188
|
-
if (button instanceof HTMLElement) {
|
|
201
|
+
if (button instanceof HTMLElement && !isAccessibilityPanelElement(button)) {
|
|
189
202
|
button.style.backgroundColor = '#fff';
|
|
190
203
|
button.style.color = '#000';
|
|
191
204
|
button.style.border = '2px solid #fff';
|
|
@@ -193,9 +206,9 @@ export const applyHighContrastStylesToAllElements = (): void => {
|
|
|
193
206
|
});
|
|
194
207
|
|
|
195
208
|
// Особые стили для полей ввода
|
|
196
|
-
const inputs = document.querySelectorAll('input, textarea, select');
|
|
209
|
+
const inputs = document.querySelectorAll('input, textarea, select:not([data-accessibility-panel-container])');
|
|
197
210
|
inputs.forEach(input => {
|
|
198
|
-
if (input instanceof HTMLElement) {
|
|
211
|
+
if (input instanceof HTMLElement && !isAccessibilityPanelElement(input)) {
|
|
199
212
|
input.style.backgroundColor = '#fff';
|
|
200
213
|
input.style.color = '#000';
|
|
201
214
|
input.style.border = '2px solid #fff';
|
|
@@ -211,12 +224,13 @@ export const removeHighContrastStylesFromAllElements = (): void => {
|
|
|
211
224
|
safeDOMOperation(() => {
|
|
212
225
|
if (!isDOMAvailable()) return;
|
|
213
226
|
|
|
214
|
-
// Получаем все элементы на
|
|
227
|
+
// Получаем все элементы на странице, исключая элементы панели доступности
|
|
215
228
|
const allElements = document.querySelectorAll('*');
|
|
216
229
|
|
|
217
230
|
allElements.forEach(element => {
|
|
218
231
|
// Проверяем, что элемент является HTMLElement (имеет стиль)
|
|
219
|
-
|
|
232
|
+
// и не является частью панели доступности
|
|
233
|
+
if (element instanceof HTMLElement && !isAccessibilityPanelElement(element)) {
|
|
220
234
|
// Удаляем инлайновые стили высокого контраста
|
|
221
235
|
element.style.backgroundColor = '';
|
|
222
236
|
element.style.color = '';
|
|
@@ -224,26 +238,26 @@ export const removeHighContrastStylesFromAllElements = (): void => {
|
|
|
224
238
|
}
|
|
225
239
|
});
|
|
226
240
|
|
|
227
|
-
// Сбрасываем особые стили для ссылок
|
|
228
|
-
const links = document.querySelectorAll('a');
|
|
241
|
+
// Сбрасываем особые стили для ссылок (исключая элементы панели доступности)
|
|
242
|
+
const links = document.querySelectorAll('a:not([data-accessibility-panel-container])');
|
|
229
243
|
links.forEach(link => {
|
|
230
|
-
if (link instanceof HTMLElement) {
|
|
244
|
+
if (link instanceof HTMLElement && !isAccessibilityPanelElement(link)) {
|
|
231
245
|
link.style.color = '';
|
|
232
246
|
}
|
|
233
247
|
});
|
|
234
248
|
|
|
235
249
|
// Сбрасываем особые стили для посещенных ссылок
|
|
236
|
-
const visitedLinks = document.querySelectorAll('a:visited');
|
|
250
|
+
const visitedLinks = document.querySelectorAll('a:visited:not([data-accessibility-panel-container])');
|
|
237
251
|
visitedLinks.forEach(link => {
|
|
238
|
-
if (link instanceof HTMLElement) {
|
|
252
|
+
if (link instanceof HTMLElement && !isAccessibilityPanelElement(link)) {
|
|
239
253
|
link.style.color = '';
|
|
240
254
|
}
|
|
241
255
|
});
|
|
242
256
|
|
|
243
257
|
// Сбрасываем особые стили для кнопок
|
|
244
|
-
const buttons = document.querySelectorAll('button');
|
|
258
|
+
const buttons = document.querySelectorAll('button:not([data-accessibility-panel-container])');
|
|
245
259
|
buttons.forEach(button => {
|
|
246
|
-
if (button instanceof HTMLElement) {
|
|
260
|
+
if (button instanceof HTMLElement && !isAccessibilityPanelElement(button)) {
|
|
247
261
|
button.style.backgroundColor = '';
|
|
248
262
|
button.style.color = '';
|
|
249
263
|
button.style.border = '';
|
|
@@ -251,9 +265,9 @@ export const removeHighContrastStylesFromAllElements = (): void => {
|
|
|
251
265
|
});
|
|
252
266
|
|
|
253
267
|
// Сбрасываем особые стили для полей ввода
|
|
254
|
-
const inputs = document.querySelectorAll('input, textarea, select');
|
|
268
|
+
const inputs = document.querySelectorAll('input, textarea, select:not([data-accessibility-panel-container])');
|
|
255
269
|
inputs.forEach(input => {
|
|
256
|
-
if (input instanceof HTMLElement) {
|
|
270
|
+
if (input instanceof HTMLElement && !isAccessibilityPanelElement(input)) {
|
|
257
271
|
input.style.backgroundColor = '';
|
|
258
272
|
input.style.color = '';
|
|
259
273
|
input.style.border = '';
|
|
@@ -265,13 +279,15 @@ export const removeHighContrastStylesFromAllElements = (): void => {
|
|
|
265
279
|
/**
|
|
266
280
|
* Применение конкретной настройки с проверкой общего режима
|
|
267
281
|
* Применяет настройку только если общий режим доступности включен
|
|
282
|
+
* Исключение: настройка отображения изображений может работать независимо
|
|
268
283
|
*/
|
|
269
284
|
export const applySettingIfEnabled = (
|
|
270
285
|
isEnabled: boolean,
|
|
271
286
|
settingType: 'colorScheme' | 'fontSize' | 'imageVisibility',
|
|
272
287
|
value: ColorScheme | FontSize | boolean
|
|
273
288
|
): void => {
|
|
274
|
-
|
|
289
|
+
// Для настройки отображения изображений делаем исключение - она может работать независимо
|
|
290
|
+
if (!isEnabled && settingType !== 'imageVisibility') {
|
|
275
291
|
return;
|
|
276
292
|
}
|
|
277
293
|
|
package/src/styles/global.scss
CHANGED
|
@@ -54,7 +54,4 @@
|
|
|
54
54
|
/* Размеры шрифтов */
|
|
55
55
|
/* Стили для размера шрифта применяются динамически через JavaScript */
|
|
56
56
|
|
|
57
|
-
/* Скрытие изображений */
|
|
58
|
-
.accessibility-hide-images {
|
|
59
|
-
display: none !important;
|
|
60
|
-
}
|
|
57
|
+
/* Скрытие изображений - теперь используется inline стиль visibility */
|
package/src/types/index.ts
CHANGED
|
@@ -43,7 +43,9 @@ export interface AccessibilityPanelProps {
|
|
|
43
43
|
/** Обработчик закрытия панели */
|
|
44
44
|
onClose: () => void;
|
|
45
45
|
/** Позиция панели относительно кнопки */
|
|
46
|
-
position?: 'top-right' | 'top-left'
|
|
46
|
+
position?: 'top-right' | 'top-left' ;
|
|
47
|
+
/** Объект с переводами для настройки локализации */
|
|
48
|
+
translations?: import('../config/translations').AccessibilityTranslations;
|
|
47
49
|
}
|
|
48
50
|
|
|
49
51
|
/**
|
|
@@ -56,6 +58,46 @@ export interface ControlComponentProps {
|
|
|
56
58
|
onUpdate: (updates: Partial<AccessibilitySettings>) => void;
|
|
57
59
|
}
|
|
58
60
|
|
|
61
|
+
/**
|
|
62
|
+
* Свойства компонента переключателя режима доступности
|
|
63
|
+
*/
|
|
64
|
+
export interface AccessibilityToggleProps {
|
|
65
|
+
/** CSS класс для дополнительной стилизации */
|
|
66
|
+
className?: string;
|
|
67
|
+
/** Объект с переводами */
|
|
68
|
+
translations?: Record<string, string>;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Свойства компонента управления цветовой схемой
|
|
73
|
+
*/
|
|
74
|
+
export interface ColorSchemeControlProps {
|
|
75
|
+
/** CSS класс для дополнительной стилизации */
|
|
76
|
+
className?: string;
|
|
77
|
+
/** Объект с переводами */
|
|
78
|
+
translations?: Record<string, string>;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Свойства компонента управления размером шрифта
|
|
83
|
+
*/
|
|
84
|
+
export interface FontSizeControlProps {
|
|
85
|
+
/** CSS класс для дополнительной стилизации */
|
|
86
|
+
className?: string;
|
|
87
|
+
/** Объект с переводами */
|
|
88
|
+
translations?: Record<string, string>;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Свойства компонента управления изображениями
|
|
93
|
+
*/
|
|
94
|
+
export interface ImageControlProps {
|
|
95
|
+
/** CSS класс для дополнительной стилизации */
|
|
96
|
+
className?: string;
|
|
97
|
+
/** Объект с переводами */
|
|
98
|
+
translations?: Record<string, string>;
|
|
99
|
+
}
|
|
100
|
+
|
|
59
101
|
/**
|
|
60
102
|
* Настройки по умолчанию
|
|
61
103
|
*/
|