vision-accessibility 1.0.1 → 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.
Files changed (41) hide show
  1. package/README.md +70 -1
  2. package/dist/components/AccessibilityPanel/AccessibilityPanel.d.ts.map +1 -1
  3. package/dist/components/AccessibilityToggle/AccessibilityToggle.d.ts +2 -0
  4. package/dist/components/AccessibilityToggle/AccessibilityToggle.d.ts.map +1 -1
  5. package/dist/components/ColorSchemeControl/ColorSchemeControl.d.ts +2 -0
  6. package/dist/components/ColorSchemeControl/ColorSchemeControl.d.ts.map +1 -1
  7. package/dist/components/FontSizeControl/FontSizeControl.d.ts +2 -0
  8. package/dist/components/FontSizeControl/FontSizeControl.d.ts.map +1 -1
  9. package/dist/components/ImageControl/ImageControl.d.ts +2 -0
  10. package/dist/components/ImageControl/ImageControl.d.ts.map +1 -1
  11. package/dist/config/translations.d.ts +57 -0
  12. package/dist/config/translations.d.ts.map +1 -0
  13. package/dist/index.d.ts +2 -0
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.esm.js +371 -202
  16. package/dist/index.esm.js.map +1 -1
  17. package/dist/index.umd.js +3 -3
  18. package/dist/index.umd.js.map +1 -1
  19. package/dist/lib/css-applier.d.ts +1 -0
  20. package/dist/lib/css-applier.d.ts.map +1 -1
  21. package/dist/style.css +1 -1
  22. package/dist/types/index.d.ts +39 -1
  23. package/dist/types/index.d.ts.map +1 -1
  24. package/package.json +1 -1
  25. package/src/components/AccessibilityPanel/AccessibilityPanel.module.scss +22 -33
  26. package/src/components/AccessibilityPanel/AccessibilityPanel.stories.tsx +50 -10
  27. package/src/components/AccessibilityPanel/AccessibilityPanel.tsx +72 -44
  28. package/src/components/AccessibilityToggle/AccessibilityToggle.stories.tsx +11 -0
  29. package/src/components/AccessibilityToggle/AccessibilityToggle.tsx +17 -10
  30. package/src/components/ColorSchemeControl/ColorSchemeControl.stories.tsx +15 -0
  31. package/src/components/ColorSchemeControl/ColorSchemeControl.tsx +99 -61
  32. package/src/components/FontSizeControl/FontSizeControl.stories.tsx +15 -0
  33. package/src/components/FontSizeControl/FontSizeControl.tsx +99 -61
  34. package/src/components/ImageControl/ImageControl.stories.tsx +11 -0
  35. package/src/components/ImageControl/ImageControl.tsx +17 -10
  36. package/src/config/translations.ts +82 -0
  37. package/src/hooks/useAccessibilitySettings.ts +12 -12
  38. package/src/index.ts +12 -8
  39. package/src/lib/css-applier.ts +54 -38
  40. package/src/styles/global.scss +2 -5
  41. 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';
@@ -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
- const elements = getImageElements();
103
+ // Получаем все изображения на странице
104
+ const images = document.querySelectorAll('img');
96
105
 
97
106
  if (showImages) {
98
107
  // Требование 4.2: Показывать изображения (восстановление видимости)
99
- removeClassFromElements(elements, CSS_CLASSES.HIDE_IMAGES);
108
+ images.forEach(img => {
109
+ (img as HTMLElement).style.visibility = '';
110
+ });
100
111
  } else {
101
- // Требование 4.1: Скрывать изображения через CSS класс
102
- applyClassToElements(elements, CSS_CLASSES.HIDE_IMAGES);
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 imageElements = getImageElements();
125
- removeClassFromElements(imageElements, CSS_CLASSES.HIDE_IMAGES);
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
- applyColorScheme(settings.colorScheme);
145
- applyFontSize(settings.fontSize);
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
- if (element instanceof HTMLElement) {
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
- if (element instanceof HTMLElement) {
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
- if (!isEnabled) {
289
+ // Для настройки отображения изображений делаем исключение - она может работать независимо
290
+ if (!isEnabled && settingType !== 'imageVisibility') {
275
291
  return;
276
292
  }
277
293
 
@@ -14,7 +14,7 @@
14
14
 
15
15
  /* Применяем стили ко всем элементам, включая панель доступности */
16
16
  * {
17
- background: #000 !important;
17
+ background: none !important;
18
18
  color: #fff !important;
19
19
  border-color: #fff !important;
20
20
  }
@@ -54,7 +54,4 @@
54
54
  /* Размеры шрифтов */
55
55
  /* Стили для размера шрифта применяются динамически через JavaScript */
56
56
 
57
- /* Скрытие изображений */
58
- .accessibility-hide-images {
59
- display: none !important;
60
- }
57
+ /* Скрытие изображений - теперь используется inline стиль visibility */
@@ -43,7 +43,9 @@ export interface AccessibilityPanelProps {
43
43
  /** Обработчик закрытия панели */
44
44
  onClose: () => void;
45
45
  /** Позиция панели относительно кнопки */
46
- position?: 'top-right' | 'top-left' | 'bottom-left' | 'bottom-right';
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
  */