vision-accessibility 1.0.0 → 1.0.2

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 (29) hide show
  1. package/dist/components/AccessibilityPanel/AccessibilityPanel.d.ts.map +1 -1
  2. package/dist/index.esm.js +263 -74
  3. package/dist/index.esm.js.map +1 -1
  4. package/dist/index.umd.js +7 -2
  5. package/dist/index.umd.js.map +1 -1
  6. package/dist/lib/css-applier.d.ts +9 -1
  7. package/dist/lib/css-applier.d.ts.map +1 -1
  8. package/dist/style.css +1 -1
  9. package/dist/types/index.d.ts +1 -1
  10. package/dist/types/index.d.ts.map +1 -1
  11. package/package.json +21 -13
  12. package/src/components/AccessibilityPanel/AccessibilityPanel.module.scss +32 -14
  13. package/src/components/AccessibilityPanel/AccessibilityPanel.stories.tsx +105 -0
  14. package/src/components/AccessibilityPanel/AccessibilityPanel.tsx +29 -19
  15. package/src/components/AccessibilityToggle/AccessibilityToggle.module.scss +1 -1
  16. package/src/components/AccessibilityToggle/AccessibilityToggle.stories.tsx +34 -0
  17. package/src/components/AccessibilityToggle/AccessibilityToggle.tsx +1 -1
  18. package/src/components/ColorSchemeControl/ColorSchemeControl.module.scss +1 -1
  19. package/src/components/ColorSchemeControl/ColorSchemeControl.stories.tsx +34 -0
  20. package/src/components/ColorSchemeControl/ColorSchemeControl.tsx +1 -1
  21. package/src/components/FontSizeControl/FontSizeControl.module.scss +1 -1
  22. package/src/components/FontSizeControl/FontSizeControl.stories.tsx +34 -0
  23. package/src/components/FontSizeControl/FontSizeControl.tsx +1 -1
  24. package/src/components/ImageControl/ImageControl.module.scss +1 -1
  25. package/src/components/ImageControl/ImageControl.stories.tsx +43 -0
  26. package/src/components/ImageControl/ImageControl.tsx +1 -1
  27. package/src/lib/css-applier.ts +127 -4
  28. package/src/styles/global.scss +8 -8
  29. package/src/types/index.ts +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.js","sources":["../src/types/index.ts","../src/lib/accessibility-storage.ts","../src/lib/dom-manipulator.ts","../src/lib/font-size-manager.ts","../src/lib/css-applier.ts","../src/hooks/useAccessibilitySettings.ts","../node_modules/react/jsx-runtime.js","../node_modules/react/cjs/react-jsx-runtime.production.js","../node_modules/react/cjs/react-jsx-runtime.development.js","../src/context/AccessibilityContext.tsx","../src/components/AccessibilityToggle/AccessibilityToggle.tsx","../src/components/ColorSchemeControl/ColorSchemeControl.tsx","../src/components/FontSizeControl/FontSizeControl.tsx","../src/components/ImageControl/ImageControl.tsx","../src/components/AccessibilityPanel/AccessibilityPanel.tsx"],"sourcesContent":["/**\n * Типы для панели доступности\n * Определяет интерфейсы и типы для настроек доступности\n */\n\nexport type ColorScheme = 'standard' | 'high-contrast' | 'grayscale';\nexport type FontSize = 'small' | 'standard' | 'large';\n\n/**\n * Интерфейс настроек доступности\n */\nexport interface AccessibilitySettings {\n /** Включен ли режим доступности */\n isEnabled: boolean;\n /** Цветовая схема */\n colorScheme: ColorScheme;\n /** Размер шрифта */\n fontSize: FontSize;\n /** Показывать ли изображения */\n showImages: boolean;\n}\n\n/**\n * Контекст для управления настройками доступности\n */\nexport interface AccessibilityContextType {\n /** Текущие настройки */\n settings: AccessibilitySettings;\n /** Обновление настроек */\n updateSettings: (updates: Partial<AccessibilitySettings>) => void;\n /** Сброс настроек к значениям по умолчанию */\n resetSettings: () => void;\n /** Загружены ли настройки из localStorage */\n isLoaded: boolean;\n}\n\n/**\n * Свойства основного компонента панели доступности\n */\nexport interface AccessibilityPanelProps {\n /** Открыта ли панель */\n isOpen: boolean;\n /** Обработчик закрытия панели */\n onClose: () => void;\n /** Позиция панели относительно кнопки */\n position?: 'top-right' | 'top-left';\n}\n\n/**\n * Свойства компонентов управления настройками\n */\nexport interface ControlComponentProps {\n /** Текущие настройки */\n settings: AccessibilitySettings;\n /** Обработчик обновления настроек */\n onUpdate: (updates: Partial<AccessibilitySettings>) => void;\n}\n\n/**\n * Настройки по умолчанию\n */\nexport const DEFAULT_ACCESSIBILITY_SETTINGS: AccessibilitySettings = {\n isEnabled: false,\n colorScheme: 'standard',\n fontSize: 'standard',\n showImages: true,\n};\n\n/**\n * Ключ для сохранения в localStorage\n */\nexport const STORAGE_KEY = 'accessibility-settings';","/**\n * Модуль для работы с localStorage\n * Обеспечивает сохранение, загрузку и валидацию настроек доступности\n */\n\nimport { AccessibilitySettings, DEFAULT_ACCESSIBILITY_SETTINGS, STORAGE_KEY } from '../types';\n\n/**\n * Сохранение настроек в localStorage\n */\nexport const saveToStorage = (settings: AccessibilitySettings): void => {\n try {\n if (typeof window === 'undefined') return;\n localStorage.setItem(STORAGE_KEY, JSON.stringify(settings));\n } catch (error) {\n console.warn('Не удалось сохранить настройки доступности:', error);\n }\n};\n\n/**\n * Загрузка настроек из localStorage\n */\nexport const loadFromStorage = (): AccessibilitySettings | null => {\n try {\n if (typeof window === 'undefined') return null;\n const saved = localStorage.getItem(STORAGE_KEY);\n return saved ? validateSettings(JSON.parse(saved)) : null;\n } catch (error) {\n console.warn('Не удалось загрузить настройки доступности:', error);\n return null;\n }\n};\n\n/**\n * Очистка настроек из localStorage\n */\nexport const clearStorage = (): void => {\n try {\n if (typeof window === 'undefined') return;\n localStorage.removeItem(STORAGE_KEY);\n } catch (error) {\n console.warn('Не удалось очистить настройки доступности:', error);\n }\n};\n\n/**\n * Валидация настроек из localStorage\n */\nexport const validateSettings = (settings: unknown): AccessibilitySettings => {\n if (!settings || typeof settings !== 'object') {\n return DEFAULT_ACCESSIBILITY_SETTINGS;\n }\n\n const s = settings as Partial<AccessibilitySettings>;\n \n return {\n isEnabled: typeof s.isEnabled === 'boolean' ? s.isEnabled : DEFAULT_ACCESSIBILITY_SETTINGS.isEnabled,\n colorScheme: ['standard', 'high-contrast', 'grayscale'].includes(s.colorScheme as string) \n ? s.colorScheme as AccessibilitySettings['colorScheme']\n : DEFAULT_ACCESSIBILITY_SETTINGS.colorScheme,\n fontSize: ['small', 'standard', 'large'].includes(s.fontSize as string)\n ? s.fontSize as AccessibilitySettings['fontSize']\n : DEFAULT_ACCESSIBILITY_SETTINGS.fontSize,\n showImages: typeof s.showImages === 'boolean' ? s.showImages : DEFAULT_ACCESSIBILITY_SETTINGS.showImages\n };\n};\n\n/**\n * Безопасное выполнение операций с localStorage\n */\nexport const safeLocalStorageOperation = <T>(\n operation: () => T,\n fallback: T,\n errorMessage: string\n): T => {\n try {\n return operation();\n } catch (error) {\n console.warn(errorMessage, error);\n return fallback;\n }\n};","/**\n * Модуль для работы с DOM элементами\n * Предоставляет функции для поиска и манипуляции элементами страницы\n */\n\n/**\n * Селектор для поиска всех текстовых элементов\n */\nconst TEXT_ELEMENTS_SELECTOR = 'h1, h2, h3, h4, h5, h6, p, span, a, button, label, li';\n\n/**\n * Селектор для поиска всех изображений\n */\nconst IMAGE_ELEMENTS_SELECTOR = 'img, picture, svg[role=\"img\"]';\n\n/**\n * Поиск всех текстовых элементов на странице\n */\nexport const getTextElements = (): NodeListOf<HTMLElement> => {\n if (typeof document === 'undefined') {\n return [] as unknown as NodeListOf<HTMLElement>;\n }\n return document.querySelectorAll(TEXT_ELEMENTS_SELECTOR);\n};\n\n/**\n * Поиск всех изображений на странице\n */\nexport const getImageElements = (): NodeListOf<HTMLElement> => {\n if (typeof document === 'undefined') {\n return [] as unknown as NodeListOf<HTMLElement>;\n }\n return document.querySelectorAll(IMAGE_ELEMENTS_SELECTOR);\n};\n\n/**\n * Применение CSS класса к коллекции элементов\n */\nexport const applyClassToElements = (elements: NodeListOf<HTMLElement>, className: string): void => {\n elements.forEach(element => {\n if (element && element.classList) {\n element.classList.add(className);\n }\n });\n};\n\n/**\n * Удаление CSS класса с коллекции элементов\n */\nexport const removeClassFromElements = (elements: NodeListOf<HTMLElement>, className: string): void => {\n elements.forEach(element => {\n if (element && element.classList) {\n element.classList.remove(className);\n }\n });\n};\n\n/**\n * Безопасное выполнение операций с DOM\n */\nexport const safeDOMOperation = (operation: () => void, errorMessage: string): void => {\n try {\n if (typeof window === 'undefined') return;\n operation();\n } catch (error) {\n console.warn(errorMessage, error);\n }\n};\n\n/**\n * Проверка доступности DOM\n */\nexport const isDOMAvailable = (): boolean => {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n};","/**\n * Модуль для динамического управления размером шрифта\n * Получает текущий размер каждого элемента и применяет процентное изменение\n */\n\nimport { FontSize } from '../types';\nimport { getTextElements, safeDOMOperation, isDOMAvailable } from './dom-manipulator';\n\n/**\n * Атрибут для хранения оригинального размера шрифта\n */\nconst ORIGINAL_FONT_SIZE_ATTR = 'data-original-font-size';\n\n/**\n * Коэффициенты изменения размера шрифта\n */\nconst FONT_SIZE_MULTIPLIERS = {\n small: 0.8, // 80% от оригинального размера\n standard: 1.0, // 100% - оригинальный размер\n large: 1.3, // 130% от оригинального размера\n} as const;\n\n/**\n * Получение вычисленного размера шрифта элемента в пикселях\n * \n * @param element - DOM элемент\n * @returns Размер шрифта в пикселях\n */\nconst getComputedFontSize = (element: HTMLElement): number => {\n const computedStyle = window.getComputedStyle(element);\n const fontSize = computedStyle.fontSize;\n return parseFloat(fontSize);\n};\n\n/**\n * Сохранение оригинального размера шрифта элемента\n * \n * @param element - DOM элемент\n */\nconst saveOriginalFontSize = (element: HTMLElement): void => {\n // Сохраняем оригинальный размер только если он еще не сохранен\n if (!element.hasAttribute(ORIGINAL_FONT_SIZE_ATTR)) {\n const originalSize = getComputedFontSize(element);\n element.setAttribute(ORIGINAL_FONT_SIZE_ATTR, originalSize.toString());\n }\n};\n\n/**\n * Получение оригинального размера шрифта элемента\n * \n * @param element - DOM элемент\n * @returns Оригинальный размер шрифта в пикселях\n */\nconst getOriginalFontSize = (element: HTMLElement): number => {\n const savedSize = element.getAttribute(ORIGINAL_FONT_SIZE_ATTR);\n if (savedSize) {\n return parseFloat(savedSize);\n }\n \n // Если оригинальный размер не сохранен, используем текущий\n const currentSize = getComputedFontSize(element);\n element.setAttribute(ORIGINAL_FONT_SIZE_ATTR, currentSize.toString());\n return currentSize;\n};\n\n/**\n * Применение нового размера шрифта к элементу\n * \n * @param element - DOM элемент\n * @param newSize - Новый размер шрифта в пикселях\n */\nconst applyFontSizeToElement = (element: HTMLElement, newSize: number): void => {\n element.style.fontSize = `${newSize}px`;\n};\n\n/**\n * Сброс размера шрифта элемента к оригинальному\n * \n * @param element - DOM элемент\n */\nconst resetElementFontSize = (element: HTMLElement): void => {\n element.style.fontSize = '';\n element.removeAttribute(ORIGINAL_FONT_SIZE_ATTR);\n};\n\n/**\n * Применение размера шрифта ко всем текстовым элементам\n * \n * @param size - Размер шрифта (small, standard, large)\n */\nexport const applyDynamicFontSize = (size: FontSize): void => {\n safeDOMOperation(() => {\n if (!isDOMAvailable()) return;\n\n const elements = getTextElements();\n const multiplier = FONT_SIZE_MULTIPLIERS[size];\n\n elements.forEach((element) => {\n try {\n if (size === 'standard') {\n // Для стандартного размера сбрасываем к оригинальному\n resetElementFontSize(element);\n } else {\n // Сохраняем оригинальный размер, если еще не сохранен\n saveOriginalFontSize(element);\n \n // Получаем оригинальный размер и применяем множитель\n const originalSize = getOriginalFontSize(element);\n const newSize = originalSize * multiplier;\n \n applyFontSizeToElement(element, newSize);\n }\n } catch (error) {\n console.warn('Ошибка при изменении размера шрифта элемента:', element, error);\n }\n });\n }, `Ошибка при применении динамического размера шрифта: ${size}`);\n};\n\n/**\n * Сброс всех изменений размера шрифта\n */\nexport const resetAllFontSizes = (): void => {\n safeDOMOperation(() => {\n if (!isDOMAvailable()) return;\n\n const elements = getTextElements();\n \n elements.forEach((element) => {\n try {\n resetElementFontSize(element);\n } catch (error) {\n console.warn('Ошибка при сбросе размера шрифта элемента:', element, error);\n }\n });\n }, 'Ошибка при сбросе всех размеров шрифта');\n};\n\n/**\n * Обновление размеров шрифта для новых элементов\n * Используется когда на страницу добавляются новые элементы динамически\n * \n * @param size - Текущий размер шрифта\n */\nexport const updateNewElementsFontSize = (size: FontSize): void => {\n if (size === 'standard') return;\n \n safeDOMOperation(() => {\n if (!isDOMAvailable()) return;\n\n const elements = getTextElements();\n const multiplier = FONT_SIZE_MULTIPLIERS[size];\n\n elements.forEach((element) => {\n // Применяем размер только к элементам, которые еще не обработаны\n if (!element.hasAttribute(ORIGINAL_FONT_SIZE_ATTR) && !element.style.fontSize) {\n try {\n saveOriginalFontSize(element);\n const originalSize = getOriginalFontSize(element);\n const newSize = originalSize * multiplier;\n applyFontSizeToElement(element, newSize);\n } catch (error) {\n console.warn('Ошибка при обновлении размера шрифта нового элемента:', element, error);\n }\n }\n });\n }, `Ошибка при обновлении размера шрифта новых элементов: ${size}`);\n};\n\n/**\n * Проверка, применены ли изменения размера шрифта\n * \n * @returns true, если размер шрифта изменен\n */\nexport const isFontSizeModified = (): boolean => {\n if (!isDOMAvailable()) return false;\n \n const elements = getTextElements();\n for (let i = 0; i < Math.min(elements.length, 10); i++) {\n if (elements[i].hasAttribute(ORIGINAL_FONT_SIZE_ATTR)) {\n return true;\n }\n }\n return false;\n};","/**\n * Модуль для применения CSS стилей доступности\n * Содержит функции для применения различных настроек доступности к DOM\n * \n * Реализует требования:\n * - 2.1, 2.2, 2.3: Настройка цветовой схемы\n * - 3.1, 3.2, 3.3: Настройка размера шрифта \n * - 4.1, 4.2: Управление отображением изображений\n */\n\nimport { ColorScheme, FontSize, AccessibilitySettings } from '../types';\nimport { \n getImageElements, \n applyClassToElements, \n removeClassFromElements,\n safeDOMOperation,\n isDOMAvailable\n} from './dom-manipulator';\nimport { \n applyDynamicFontSize, \n resetAllFontSizes\n} from './font-size-manager';\n\n/**\n * CSS классы для различных настроек доступности\n */\nexport const CSS_CLASSES = {\n HIGH_CONTRAST: 'accessibility-high-contrast',\n FONT_SMALL: 'accessibility-font-small',\n FONT_LARGE: 'accessibility-font-large',\n HIDE_IMAGES: 'accessibility-hide-images',\n} as const;\n\n/**\n * Применение цветовой схемы\n * Реализует требования 2.1, 2.2, 2.3:\n * - high-contrast: Контрастный белый на черном\n * - grayscale: Черно-белый режим\n * - standard: Стандартное оформление\n */\nexport const applyColorScheme = (scheme: ColorScheme): void => {\n safeDOMOperation(() => {\n if (!isDOMAvailable()) return;\n\n // Удаляем существующие классы и стили\n document.body.classList.remove(CSS_CLASSES.HIGH_CONTRAST);\n document.body.style.filter = '';\n \n switch (scheme) {\n case 'high-contrast':\n // Требование 2.1: Контрастный белый на черном\n document.body.classList.add(CSS_CLASSES.HIGH_CONTRAST);\n break;\n case 'grayscale':\n // Требование 2.2: Черно-белый режим через CSS фильтр\n document.body.style.filter = 'grayscale(100%)';\n break;\n case 'standard':\n // Требование 2.3: Стандартное оформление (стили уже удалены выше)\n break;\n default:\n console.warn(`Неизвестная цветовая схема: ${scheme}`);\n break;\n }\n }, `Ошибка при применении цветовой схемы: ${scheme}`);\n};\n\n/**\n * Применение настроек размера шрифта\n * Реализует требования 3.1, 3.2, 3.3:\n * - small: Уменьшение размера на 10% от текущего размера каждого элемента\n * - large: Увеличение размера на 10% от текущего размера каждого элемента\n * - standard: Восстановление оригинального размера шрифта\n */\nexport const applyFontSize = (size: FontSize): void => {\n // Используем новый модуль для динамического управления размером шрифта\n applyDynamicFontSize(size);\n};\n\n/**\n * Управление отображением изображений\n * Реализует требования 4.1, 4.2:\n * - false: Скрывать изображения через CSS свойство hidden\n * - true: Показывать изображения (восстановление видимости)\n * Требование 4.3: Сохраняет возможность восстановления без перезагрузки\n */\nexport const applyImageVisibility = (showImages: boolean): void => {\n safeDOMOperation(() => {\n if (!isDOMAvailable()) return;\n\n const elements = getImageElements();\n \n if (showImages) {\n // Требование 4.2: Показывать изображения (восстановление видимости)\n removeClassFromElements(elements, CSS_CLASSES.HIDE_IMAGES);\n } else {\n // Требование 4.1: Скрывать изображения через CSS класс\n applyClassToElements(elements, CSS_CLASSES.HIDE_IMAGES);\n }\n }, `Ошибка при управлении отображением изображений: ${showImages}`);\n};\n\n/**\n * Удаление всех CSS классов и стилей доступности\n */\nexport const removeAllAccessibilityStyles = (): void => {\n safeDOMOperation(() => {\n if (!isDOMAvailable()) return;\n\n // Удаляем классы с body\n document.body.classList.remove(CSS_CLASSES.HIGH_CONTRAST);\n document.body.classList.remove(CSS_CLASSES.FONT_SMALL);\n document.body.classList.remove(CSS_CLASSES.FONT_LARGE);\n document.body.style.filter = '';\n \n // Сбрасываем все изменения размера шрифта\n resetAllFontSizes();\n \n // Удаляем классы с изображений\n const imageElements = getImageElements();\n removeClassFromElements(imageElements, CSS_CLASSES.HIDE_IMAGES);\n }, 'Ошибка при удалении всех стилей доступности');\n};\n\n/**\n * Применение всех настроек доступности\n * Применяет все переданные настройки одновременно\n */\nexport const applyAllSettings = (settings: AccessibilitySettings): void => {\n if (!settings.isEnabled) {\n // Если режим доступности выключен, удаляем все стили\n removeAllAccessibilityStyles();\n return;\n }\n\n // Применяем все настройки\n applyColorScheme(settings.colorScheme);\n applyFontSize(settings.fontSize);\n applyImageVisibility(settings.showImages);\n};\n\n/**\n * Применение конкретной настройки с проверкой общего режима\n * Применяет настройку только если общий режим доступности включен\n */\nexport const applySettingIfEnabled = (\n isEnabled: boolean,\n settingType: 'colorScheme' | 'fontSize' | 'imageVisibility',\n value: ColorScheme | FontSize | boolean\n): void => {\n if (!isEnabled) {\n return;\n }\n\n switch (settingType) {\n case 'colorScheme':\n applyColorScheme(value as ColorScheme);\n break;\n case 'fontSize':\n applyFontSize(value as FontSize);\n break;\n case 'imageVisibility':\n applyImageVisibility(value as boolean);\n break;\n default:\n console.warn(`Неизвестный тип настройки: ${settingType}`);\n }\n};","/**\n * Хук для управления настройками доступности\n * Обеспечивает централизованное управление состоянием настроек доступности\n * с автоматическим сохранением в localStorage и применением к DOM\n * \n * Реализует требования:\n * - 5.1: Включение режима доступности с активацией всех сохраненных настроек\n * - 5.2: Выключение режима доступности с удалением всех CSS классов и стилей\n * - 6.2: Загрузка настроек из localStorage при инициализации\n * - 6.3: Автоматическое применение сохраненных настроек при загрузке страницы\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { \n AccessibilitySettings, \n DEFAULT_ACCESSIBILITY_SETTINGS,\n AccessibilityContextType \n} from '../types';\nimport { \n saveToStorage, \n loadFromStorage, \n clearStorage \n} from '../lib/accessibility-storage';\nimport { \n applyAllSettings, \n removeAllAccessibilityStyles \n} from '../lib/css-applier';\nimport { updateNewElementsFontSize } from '../lib/font-size-manager';\n\n/**\n * Хук для управления настройками доступности\n * \n * @returns Объект с текущими настройками и методами для их управления\n */\nexport const useAccessibilitySettings = (): AccessibilityContextType => {\n // Состояние настроек доступности\n const [settings, setSettings] = useState<AccessibilitySettings>(DEFAULT_ACCESSIBILITY_SETTINGS);\n \n // Флаг загрузки настроек из localStorage (для SSR совместимости)\n const [isLoaded, setIsLoaded] = useState(false);\n\n /**\n * Наблюдатель за изменениями DOM для обработки динамически добавляемых элементов\n */\n useEffect(() => {\n if (typeof window === 'undefined' || !isLoaded || !settings.isEnabled) return;\n\n const observer = new MutationObserver((mutations) => {\n let hasNewTextElements = false;\n \n mutations.forEach((mutation) => {\n if (mutation.type === 'childList') {\n mutation.addedNodes.forEach((node) => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as Element;\n // Проверяем, есть ли текстовые элементы среди добавленных\n if (element.matches('h1, h2, h3, h4, h5, h6, p, span, a, button, label, li, div') ||\n element.querySelector('h1, h2, h3, h4, h5, h6, p, span, a, button, label, li, div')) {\n hasNewTextElements = true;\n }\n }\n });\n }\n });\n\n // Если добавлены новые текстовые элементы, применяем к ним текущие настройки размера шрифта\n if (hasNewTextElements && settings.fontSize !== 'standard') {\n setTimeout(() => {\n updateNewElementsFontSize(settings.fontSize);\n }, 100); // Небольшая задержка для завершения рендеринга\n }\n });\n\n observer.observe(document.body, {\n childList: true,\n subtree: true\n });\n\n return () => {\n observer.disconnect();\n };\n }, [isLoaded, settings.isEnabled, settings.fontSize]);\n\n /**\n * Загрузка настроек из localStorage при инициализации\n * Реализует требования 6.2, 6.3: Восстановление сохраненных настроек\n * Обеспечивает SSR совместимость с проверкой window\n */\n useEffect(() => {\n // SSR совместимость: выполняем только на клиенте\n if (typeof window === 'undefined') {\n return;\n }\n\n try {\n // Требование 6.2: Загрузка настроек из localStorage\n const savedSettings = loadFromStorage();\n \n if (savedSettings) {\n setSettings(savedSettings);\n \n // Требование 6.3: Автоматическое применение сохраненных настроек\n // Применяем настройки только если режим доступности включен\n if (savedSettings.isEnabled) {\n applyAllSettings(savedSettings);\n }\n }\n } catch (error) {\n console.warn('Ошибка при загрузке настроек доступности:', error);\n // При ошибке используем настройки по умолчанию\n setSettings(DEFAULT_ACCESSIBILITY_SETTINGS);\n } finally {\n // Отмечаем, что настройки загружены\n setIsLoaded(true);\n }\n }, []);\n\n /**\n * Сохранение настроек в localStorage при изменении\n * Реализует автоматическое сохранение всех изменений настроек\n */\n useEffect(() => {\n // Сохраняем только после первоначальной загрузки\n if (!isLoaded) {\n return;\n }\n\n try {\n // Сохраняем настройки в localStorage\n saveToStorage(settings);\n \n // Применяем настройки к DOM только если режим доступности включен\n if (settings.isEnabled) {\n applyAllSettings(settings);\n } else {\n // Если режим выключен, удаляем все стили доступности\n removeAllAccessibilityStyles();\n }\n } catch (error) {\n console.warn('Ошибка при сохранении настроек доступности:', error);\n }\n }, [settings, isLoaded]);\n\n /**\n * Обновление настроек доступности\n * Позволяет частично обновить настройки, сохраняя остальные значения\n * \n * @param updates - Частичные обновления настроек\n */\n const updateSettings = useCallback((updates: Partial<AccessibilitySettings>): void => {\n setSettings(prevSettings => {\n const newSettings = { ...prevSettings, ...updates };\n \n // Если выключается общий режим доступности, удаляем все стили немедленно\n if (prevSettings.isEnabled && !newSettings.isEnabled) {\n // Требование 5.2: Выключение режима доступности с удалением всех стилей\n removeAllAccessibilityStyles();\n }\n \n return newSettings;\n });\n }, []);\n\n /**\n * Сброс настроек к значениям по умолчанию\n * Удаляет все примененные стили и очищает localStorage\n */\n const resetSettings = useCallback((): void => {\n try {\n // Удаляем все примененные стили доступности\n removeAllAccessibilityStyles();\n \n // Сбрасываем настройки к значениям по умолчанию\n setSettings(DEFAULT_ACCESSIBILITY_SETTINGS);\n \n // Очищаем localStorage\n clearStorage();\n } catch (error) {\n console.warn('Ошибка при сбросе настроек доступности:', error);\n }\n }, []);\n\n return {\n settings,\n updateSettings,\n resetSettings,\n isLoaded,\n };\n};\n\n/**\n * Хук для управления конкретной настройкой доступности\n * Предоставляет удобный интерфейс для работы с отдельными настройками\n * \n * @param settingKey - Ключ настройки для управления\n * @returns Значение настройки и функция для её обновления\n */\nexport const useAccessibilitySetting = <K extends keyof AccessibilitySettings>(\n settingKey: K\n): [AccessibilitySettings[K], (value: AccessibilitySettings[K]) => void] => {\n const { settings, updateSettings } = useAccessibilitySettings();\n \n const setValue = useCallback((value: AccessibilitySettings[K]) => {\n updateSettings({ [settingKey]: value } as Partial<AccessibilitySettings>);\n }, [settingKey, updateSettings]);\n \n return [settings[settingKey], setValue];\n};\n\n/**\n * Хук для управления общим режимом доступности\n * Предоставляет удобный интерфейс для включения/выключения всех настроек\n * \n * @returns Состояние режима доступности и функция для его переключения\n */\nexport const useAccessibilityToggle = (): [boolean, (enabled: boolean) => void] => {\n const { settings, updateSettings } = useAccessibilitySettings();\n \n const setEnabled = useCallback((enabled: boolean) => {\n // Требование 5.1: Включение режима доступности с активацией всех настроек\n // Требование 5.2: Выключение режима доступности с удалением всех стилей\n updateSettings({ isEnabled: enabled });\n }, [updateSettings]);\n \n return [settings.isEnabled, setEnabled];\n};\n\nexport default useAccessibilitySettings;","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n var key = null;\n void 0 !== maybeKey && (key = \"\" + maybeKey);\n void 0 !== config.key && (key = \"\" + config.key);\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n config = maybeKey.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n ref: void 0 !== config ? config : null,\n props: maybeKey\n };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","/**\n * @license React\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function getComponentNameFromType(type) {\n if (null == type) return null;\n if (\"function\" === typeof type)\n return type.$$typeof === REACT_CLIENT_REFERENCE\n ? null\n : type.displayName || type.name || null;\n if (\"string\" === typeof type) return type;\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return \"Fragment\";\n case REACT_PROFILER_TYPE:\n return \"Profiler\";\n case REACT_STRICT_MODE_TYPE:\n return \"StrictMode\";\n case REACT_SUSPENSE_TYPE:\n return \"Suspense\";\n case REACT_SUSPENSE_LIST_TYPE:\n return \"SuspenseList\";\n case REACT_ACTIVITY_TYPE:\n return \"Activity\";\n }\n if (\"object\" === typeof type)\n switch (\n (\"number\" === typeof type.tag &&\n console.error(\n \"Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue.\"\n ),\n type.$$typeof)\n ) {\n case REACT_PORTAL_TYPE:\n return \"Portal\";\n case REACT_CONTEXT_TYPE:\n return type.displayName || \"Context\";\n case REACT_CONSUMER_TYPE:\n return (type._context.displayName || \"Context\") + \".Consumer\";\n case REACT_FORWARD_REF_TYPE:\n var innerType = type.render;\n type = type.displayName;\n type ||\n ((type = innerType.displayName || innerType.name || \"\"),\n (type = \"\" !== type ? \"ForwardRef(\" + type + \")\" : \"ForwardRef\"));\n return type;\n case REACT_MEMO_TYPE:\n return (\n (innerType = type.displayName || null),\n null !== innerType\n ? innerType\n : getComponentNameFromType(type.type) || \"Memo\"\n );\n case REACT_LAZY_TYPE:\n innerType = type._payload;\n type = type._init;\n try {\n return getComponentNameFromType(type(innerType));\n } catch (x) {}\n }\n return null;\n }\n function testStringCoercion(value) {\n return \"\" + value;\n }\n function checkKeyStringCoercion(value) {\n try {\n testStringCoercion(value);\n var JSCompiler_inline_result = !1;\n } catch (e) {\n JSCompiler_inline_result = !0;\n }\n if (JSCompiler_inline_result) {\n JSCompiler_inline_result = console;\n var JSCompiler_temp_const = JSCompiler_inline_result.error;\n var JSCompiler_inline_result$jscomp$0 =\n (\"function\" === typeof Symbol &&\n Symbol.toStringTag &&\n value[Symbol.toStringTag]) ||\n value.constructor.name ||\n \"Object\";\n JSCompiler_temp_const.call(\n JSCompiler_inline_result,\n \"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.\",\n JSCompiler_inline_result$jscomp$0\n );\n return testStringCoercion(value);\n }\n }\n function getTaskName(type) {\n if (type === REACT_FRAGMENT_TYPE) return \"<>\";\n if (\n \"object\" === typeof type &&\n null !== type &&\n type.$$typeof === REACT_LAZY_TYPE\n )\n return \"<...>\";\n try {\n var name = getComponentNameFromType(type);\n return name ? \"<\" + name + \">\" : \"<...>\";\n } catch (x) {\n return \"<...>\";\n }\n }\n function getOwner() {\n var dispatcher = ReactSharedInternals.A;\n return null === dispatcher ? null : dispatcher.getOwner();\n }\n function UnknownOwner() {\n return Error(\"react-stack-top-frame\");\n }\n function hasValidKey(config) {\n if (hasOwnProperty.call(config, \"key\")) {\n var getter = Object.getOwnPropertyDescriptor(config, \"key\").get;\n if (getter && getter.isReactWarning) return !1;\n }\n return void 0 !== config.key;\n }\n function defineKeyPropWarningGetter(props, displayName) {\n function warnAboutAccessingKey() {\n specialPropKeyWarningShown ||\n ((specialPropKeyWarningShown = !0),\n console.error(\n \"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)\",\n displayName\n ));\n }\n warnAboutAccessingKey.isReactWarning = !0;\n Object.defineProperty(props, \"key\", {\n get: warnAboutAccessingKey,\n configurable: !0\n });\n }\n function elementRefGetterWithDeprecationWarning() {\n var componentName = getComponentNameFromType(this.type);\n didWarnAboutElementRef[componentName] ||\n ((didWarnAboutElementRef[componentName] = !0),\n console.error(\n \"Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.\"\n ));\n componentName = this.props.ref;\n return void 0 !== componentName ? componentName : null;\n }\n function ReactElement(type, key, props, owner, debugStack, debugTask) {\n var refProp = props.ref;\n type = {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n props: props,\n _owner: owner\n };\n null !== (void 0 !== refProp ? refProp : null)\n ? Object.defineProperty(type, \"ref\", {\n enumerable: !1,\n get: elementRefGetterWithDeprecationWarning\n })\n : Object.defineProperty(type, \"ref\", { enumerable: !1, value: null });\n type._store = {};\n Object.defineProperty(type._store, \"validated\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: 0\n });\n Object.defineProperty(type, \"_debugInfo\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: null\n });\n Object.defineProperty(type, \"_debugStack\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugStack\n });\n Object.defineProperty(type, \"_debugTask\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugTask\n });\n Object.freeze && (Object.freeze(type.props), Object.freeze(type));\n return type;\n }\n function jsxDEVImpl(\n type,\n config,\n maybeKey,\n isStaticChildren,\n debugStack,\n debugTask\n ) {\n var children = config.children;\n if (void 0 !== children)\n if (isStaticChildren)\n if (isArrayImpl(children)) {\n for (\n isStaticChildren = 0;\n isStaticChildren < children.length;\n isStaticChildren++\n )\n validateChildKeys(children[isStaticChildren]);\n Object.freeze && Object.freeze(children);\n } else\n console.error(\n \"React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.\"\n );\n else validateChildKeys(children);\n if (hasOwnProperty.call(config, \"key\")) {\n children = getComponentNameFromType(type);\n var keys = Object.keys(config).filter(function (k) {\n return \"key\" !== k;\n });\n isStaticChildren =\n 0 < keys.length\n ? \"{key: someKey, \" + keys.join(\": ..., \") + \": ...}\"\n : \"{key: someKey}\";\n didWarnAboutKeySpread[children + isStaticChildren] ||\n ((keys =\n 0 < keys.length ? \"{\" + keys.join(\": ..., \") + \": ...}\" : \"{}\"),\n console.error(\n 'A props object containing a \"key\" prop is being spread into JSX:\\n let props = %s;\\n <%s {...props} />\\nReact keys must be passed directly to JSX without using spread:\\n let props = %s;\\n <%s key={someKey} {...props} />',\n isStaticChildren,\n children,\n keys,\n children\n ),\n (didWarnAboutKeySpread[children + isStaticChildren] = !0));\n }\n children = null;\n void 0 !== maybeKey &&\n (checkKeyStringCoercion(maybeKey), (children = \"\" + maybeKey));\n hasValidKey(config) &&\n (checkKeyStringCoercion(config.key), (children = \"\" + config.key));\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n children &&\n defineKeyPropWarningGetter(\n maybeKey,\n \"function\" === typeof type\n ? type.displayName || type.name || \"Unknown\"\n : type\n );\n return ReactElement(\n type,\n children,\n maybeKey,\n getOwner(),\n debugStack,\n debugTask\n );\n }\n function validateChildKeys(node) {\n isValidElement(node)\n ? node._store && (node._store.validated = 1)\n : \"object\" === typeof node &&\n null !== node &&\n node.$$typeof === REACT_LAZY_TYPE &&\n (\"fulfilled\" === node._payload.status\n ? isValidElement(node._payload.value) &&\n node._payload.value._store &&\n (node._payload.value._store.validated = 1)\n : node._store && (node._store.validated = 1));\n }\n function isValidElement(object) {\n return (\n \"object\" === typeof object &&\n null !== object &&\n object.$$typeof === REACT_ELEMENT_TYPE\n );\n }\n var React = require(\"react\"),\n REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_PORTAL_TYPE = Symbol.for(\"react.portal\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\"),\n REACT_STRICT_MODE_TYPE = Symbol.for(\"react.strict_mode\"),\n REACT_PROFILER_TYPE = Symbol.for(\"react.profiler\"),\n REACT_CONSUMER_TYPE = Symbol.for(\"react.consumer\"),\n REACT_CONTEXT_TYPE = Symbol.for(\"react.context\"),\n REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\"),\n REACT_SUSPENSE_TYPE = Symbol.for(\"react.suspense\"),\n REACT_SUSPENSE_LIST_TYPE = Symbol.for(\"react.suspense_list\"),\n REACT_MEMO_TYPE = Symbol.for(\"react.memo\"),\n REACT_LAZY_TYPE = Symbol.for(\"react.lazy\"),\n REACT_ACTIVITY_TYPE = Symbol.for(\"react.activity\"),\n REACT_CLIENT_REFERENCE = Symbol.for(\"react.client.reference\"),\n ReactSharedInternals =\n React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n hasOwnProperty = Object.prototype.hasOwnProperty,\n isArrayImpl = Array.isArray,\n createTask = console.createTask\n ? console.createTask\n : function () {\n return null;\n };\n React = {\n react_stack_bottom_frame: function (callStackForError) {\n return callStackForError();\n }\n };\n var specialPropKeyWarningShown;\n var didWarnAboutElementRef = {};\n var unknownOwnerDebugStack = React.react_stack_bottom_frame.bind(\n React,\n UnknownOwner\n )();\n var unknownOwnerDebugTask = createTask(getTaskName(UnknownOwner));\n var didWarnAboutKeySpread = {};\n exports.Fragment = REACT_FRAGMENT_TYPE;\n exports.jsx = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !1,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n exports.jsxs = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !0,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n })();\n","/**\n * Контекст для управления настройками доступности\n * Обеспечивает единое состояние для всех компонентов панели доступности\n */\n\nimport React, { createContext, useContext, ReactNode } from 'react';\nimport { AccessibilityContextType } from '../types';\nimport { useAccessibilitySettings } from '../hooks/useAccessibilitySettings';\n\n/**\n * Контекст настроек доступности\n */\nconst AccessibilityContext = createContext<AccessibilityContextType | null>(null);\n\n/**\n * Свойства провайдера контекста\n */\ninterface AccessibilityProviderProps {\n children: ReactNode;\n}\n\n/**\n * Провайдер контекста настроек доступности\n * \n * @param props - Свойства провайдера\n * @returns JSX элемент с провайдером контекста\n */\nexport const AccessibilityProvider: React.FC<AccessibilityProviderProps> = ({ children }) => {\n const accessibilityState = useAccessibilitySettings();\n\n return (\n <AccessibilityContext.Provider value={accessibilityState}>\n {children}\n </AccessibilityContext.Provider>\n );\n};\n\n/**\n * Хук для использования контекста настроек доступности\n * \n * @returns Контекст настроек доступности\n * @throws Ошибка, если хук используется вне провайдера\n */\nexport const useAccessibilityContext = (): AccessibilityContextType => {\n const context = useContext(AccessibilityContext);\n \n if (!context) {\n throw new Error('useAccessibilityContext должен использоваться внутри AccessibilityProvider');\n }\n \n return context;\n};\n\nexport default AccessibilityProvider;","/**\n * Компонент главного переключателя режима доступности\n * Предоставляет переключатель для включения/выключения всех настроек доступности\n * \n * Реализует требования:\n * - 5.1: Включение режима доступности с активацией всех сохраненных настроек\n * - 5.2: Выключение режима доступности с удалением всех CSS классов и стилей\n * - 5.3: Возврат страницы к исходному состоянию без настроек доступности\n */\n\nimport React from 'react';\nimport { useAccessibilityContext } from '../../context/AccessibilityContext';\nimport styles from './AccessibilityToggle.module.scss';\n\n/**\n * Свойства компонента AccessibilityToggle\n */\ninterface AccessibilityToggleProps {\n /** CSS класс для дополнительной стилизации */\n className?: string;\n}\n\n/**\n * Компонент главного переключателя режима доступности\n * \n * @param props - Свойства компонента\n * @returns JSX элемент с переключателем общего режима доступности\n */\nexport const AccessibilityToggle: React.FC<AccessibilityToggleProps> = ({ \n className \n}) => {\n // Используем контекст для получения состояния и методов управления\n const { settings, updateSettings } = useAccessibilityContext();\n const isEnabled = settings.isEnabled;\n\n /**\n * Обработчик изменения общего режима доступности\n * \n * @param event - Событие изменения чекбокса\n */\n const handleToggleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n updateSettings({ isEnabled: event.target.checked });\n };\n\n return (\n <div className={`${styles.accessibilityToggle} ${className || ''}`}>\n <div className={styles.toggleContainer}>\n <label className={styles.toggleLabel}>\n <input\n type=\"checkbox\"\n checked={isEnabled}\n onChange={handleToggleChange}\n className={styles.toggleInput}\n aria-describedby=\"accessibility-toggle-description\"\n />\n \n <span className={styles.toggleSlider} aria-hidden=\"true\">\n <span className={styles.toggleThumb} />\n </span>\n \n <div className={styles.toggleContent}>\n <span className={styles.toggleTitle}>\n Режим доступности\n </span>\n <span className={styles.toggleStatus}>\n {isEnabled ? 'Включен' : 'Выключен'}\n </span>\n </div>\n </label>\n \n <p \n id=\"accessibility-toggle-description\"\n className={styles.description}\n >\n {isEnabled \n ? 'Все настройки доступности активны. Используйте элементы управления ниже для точной настройки.' \n : 'Включите режим доступности для активации всех настроек. При выключении все изменения будут сброшены.'\n }\n </p>\n </div>\n </div>\n );\n};\n\nexport default AccessibilityToggle;","/**\n * Компонент управления цветовой схемой\n * Предоставляет радио-кнопки для выбора цветовой схемы доступности\n * \n * Реализует требования:\n * - 2.1: Применение высококонтрастной цветовой схемы\n * - 2.2: Применение черно-белой цветовой схемы\n * - 2.3: Возврат к стандартной цветовой схеме\n */\n\nimport React from 'react';\nimport { ColorScheme } from '../../types';\nimport { useAccessibilityContext } from '../../context/AccessibilityContext';\nimport styles from './ColorSchemeControl.module.scss';\n\n/**\n * Свойства компонента ColorSchemeControl\n */\ninterface ColorSchemeControlProps {\n /** CSS класс для дополнительной стилизации */\n className?: string;\n}\n\n/**\n * Опции цветовых схем с описаниями\n */\nconst COLOR_SCHEME_OPTIONS: Array<{\n value: ColorScheme;\n label: string;\n description: string;\n}> = [\n {\n value: 'standard',\n label: 'Стандартный',\n description: 'Обычная цветовая схема сайта'\n },\n {\n value: 'high-contrast',\n label: 'Контрастный белый на черном',\n description: 'Высококонтрастная схема для лучшей читаемости'\n },\n {\n value: 'grayscale',\n label: 'Черно-белый',\n description: 'Преобразование всех цветов в оттенки серого'\n }\n];\n\n/**\n * Компонент управления цветовой схемой\n * \n * @param props - Свойства компонента\n * @returns JSX элемент с радио-кнопками для выбора цветовой схемы\n */\nexport const ColorSchemeControl: React.FC<ColorSchemeControlProps> = ({ \n className \n}) => {\n // Используем контекст для получения состояния и методов управления\n const { settings, updateSettings } = useAccessibilityContext();\n const colorScheme = settings.colorScheme;\n const isEnabled = settings.isEnabled;\n\n /**\n * Обработчик изменения цветовой схемы\n * \n * @param event - Событие изменения радио-кнопки\n */\n const handleColorSchemeChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const newColorScheme = event.target.value as ColorScheme;\n updateSettings({ colorScheme: newColorScheme });\n };\n\n return (\n <div className={`${styles.colorSchemeControl} ${className || ''} ${!isEnabled ? styles.disabled : ''}`}>\n <h4 className={styles.title}>\n Цветовая схема\n </h4>\n \n <div className={styles.optionsContainer} role=\"radiogroup\" aria-labelledby=\"color-scheme-title\">\n {COLOR_SCHEME_OPTIONS.map((option) => (\n <label \n key={option.value}\n className={`${styles.option} ${colorScheme === option.value ? styles.selected : ''} ${!isEnabled ? styles.optionDisabled : ''}`}\n >\n <input\n type=\"radio\"\n name=\"colorScheme\"\n value={option.value}\n checked={colorScheme === option.value}\n onChange={handleColorSchemeChange}\n className={styles.radioInput}\n aria-describedby={`color-scheme-${option.value}-description`}\n disabled={!isEnabled}\n />\n \n <div className={styles.optionContent}>\n <span className={styles.optionLabel}>\n {option.label}\n </span>\n <span \n id={`color-scheme-${option.value}-description`}\n className={styles.optionDescription}\n >\n {option.description}\n </span>\n </div>\n \n <div className={styles.radioIndicator} aria-hidden=\"true\" />\n </label>\n ))}\n </div>\n </div>\n );\n};\n\nexport default ColorSchemeControl;","/**\n * Компонент управления размером шрифта\n * Предоставляет радио-кнопки для выбора размера шрифта\n * \n * Реализует требования:\n * - 3.1: Уменьшение размера шрифта на 10%\n * - 3.2: Увеличение размера шрифта на 10%\n * - 3.3: Возврат к стандартному размеру шрифта\n */\n\nimport React from 'react';\nimport { FontSize } from '../../types';\nimport { useAccessibilityContext } from '../../context/AccessibilityContext';\nimport styles from './FontSizeControl.module.scss';\n\n/**\n * Свойства компонента FontSizeControl\n */\ninterface FontSizeControlProps {\n /** CSS класс для дополнительной стилизации */\n className?: string;\n}\n\n/**\n * Опции размеров шрифта с описаниями\n */\nconst FONT_SIZE_OPTIONS: Array<{\n value: FontSize;\n label: string;\n description: string;\n}> = [\n {\n value: 'small',\n label: 'Мелкий',\n description: 'Уменьшенный размер текста (80%)'\n },\n {\n value: 'standard',\n label: 'Стандартный',\n description: 'Обычный размер текста'\n },\n {\n value: 'large',\n label: 'Крупный',\n description: 'Увеличенный размер текста (130%)'\n }\n];\n\n/**\n * Компонент управления размером шрифта\n * \n * @param props - Свойства компонента\n * @returns JSX элемент с радио-кнопками для выбора размера шрифта\n */\nexport const FontSizeControl: React.FC<FontSizeControlProps> = ({ \n className \n}) => {\n // Используем контекст для получения состояния и методов управления\n const { settings, updateSettings } = useAccessibilityContext();\n const fontSize = settings.fontSize;\n const isEnabled = settings.isEnabled;\n\n /**\n * Обработчик изменения размера шрифта\n * \n * @param event - Событие изменения радио-кнопки\n */\n const handleFontSizeChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const newFontSize = event.target.value as FontSize;\n updateSettings({ fontSize: newFontSize });\n };\n\n return (\n <div className={`${styles.fontSizeControl} ${className || ''} ${!isEnabled ? styles.disabled : ''}`}>\n <h4 className={styles.title}>\n Размер шрифта\n </h4>\n \n <div className={styles.optionsContainer} role=\"radiogroup\" aria-labelledby=\"font-size-title\">\n {FONT_SIZE_OPTIONS.map((option) => (\n <label \n key={option.value}\n className={`${styles.option} ${fontSize === option.value ? styles.selected : ''} ${!isEnabled ? styles.optionDisabled : ''}`}\n >\n <input\n type=\"radio\"\n name=\"fontSize\"\n value={option.value}\n checked={fontSize === option.value}\n onChange={handleFontSizeChange}\n className={styles.radioInput}\n aria-describedby={`font-size-${option.value}-description`}\n disabled={!isEnabled}\n />\n \n <div className={styles.optionContent}>\n <span className={styles.optionLabel}>\n {option.label}\n </span>\n <span \n id={`font-size-${option.value}-description`}\n className={styles.optionDescription}\n >\n {option.description}\n </span>\n </div>\n \n <div className={styles.radioIndicator} aria-hidden=\"true\" />\n </label>\n ))}\n </div>\n </div>\n );\n};\n\nexport default FontSizeControl;","/**\n * Компонент управления отображением изображений\n * Предоставляет переключатель для скрытия/показа изображений\n * \n * Реализует требования:\n * - 4.1: Скрытие изображений через CSS свойство hidden\n * - 4.2: Восстановление видимости изображений\n */\n\nimport React from 'react';\nimport { useAccessibilityContext } from '../../context/AccessibilityContext';\nimport styles from './ImageControl.module.scss';\n\n/**\n * Свойства компонента ImageControl\n */\ninterface ImageControlProps {\n /** CSS класс для дополнительной стилизации */\n className?: string;\n}\n\n/**\n * Компонент управления отображением изображений\n * \n * @param props - Свойства компонента\n * @returns JSX элемент с переключателем для управления изображениями\n */\nexport const ImageControl: React.FC<ImageControlProps> = ({ \n className \n}) => {\n // Используем контекст для получения состояния и методов управления\n const { settings, updateSettings } = useAccessibilityContext();\n const showImages = settings.showImages;\n const isEnabled = settings.isEnabled;\n\n /**\n * Обработчик изменения настройки отображения изображений\n * \n * @param event - Событие изменения чекбокса\n */\n const handleImageVisibilityChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n updateSettings({ showImages: event.target.checked });\n };\n\n return (\n <div className={`${styles.imageControl} ${className || ''} ${!isEnabled ? styles.disabled : ''}`}>\n <h4 className={styles.title}>\n Изображения\n </h4>\n \n <div className={styles.switchContainer}>\n <label className={`${styles.switchLabel} ${!isEnabled ? styles.switchDisabled : ''}`}>\n <input\n type=\"checkbox\"\n checked={showImages}\n onChange={handleImageVisibilityChange}\n className={styles.switchInput}\n aria-describedby=\"image-control-description\"\n disabled={!isEnabled}\n />\n \n <span className={styles.switchSlider} aria-hidden=\"true\">\n <span className={styles.switchThumb} />\n </span>\n \n <span className={styles.switchText}>\n {showImages ? 'Показывать изображения' : 'Скрывать изображения'}\n </span>\n </label>\n \n <p \n id=\"image-control-description\"\n className={styles.description}\n >\n {showImages \n ? 'Изображения отображаются на странице' \n : 'Изображения скрыты для лучшей концентрации на тексте'\n }\n </p>\n </div>\n </div>\n );\n};\n\nexport default ImageControl;","/**\n * Основной компонент панели доступности\n * Объединяет все подкомпоненты управления настройками доступности\n * \n * Реализует требования:\n * - 1.1: Отображение панели доступности при клике на кнопку\n * - 1.2: Закрытие панели кликом вне области или по кнопке закрытия\n * - 1.3: Скрытие панели без изменения текущих настроек\n */\n\nimport React, { useEffect, useRef } from 'react';\nimport { AccessibilityPanelProps } from '../../types';\nimport { AccessibilityProvider } from '../../context/AccessibilityContext';\nimport { AccessibilityToggle } from '../AccessibilityToggle/AccessibilityToggle';\nimport { ColorSchemeControl } from '../ColorSchemeControl/ColorSchemeControl';\nimport { FontSizeControl } from '../FontSizeControl/FontSizeControl';\nimport { ImageControl } from '../ImageControl/ImageControl';\nimport styles from './AccessibilityPanel.module.scss';\n\n/**\n * Внутренний компонент панели доступности\n * Содержит всю логику панели, обернутый в провайдер контекста\n */\nconst AccessibilityPanelInner: React.FC<AccessibilityPanelProps> = ({\n isOpen,\n onClose,\n position = 'top-right'\n}) => {\n const panelRef = useRef<HTMLDivElement>(null);\n\n /**\n * Обработка клика вне области панели для закрытия\n * Реализует требование 1.2: Закрытие панели кликом вне области\n */\n useEffect(() => {\n if (!isOpen) return;\n\n const handleClickOutside = (event: MouseEvent) => {\n if (panelRef.current && !panelRef.current.contains(event.target as Node)) {\n onClose();\n }\n };\n\n // Добавляем обработчик с небольшой задержкой, чтобы избежать немедленного закрытия\n const timeoutId = setTimeout(() => {\n document.addEventListener('mousedown', handleClickOutside);\n }, 100);\n\n return () => {\n clearTimeout(timeoutId);\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [isOpen, onClose]);\n\n /**\n * Обработка нажатия клавиши Escape для закрытия панели\n * Реализует требование 1.2: Закрытие панели по клавише Escape\n */\n useEffect(() => {\n if (!isOpen) return;\n\n const handleEscapeKey = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n onClose();\n }\n };\n\n document.addEventListener('keydown', handleEscapeKey);\n\n return () => {\n document.removeEventListener('keydown', handleEscapeKey);\n };\n }, [isOpen, onClose]);\n\n /**\n * Обработчик закрытия панели по кнопке\n * \n * @param event - Событие клика\n */\n const handleCloseClick = (event: React.MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n onClose();\n };\n\n // Если панель закрыта, не рендерим её\n if (!isOpen) {\n return null;\n }\n\n return (\n <div className={`${styles.stickyContainer} accessibility-panel-container`}>\n <div \n ref={panelRef}\n className={`${styles.panel} ${styles[position]}`}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"accessibility-panel-title\"\n aria-describedby=\"accessibility-panel-description\"\n >\n <div className={styles.header}>\n <h3 id=\"accessibility-panel-title\" className={styles.title}>\n Настройки доступности\n </h3>\n \n <button\n onClick={handleCloseClick}\n className={styles.closeButton}\n aria-label=\"Закрыть панель настроек доступности\"\n type=\"button\"\n >\n ×\n </button>\n </div>\n\n <div \n id=\"accessibility-panel-description\" \n className={styles.description}\n >\n Настройте отображение страницы для улучшения доступности\n </div>\n\n <div className={styles.content}>\n <AccessibilityToggle />\n \n <div className={styles.controls}>\n <ColorSchemeControl />\n <FontSizeControl />\n <ImageControl />\n </div>\n </div>\n </div>\n </div>\n );\n};\n\n/**\n * Основной компонент панели доступности с провайдером контекста\n * \n * @param props - Свойства компонента\n * @returns JSX элемент с полной панелью настроек доступности\n */\nexport const AccessibilityPanel: React.FC<AccessibilityPanelProps> = (props) => {\n return (\n <AccessibilityProvider>\n <AccessibilityPanelInner {...props} />\n </AccessibilityProvider>\n );\n};\n\nexport default AccessibilityPanel;"],"names":["DEFAULT_ACCESSIBILITY_SETTINGS","isEnabled","colorScheme","fontSize","showImages","STORAGE_KEY","saveToStorage","settings","window","localStorage","setItem","JSON","stringify","error","console","warn","loadFromStorage","saved","getItem","validateSettings","parse","clearStorage","removeItem","s","includes","getTextElements","document","querySelectorAll","getImageElements","applyClassToElements","elements","className","forEach","element","classList","add","removeClassFromElements","remove","safeDOMOperation","operation","errorMessage","isDOMAvailable","ORIGINAL_FONT_SIZE_ATTR","FONT_SIZE_MULTIPLIERS","small","standard","large","getComputedFontSize","getComputedStyle","parseFloat","saveOriginalFontSize","hasAttribute","originalSize","setAttribute","toString","getOriginalFontSize","savedSize","getAttribute","currentSize","applyFontSizeToElement","newSize","style","resetElementFontSize","removeAttribute","applyDynamicFontSize","size","multiplier","resetAllFontSizes","updateNewElementsFontSize","CSS_CLASSES","HIGH_CONTRAST","FONT_SMALL","FONT_LARGE","HIDE_IMAGES","applyColorScheme","scheme","body","filter","applyFontSize","applyImageVisibility","removeAllAccessibilityStyles","imageElements","applyAllSettings","useAccessibilitySettings","setSettings","useState","isLoaded","setIsLoaded","useEffect","observer","MutationObserver","mutations","hasNewTextElements","mutation","type","addedNodes","node","nodeType","Node","ELEMENT_NODE","matches","querySelector","setTimeout","observe","childList","subtree","disconnect","savedSettings","updateSettings","useCallback","updates","prevSettings","newSettings","resetSettings","process","env","NODE_ENV","jsxRuntimeModule","exports","REACT_ELEMENT_TYPE","Symbol","for","REACT_FRAGMENT_TYPE","jsxProd","config","maybeKey","key","propName","ref","$$typeof","props","reactJsxRuntime_production","Fragment","jsx","jsxs","require$$0","getComponentNameFromType","REACT_CLIENT_REFERENCE","displayName","name","REACT_PROFILER_TYPE","REACT_STRICT_MODE_TYPE","REACT_SUSPENSE_TYPE","REACT_SUSPENSE_LIST_TYPE","REACT_ACTIVITY_TYPE","tag","REACT_PORTAL_TYPE","REACT_CONTEXT_TYPE","REACT_CONSUMER_TYPE","_context","REACT_FORWARD_REF_TYPE","innerType","render","REACT_MEMO_TYPE","REACT_LAZY_TYPE","_payload","_init","x","testStringCoercion","value","checkKeyStringCoercion","JSCompiler_inline_result","e","JSCompiler_temp_const","JSCompiler_inline_result$jscomp$0","toStringTag","constructor","call","getTaskName","UnknownOwner","Error","elementRefGetterWithDeprecationWarning","componentName","this","didWarnAboutElementRef","jsxDEVImpl","isStaticChildren","debugStack","debugTask","dispatcher","children","isArrayImpl","length","validateChildKeys","Object","freeze","hasOwnProperty","keys","k","join","didWarnAboutKeySpread","getter","getOwnPropertyDescriptor","get","isReactWarning","hasValidKey","warnAboutAccessingKey","specialPropKeyWarningShown","defineProperty","configurable","defineKeyPropWarningGetter","owner","refProp","_owner","enumerable","_store","writable","ReactElement","ReactSharedInternals","A","getOwner","isValidElement","validated","status","object","React","__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE","prototype","Array","isArray","createTask","unknownOwnerDebugStack","react_stack_bottom_frame","callStackForError","bind","unknownOwnerDebugTask","reactJsxRuntime_development","trackActualOwner","recentlyCreatedOwnerStacks","AccessibilityContext","createContext","AccessibilityProvider","accessibilityState","Provider","useAccessibilityContext","context","useContext","AccessibilityToggle","styles","checked","onChange","event","target","id","COLOR_SCHEME_OPTIONS","label","description","ColorSchemeControl","handleColorSchemeChange","newColorScheme","role","map","option","disabled","FONT_SIZE_OPTIONS","FontSizeControl","handleFontSizeChange","newFontSize","ImageControl","AccessibilityPanelInner","isOpen","onClose","position","panelRef","useRef","handleClickOutside","current","contains","timeoutId","addEventListener","clearTimeout","removeEventListener","handleEscapeKey","stickyContainer","panel","header","title","onClick","preventDefault","stopPropagation","closeButton","content","controls","settingType","i","Math","min","fallback","settingKey","setValue","setEnabled","enabled"],"mappings":"6RA6DO,MAAMA,EAAwD,CACnEC,WAAW,EACXC,YAAa,WACbC,SAAU,WACVC,YAAY,GAMDC,EAAc,yBC7DdC,EAAiBC,IAC5B,IACE,GAAsB,oBAAXC,OAAwB,OACnCC,aAAaC,QAAQL,EAAaM,KAAKC,UAAUL,GACnD,OAASM,GACPC,QAAQC,KAAK,8CAA+CF,EAC9D,GAMWG,EAAkB,KAC7B,IACE,GAAsB,oBAAXR,OAAwB,OAAO,KAC1C,MAAMS,EAAQR,aAAaS,QAAQb,GACnC,OAAOY,EAAQE,EAAiBR,KAAKS,MAAMH,IAAU,IACvD,OAASJ,GAEP,OADAC,QAAQC,KAAK,8CAA+CF,GACrD,IACT,GAMWQ,EAAe,KAC1B,IACE,GAAsB,oBAAXb,OAAwB,OACnCC,aAAaa,WAAWjB,EAC1B,OAASQ,GACPC,QAAQC,KAAK,6CAA8CF,EAC7D,GAMWM,EAAoBZ,IAC/B,IAAKA,GAAgC,iBAAbA,EACtB,OAAOP,EAGT,MAAMuB,EAAIhB,EAEV,MAAO,CACLN,UAAkC,kBAAhBsB,EAAEtB,UAA0BsB,EAAEtB,UAAYD,EAA+BC,UAC3FC,YAAa,CAAC,WAAY,gBAAiB,aAAasB,SAASD,EAAErB,aAC/DqB,EAAErB,YACFF,EAA+BE,YACnCC,SAAU,CAAC,QAAS,WAAY,SAASqB,SAASD,EAAEpB,UAChDoB,EAAEpB,SACFH,EAA+BG,SACnCC,WAAoC,kBAAjBmB,EAAEnB,WAA2BmB,EAAEnB,WAAaJ,EAA+BI,aC7CrFqB,EAAkB,IACL,oBAAbC,SACF,GAEFA,SAASC,iBAda,yDAoBlBC,EAAmB,IACN,oBAAbF,SACF,GAEFA,SAASC,iBAnBc,iCAyBnBE,EAAuB,CAACC,EAAmCC,KACtED,EAASE,QAAQC,IACXA,GAAWA,EAAQC,WACrBD,EAAQC,UAAUC,IAAIJ,MAQfK,EAA0B,CAACN,EAAmCC,KACzED,EAASE,QAAQC,IACXA,GAAWA,EAAQC,WACrBD,EAAQC,UAAUG,OAAON,MAQlBO,EAAmB,CAACC,EAAuBC,KACtD,IACE,GAAsB,oBAAXhC,OAAwB,OACnC+B,GACF,OAAS1B,GACPC,QAAQC,KAAKyB,EAAc3B,EAC7B,GAMW4B,EAAiB,IACH,oBAAXjC,QAA8C,oBAAbkB,SC9D3CgB,EAA0B,0BAK1BC,EAAwB,CAC5BC,MAAO,GACPC,SAAU,EACVC,MAAO,KASHC,EAAuBd,IAC3B,MACM9B,EADgBK,OAAOwC,iBAAiBf,GACf9B,SAC/B,OAAO8C,WAAW9C,IAQd+C,EAAwBjB,IAE5B,IAAKA,EAAQkB,aAAaT,GAA0B,CAClD,MAAMU,EAAeL,EAAoBd,GACzCA,EAAQoB,aAAaX,EAAyBU,EAAaE,WAC7D,GASIC,EAAuBtB,IAC3B,MAAMuB,EAAYvB,EAAQwB,aAAaf,GACvC,GAAIc,EACF,OAAOP,WAAWO,GAIpB,MAAME,EAAcX,EAAoBd,GAExC,OADAA,EAAQoB,aAAaX,EAAyBgB,EAAYJ,YACnDI,GASHC,EAAyB,CAAC1B,EAAsB2B,KACpD3B,EAAQ4B,MAAM1D,SAAW,GAAGyD,OAQxBE,EAAwB7B,IAC5BA,EAAQ4B,MAAM1D,SAAW,GACzB8B,EAAQ8B,gBAAgBrB,IAQbsB,EAAwBC,IACnC3B,EAAiB,KACf,IAAKG,IAAkB,OAEvB,MAAMX,EAAWL,IACXyC,EAAavB,EAAsBsB,GAEzCnC,EAASE,QAASC,IAChB,IACE,GAAa,aAATgC,EAEFH,EAAqB7B,OAChB,CAELiB,EAAqBjB,GAGrB,MAAMmB,EAAeG,EAAoBtB,GAGzC0B,EAAuB1B,EAFPmB,EAAec,EAGjC,CACF,OAASrD,GACPC,QAAQC,KAAK,gDAAiDkB,EAASpB,EACzE,KAED,uDAAuDoD,MAM/CE,EAAoB,KAC/B7B,EAAiB,KACf,IAAKG,IAAkB,OAENhB,IAERO,QAASC,IAChB,IACE6B,EAAqB7B,EACvB,OAASpB,GACPC,QAAQC,KAAK,6CAA8CkB,EAASpB,EACtE,KAED,2CASQuD,EAA6BH,IAC3B,aAATA,GAEJ3B,EAAiB,KACf,IAAKG,IAAkB,OAEvB,MAAMX,EAAWL,IACXyC,EAAavB,EAAsBsB,GAEzCnC,EAASE,QAASC,IAEhB,IAAKA,EAAQkB,aAAaT,KAA6BT,EAAQ4B,MAAM1D,SACnE,IACE+C,EAAqBjB,GACrB,MAAMmB,EAAeG,EAAoBtB,GAEzC0B,EAAuB1B,EADPmB,EAAec,EAEjC,OAASrD,GACPC,QAAQC,KAAK,wDAAyDkB,EAASpB,EACjF,KAGH,yDAAyDoD,MC5IjDI,EAAc,CACzBC,cAAe,8BACfC,WAAY,2BACZC,WAAY,2BACZC,YAAa,6BAUFC,EAAoBC,IAC/BrC,EAAiB,KACf,GAAKG,IAML,OAHAf,SAASkD,KAAK1C,UAAUG,OAAOgC,EAAYC,eAC3C5C,SAASkD,KAAKf,MAAMgB,OAAS,GAErBF,GACN,IAAK,gBAEHjD,SAASkD,KAAK1C,UAAUC,IAAIkC,EAAYC,eACxC,MACF,IAAK,YAEH5C,SAASkD,KAAKf,MAAMgB,OAAS,kBAC7B,MACF,IAAK,WAEH,MACF,QACE/D,QAAQC,KAAK,+BAA+B4D,OAG/C,yCAAyCA,MAUjCG,EAAiBb,IAE5BD,EAAqBC,IAUVc,EAAwB3E,IACnCkC,EAAiB,KACf,IAAKG,IAAkB,OAEvB,MAAMX,EAAWF,IAEbxB,EAEFgC,EAAwBN,EAAUuC,EAAYI,aAG9C5C,EAAqBC,EAAUuC,EAAYI,cAE5C,mDAAmDrE,MAM3C4E,EAA+B,KAC1C1C,EAAiB,KACf,IAAKG,IAAkB,OAGvBf,SAASkD,KAAK1C,UAAUG,OAAOgC,EAAYC,eAC3C5C,SAASkD,KAAK1C,UAAUG,OAAOgC,EAAYE,YAC3C7C,SAASkD,KAAK1C,UAAUG,OAAOgC,EAAYG,YAC3C9C,SAASkD,KAAKf,MAAMgB,OAAS,GAG7BV,IAGA,MAAMc,EAAgBrD,IACtBQ,EAAwB6C,EAAeZ,EAAYI,cAClD,gDAOQS,EAAoB3E,IAC1BA,EAASN,WAOdyE,EAAiBnE,EAASL,aAC1B4E,EAAcvE,EAASJ,UACvB4E,EAAqBxE,EAASH,aAP5B4E,KCjGSG,EAA2B,KAEtC,MAAO5E,EAAU6E,GAAeC,EAAAA,SAAgCrF,IAGzDsF,EAAUC,GAAeF,EAAAA,UAAS,GAKzCG,EAAAA,UAAU,KACR,GAAsB,oBAAXhF,SAA2B8E,IAAa/E,EAASN,UAAW,OAEvE,MAAMwF,EAAW,IAAIC,iBAAkBC,IACrC,IAAIC,GAAqB,EAEzBD,EAAU3D,QAAS6D,IACK,cAAlBA,EAASC,MACXD,EAASE,WAAW/D,QAASgE,IAC3B,GAAIA,EAAKC,WAAaC,KAAKC,aAAc,CACvC,MAAMlE,EAAU+D,GAEZ/D,EAAQmE,QAAQ,+DAChBnE,EAAQoE,cAAc,iEACxBT,GAAqB,EAEzB,MAMFA,GAA4C,aAAtBrF,EAASJ,UACjCmG,WAAW,KACTlC,EAA0B7D,EAASJ,WAClC,OASP,OALAsF,EAASc,QAAQ7E,SAASkD,KAAM,CAC9B4B,WAAW,EACXC,SAAS,IAGJ,KACLhB,EAASiB,eAEV,CAACpB,EAAU/E,EAASN,UAAWM,EAASJ,WAO3CqF,EAAAA,UAAU,KAER,GAAsB,oBAAXhF,OAIX,IAEE,MAAMmG,EAAgB3F,IAElB2F,IACFvB,EAAYuB,GAIRA,EAAc1G,WAChBiF,EAAiByB,GAGvB,OAAS9F,GACPC,QAAQC,KAAK,4CAA6CF,GAE1DuE,EAAYpF,EACd,CAAA,QAEEuF,GAAY,EACd,GACC,IAMHC,EAAAA,UAAU,KAER,GAAKF,EAIL,IAEEhF,EAAcC,GAGVA,EAASN,UACXiF,EAAiB3E,GAGjByE,GAEJ,OAASnE,GACPC,QAAQC,KAAK,8CAA+CF,EAC9D,GACC,CAACN,EAAU+E,IAQd,MAAMsB,EAAiBC,cAAaC,IAClC1B,EAAY2B,IACV,MAAMC,EAAc,IAAKD,KAAiBD,GAQ1C,OALIC,EAAa9G,YAAc+G,EAAY/G,WAEzC+E,IAGKgC,KAER,IAMGC,EAAgBJ,EAAAA,YAAY,KAChC,IAEE7B,IAGAI,EAAYpF,GAGZqB,GACF,OAASR,GACPC,QAAQC,KAAK,0CAA2CF,EAC1D,GACC,IAEH,MAAO,CACLN,WACAqG,iBACAK,gBACA3B;;;;;;;;;KCxLyB,eAAzB4B,QAAQC,IAAIC,SACdC,EAAAC,qCCQF,IAAIC,EAAqBC,OAAOC,IAAI,8BAClCC,EAAsBF,OAAOC,IAAI,kBACnC,SAASE,EAAQ7B,EAAM8B,EAAQC,GAC7B,IAAIC,EAAM,KAGV,QAFA,IAAWD,IAAaC,EAAM,GAAKD,QACnC,IAAWD,EAAOE,MAAQA,EAAM,GAAKF,EAAOE,KACxC,QAASF,EAEX,IAAA,IAASG,KADTF,EAAW,CAAA,EACUD,EACnB,QAAUG,IAAaF,EAASE,GAAYH,EAAOG,SAChDF,EAAWD,EAElB,OADAA,EAASC,EAASG,IACX,CACLC,SAAUV,EACVzB,OACAgC,MACAE,SAAK,IAAWJ,EAASA,EAAS,KAClCM,MAAOL,EAEX,QACAM,EAAAC,SAAmBV,EACnBS,EAAAE,IAAcV,EACdQ,EAAAG,KAAeX,ID9BIY,GAEjBlB,EAAAC,iBEMF,eAAiBJ,QAAQC,IAAIC,UAC1B,WACC,SAASoB,EAAyB1C,GAChC,GAAI,MAAQA,EAAM,OAAO,KACzB,GAAI,mBAAsBA,EACxB,OAAOA,EAAKmC,WAAaQ,EACrB,KACA3C,EAAK4C,aAAe5C,EAAK6C,MAAQ,KACvC,GAAI,iBAAoB7C,EAAM,OAAOA,EACrC,OAAQA,GACN,KAAK4B,EACH,MAAO,WACT,KAAKkB,EACH,MAAO,WACT,KAAKC,EACH,MAAO,aACT,KAAKC,EACH,MAAO,WACT,KAAKC,EACH,MAAO,eACT,KAAKC,EACH,MAAO,WAEX,GAAI,iBAAoBlD,EACtB,OACG,iBAAoBA,EAAKmD,KACxBnI,QAAQD,MACN,qHAEJiF,EAAKmC,UAEL,KAAKiB,EACH,MAAO,SACT,KAAKC,EACH,OAAOrD,EAAK4C,aAAe,UAC7B,KAAKU,EACH,OAAQtD,EAAKuD,SAASX,aAAe,WAAa,YACpD,KAAKY,EACH,IAAIC,EAAYzD,EAAK0D,OAKrB,OAJA1D,EAAOA,EAAK4C,eAGT5C,EAAO,MADNA,EAAOyD,EAAUb,aAAea,EAAUZ,MAAQ,IAC9B,cAAgB7C,EAAO,IAAM,cAC9CA,EACT,KAAK2D,EACH,OAEE,QADCF,EAAYzD,EAAK4C,aAAe,MAE7Ba,EACAf,EAAyB1C,EAAKA,OAAS,OAE/C,KAAK4D,EACHH,EAAYzD,EAAK6D,SACjB7D,EAAOA,EAAK8D,MACZ,IACE,OAAOpB,EAAyB1C,EAAKyD,GACnD,OAAqBM,GAAG,EAElB,OAAO,IACb,CACI,SAASC,EAAmBC,GAC1B,MAAO,GAAKA,CAClB,CACI,SAASC,EAAuBD,GAC9B,IACED,EAAmBC,GACnB,IAAIE,GAA2B,CACvC,OAAeC,GACPD,GAA2B,CACnC,CACM,GAAIA,EAA0B,CAE5B,IAAIE,GADJF,EAA2BnJ,SAC0BD,MACjDuJ,EACD,mBAAsB5C,QACrBA,OAAO6C,aACPN,EAAMvC,OAAO6C,cACfN,EAAMO,YAAY3B,MAClB,SAMF,OALAwB,EAAsBI,KACpBN,EACA,2GACAG,GAEKN,EAAmBC,EAClC,CACA,CACI,SAASS,EAAY1E,GACnB,GAAIA,IAAS4B,EAAqB,MAAO,KACzC,GACE,iBAAoB5B,GACpB,OAASA,GACTA,EAAKmC,WAAayB,EAElB,MAAO,QACT,IACE,IAAIf,EAAOH,EAAyB1C,GACpC,OAAO6C,EAAO,IAAMA,EAAO,IAAM,OACzC,OAAekB,GACP,MAAO,OACf,CACA,CAKI,SAASY,IACP,OAAOC,MAAM,wBACnB,CAuBI,SAASC,IACP,IAAIC,EAAgBpC,EAAyBqC,KAAK/E,MAOlD,OANAgF,EAAuBF,KACnBE,EAAuBF,IAAiB,EAC1C9J,QAAQD,MACN,qJAGG,KADP+J,EAAgBC,KAAK3C,MAAMF,KACO4C,EAAgB,IACxD,CA4CI,SAASG,EACPjF,EACA8B,EACAC,EACAmD,EACAC,EACAC,GAEA,IAzFIC,EAyFAC,EAAWxD,EAAOwD,SACtB,QAAI,IAAWA,EACb,GAAIJ,EACF,GAAIK,EAAYD,GAAW,CACzB,IACEJ,EAAmB,EACnBA,EAAmBI,EAASE,OAC5BN,IAEAO,EAAkBH,EAASJ,IAC7BQ,OAAOC,QAAUD,OAAOC,OAAOL,EAC3C,MACYtK,QAAQD,MACN,+JAEiBuK,GACzB,GAAIM,EAAenB,KAAK3C,EAAQ,OAAQ,CACtCwD,EAAW5C,EAAyB1C,GACpC,IAAI6F,EAAOH,OAAOG,KAAK/D,GAAQ/C,OAAO,SAAU+G,GAC9C,MAAO,QAAUA,CAC3B,GACQZ,EACE,EAAIW,EAAKL,OACL,kBAAoBK,EAAKE,KAAK,WAAa,SAC3C,iBACNC,EAAsBV,EAAWJ,KAC7BW,EACA,EAAIA,EAAKL,OAAS,IAAMK,EAAKE,KAAK,WAAa,SAAW,KAC5D/K,QAAQD,MACN,kOACAmK,EACAI,EACAO,EACAP,GAEDU,EAAsBV,EAAWJ,IAAoB,EAChE,CAMM,GALAI,EAAW,UACX,IAAWvD,IACRmC,EAAuBnC,GAAYuD,EAAW,GAAKvD,GA1HxD,SAAqBD,GACnB,GAAI8D,EAAenB,KAAK3C,EAAQ,OAAQ,CACtC,IAAImE,EAASP,OAAOQ,yBAAyBpE,EAAQ,OAAOqE,IAC5D,GAAIF,GAAUA,EAAOG,eAAgB,OAAO,CACpD,CACM,gBAAkBtE,EAAOE,GAC/B,CAqHMqE,CAAYvE,KACToC,EAAuBpC,EAAOE,KAAOsD,EAAW,GAAKxD,EAAOE,KAC3D,QAASF,EAEX,IAAA,IAASG,KADTF,EAAW,CAAA,EACUD,EACnB,QAAUG,IAAaF,EAASE,GAAYH,EAAOG,SAChDF,EAAWD,EAQlB,OAPAwD,GA3HF,SAAoClD,EAAOQ,GACzC,SAAS0D,IACPC,IACIA,GAA6B,EAC/BvL,QAAQD,MACN,0OACA6H,GAEZ,CACM0D,EAAsBF,gBAAiB,EACvCV,OAAOc,eAAepE,EAAO,MAAO,CAClC+D,IAAKG,EACLG,cAAc,GAEtB,CA8GQC,CACE3E,EACA,mBAAsB/B,EAClBA,EAAK4C,aAAe5C,EAAK6C,MAAQ,UACjC7C,GAvGV,SAAsBA,EAAMgC,EAAKI,EAAOuE,EAAOxB,EAAYC,GACzD,IAAIwB,EAAUxE,EAAMF,IAwCpB,OAvCAlC,EAAO,CACLmC,SAAUV,EACVzB,OACAgC,MACAI,QACAyE,OAAQF,GAEV,iBAAqBC,EAAUA,EAAU,MACrClB,OAAOc,eAAexG,EAAM,MAAO,CACjC8G,YAAY,EACZX,IAAKtB,IAEPa,OAAOc,eAAexG,EAAM,MAAO,CAAE8G,YAAY,EAAI7C,MAAO,OAChEjE,EAAK+G,OAAS,CAAA,EACdrB,OAAOc,eAAexG,EAAK+G,OAAQ,YAAa,CAC9CN,cAAc,EACdK,YAAY,EACZE,UAAU,EACV/C,MAAO,IAETyB,OAAOc,eAAexG,EAAM,aAAc,CACxCyG,cAAc,EACdK,YAAY,EACZE,UAAU,EACV/C,MAAO,OAETyB,OAAOc,eAAexG,EAAM,cAAe,CACzCyG,cAAc,EACdK,YAAY,EACZE,UAAU,EACV/C,MAAOkB,IAETO,OAAOc,eAAexG,EAAM,aAAc,CACxCyG,cAAc,EACdK,YAAY,EACZE,UAAU,EACV/C,MAAOmB,IAETM,OAAOC,SAAWD,OAAOC,OAAO3F,EAAKoC,OAAQsD,OAAOC,OAAO3F,IACpDA,CACb,CA+DaiH,CACLjH,EACAsF,EACAvD,EAjJK,QADHsD,EAAa6B,EAAqBC,GACT,KAAO9B,EAAW+B,WAmJ7CjC,EACAC,EAER,CACI,SAASK,EAAkBvF,GACzBmH,EAAenH,GACXA,EAAK6G,SAAW7G,EAAK6G,OAAOO,UAAY,GACxC,iBAAoBpH,GACpB,OAASA,GACTA,EAAKiC,WAAayB,IACjB,cAAgB1D,EAAK2D,SAAS0D,OAC3BF,EAAenH,EAAK2D,SAASI,QAC7B/D,EAAK2D,SAASI,MAAM8C,SACnB7G,EAAK2D,SAASI,MAAM8C,OAAOO,UAAY,GACxCpH,EAAK6G,SAAW7G,EAAK6G,OAAOO,UAAY,GACtD,CACI,SAASD,EAAeG,GACtB,MACE,iBAAoBA,GACpB,OAASA,GACTA,EAAOrF,WAAaV,CAE5B,CACI,IA6BI8E,EA7BAkB,EAAQhF,EACVhB,EAAqBC,OAAOC,IAAI,8BAChCyB,EAAoB1B,OAAOC,IAAI,gBAC/BC,EAAsBF,OAAOC,IAAI,kBACjCoB,EAAyBrB,OAAOC,IAAI,qBACpCmB,EAAsBpB,OAAOC,IAAI,kBACjC2B,EAAsB5B,OAAOC,IAAI,kBACjC0B,EAAqB3B,OAAOC,IAAI,iBAChC6B,EAAyB9B,OAAOC,IAAI,qBACpCqB,EAAsBtB,OAAOC,IAAI,kBACjCsB,EAA2BvB,OAAOC,IAAI,uBACtCgC,EAAkBjC,OAAOC,IAAI,cAC7BiC,EAAkBlC,OAAOC,IAAI,cAC7BuB,EAAsBxB,OAAOC,IAAI,kBACjCgB,EAAyBjB,OAAOC,IAAI,0BACpCuF,EACEO,EAAMC,gEACR9B,EAAiBF,OAAOiC,UAAU/B,eAClCL,EAAcqC,MAAMC,QACpBC,EAAa9M,QAAQ8M,WACjB9M,QAAQ8M,WACR,WACE,OAAO,IACnB,EAOQ9C,EAAyB,CAAA,EACzB+C,GAPJN,EAAQ,CACNO,yBAA0B,SAAUC,GAClC,OAAOA,GACf,IAIuCD,yBAAyBE,KAC1DT,EACA9C,EAF2B8C,GAIzBU,EAAwBL,EAAWpD,EAAYC,IAC/CqB,EAAwB,CAAA,EAC5BoC,EAAA9F,SAAmBV,EACnBwG,EAAA7F,IAAc,SAAUvC,EAAM8B,EAAQC,GACpC,IAAIsG,EACF,IAAMnB,EAAqBoB,6BAC7B,OAAOrD,EACLjF,EACA8B,EACAC,GACA,EACAsG,EACIzD,MAAM,yBACNmD,EACJM,EAAmBP,EAAWpD,EAAY1E,IAASmI,EAE3D,EACIC,EAAA5F,KAAe,SAAUxC,EAAM8B,EAAQC,GACrC,IAAIsG,EACF,IAAMnB,EAAqBoB,6BAC7B,OAAOrD,EACLjF,EACA8B,EACAC,GACA,EACAsG,EACIzD,MAAM,yBACNmD,EACJM,EAAmBP,EAAWpD,EAAY1E,IAASmI,EAE3D,CACA,CAnVG,uBCAH,MAAMI,EAAuBC,EAAAA,cAA+C,MAe/DC,EAA8D,EAAGnD,eAC5E,MAAMoD,EAAqBrJ,IAE3B,aACGkJ,EAAqBI,SAArB,CAA8B1E,MAAOyE,EACnCpD,cAWMsD,EAA0B,KACrC,MAAMC,EAAUC,EAAAA,WAAWP,GAE3B,IAAKM,EACH,MAAM,IAAIjE,MAAM,8EAGlB,OAAOiE,uRCtBIE,EAA0D,EACrE9M,gBAGA,MAAMxB,SAAEA,EAAAqG,eAAUA,GAAmB8H,IAC/BzO,EAAYM,EAASN,UAW3B,OACEoI,EAAAA,IAAC,MAAA,CAAItG,UAAW,GAAG+M,KAA8B/M,GAAa,KAC5DqJ,WAAA9C,KAAC,MAAA,CAAIvG,UAAW+M,EACd1D,SAAA,GAAA9C,KAAC,QAAA,CAAMvG,UAAW+M,EAChB1D,SAAA,CAAA/C,EAAAA,IAAC,QAAA,CACCvC,KAAK,WACLiJ,QAAS9O,EACT+O,SAXkBC,IAC1BrI,EAAe,CAAE3G,UAAWgP,EAAMC,OAAOH,WAWjChN,UAAW+M,EACX,mBAAiB,uCAGnBzG,IAAC,OAAA,CAAKtG,UAAW+M,EAAqB,cAAY,OAChD1D,SAAA/C,EAAAA,IAAC,OAAA,CAAKtG,UAAW+M,QAGnBxG,KAAC,MAAA,CAAIvG,UAAW+M,EACd1D,SAAA,CAAA/C,EAAAA,IAAC,OAAA,CAAKtG,UAAW+M,EAAoB1D,SAAA,4BAGpC,OAAA,CAAKrJ,UAAW+M,EACd1D,SAAAnL,EAAY,UAAY,mBAK/BoI,EAAAA,IAAC,IAAA,CACC8G,GAAG,mCACHpN,UAAW+M,EAEV1D,WACG,gGACA,ubClDRgE,GAID,CACH,CACErF,MAAO,WACPsF,MAAO,cACPC,YAAa,gCAEf,CACEvF,MAAO,gBACPsF,MAAO,8BACPC,YAAa,iDAEf,CACEvF,MAAO,YACPsF,MAAO,cACPC,YAAa,gDAUJC,GAAwD,EACnExN,gBAGA,MAAMxB,SAAEA,EAAAqG,eAAUA,GAAmB8H,IAC/BxO,EAAcK,EAASL,YACvBD,EAAYM,EAASN,UAOrBuP,EAA2BP,IAC/B,MAAMQ,EAAiBR,EAAMC,OAAOnF,MACpCnD,EAAe,CAAE1G,YAAauP,KAGhC,SACEnH,KAAC,MAAA,CAAIvG,UAAW,GAAG+M,KAA6B/M,GAAa,MAAO9B,EAA8B,GAAlB6O,IAC9E1D,SAAA,CAAA/C,EAAAA,IAAC,KAAA,CAAGtG,UAAW+M,EAAc1D,SAAA,qBAI7B/C,IAAC,MAAA,CAAItG,UAAW+M,GAAyBY,KAAK,aAAa,kBAAgB,qBACxEtE,SAAAgE,GAAqBO,IAAKC,GACzBtH,EAAAA,KAAC,QAAA,CAECvG,UAAW,GAAG+M,MAAiB5O,IAAgB0P,EAAO7F,MAAQ+E,GAAkB,MAAO7O,EAAoC,GAAxB6O,KAEnG1D,SAAA,CAAA/C,EAAAA,IAAC,QAAA,CACCvC,KAAK,QACL6C,KAAK,cACLoB,MAAO6F,EAAO7F,MACdgF,QAAS7O,IAAgB0P,EAAO7F,MAChCiF,SAAUQ,EACVzN,UAAW+M,GACX,mBAAkB,gBAAgBc,EAAO7F,oBACzC8F,UAAW5P,MAGbqI,KAAC,MAAA,CAAIvG,UAAW+M,GACd1D,SAAA,CAAA/C,MAAC,OAAA,CAAKtG,UAAW+M,GACd1D,WAAOiE,QAEVhH,EAAAA,IAAC,OAAA,CACC8G,GAAI,gBAAgBS,EAAO7F,oBAC3BhI,UAAW+M,GAEV1D,SAAAwE,EAAON,uBAIX,MAAA,CAAIvN,UAAW+M,GAAuB,cAAY,WA1B9Cc,EAAO7F,sVCvDlB+F,GAID,CACH,CACE/F,MAAO,QACPsF,MAAO,SACPC,YAAa,mCAEf,CACEvF,MAAO,WACPsF,MAAO,cACPC,YAAa,yBAEf,CACEvF,MAAO,QACPsF,MAAO,UACPC,YAAa,qCAUJS,GAAkD,EAC7DhO,gBAGA,MAAMxB,SAAEA,EAAAqG,eAAUA,GAAmB8H,IAC/BvO,EAAWI,EAASJ,SACpBF,EAAYM,EAASN,UAOrB+P,EAAwBf,IAC5B,MAAMgB,EAAchB,EAAMC,OAAOnF,MACjCnD,EAAe,CAAEzG,SAAU8P,KAG7B,SACE3H,KAAC,MAAA,CAAIvG,UAAW,GAAG+M,MAA0B/M,GAAa,MAAO9B,EAA8B,GAAlB6O,KAC3E1D,SAAA,CAAA/C,EAAAA,IAAC,KAAA,CAAGtG,UAAW+M,GAAc1D,SAAA,oBAI7B/C,IAAC,MAAA,CAAItG,UAAW+M,GAAyBY,KAAK,aAAa,kBAAgB,kBACxEtE,SAAA0E,GAAkBH,IAAKC,GACtBtH,EAAAA,KAAC,QAAA,CAECvG,UAAW,GAAG+M,MAAiB3O,IAAayP,EAAO7F,MAAQ+E,GAAkB,MAAO7O,EAAoC,GAAxB6O,KAEhG1D,SAAA,CAAA/C,EAAAA,IAAC,QAAA,CACCvC,KAAK,QACL6C,KAAK,WACLoB,MAAO6F,EAAO7F,MACdgF,QAAS5O,IAAayP,EAAO7F,MAC7BiF,SAAUgB,EACVjO,UAAW+M,GACX,mBAAkB,aAAac,EAAO7F,oBACtC8F,UAAW5P,MAGbqI,KAAC,MAAA,CAAIvG,UAAW+M,GACd1D,SAAA,CAAA/C,MAAC,OAAA,CAAKtG,UAAW+M,GACd1D,WAAOiE,QAEVhH,EAAAA,IAAC,OAAA,CACC8G,GAAI,aAAaS,EAAO7F,oBACxBhI,UAAW+M,GAEV1D,SAAAwE,EAAON,uBAIX,MAAA,CAAIvN,UAAW+M,GAAuB,cAAY,WA1B9Cc,EAAO7F,sTCtDXmG,GAA4C,EACvDnO,gBAGA,MAAMxB,SAAEA,EAAAqG,eAAUA,GAAmB8H,IAC/BtO,EAAaG,EAASH,WACtBH,EAAYM,EAASN,UAW3B,SACEqI,KAAC,MAAA,CAAIvG,UAAW,GAAG+M,MAAuB/M,GAAa,MAAO9B,EAA8B,GAAlB6O,KACxE1D,SAAA,CAAA/C,EAAAA,IAAC,KAAA,CAAGtG,UAAW+M,GAAc1D,SAAA,kBAI7B9C,KAAC,MAAA,CAAIvG,UAAW+M,GACd1D,SAAA,CAAA9C,EAAAA,KAAC,QAAA,CAAMvG,UAAW,GAAG+M,MAAuB7O,EAAoC,GAAxB6O,KACtD1D,SAAA,CAAA/C,EAAAA,IAAC,QAAA,CACCvC,KAAK,WACLiJ,QAAS3O,EACT4O,SAf2BC,IACnCrI,EAAe,CAAExG,WAAY6O,EAAMC,OAAOH,WAelChN,UAAW+M,GACX,mBAAiB,4BACjBe,UAAW5P,MAGboI,IAAC,OAAA,CAAKtG,UAAW+M,GAAqB,cAAY,OAChD1D,SAAA/C,EAAAA,IAAC,OAAA,CAAKtG,UAAW+M,aAGlB,OAAA,CAAK/M,UAAW+M,GACd1D,SAAAhL,EAAa,yBAA2B,4BAI7CiI,EAAAA,IAAC,IAAA,CACC8G,GAAG,4BACHpN,UAAW+M,GAEV1D,WACG,uCACA,oZCrDR+E,GAA6D,EACjEC,SACAC,UACAC,WAAW,gBAEX,MAAMC,EAAWC,EAAAA,OAAuB,MAMxChL,EAAAA,UAAU,KACR,IAAK4K,EAAQ,OAEb,MAAMK,EAAsBxB,IACtBsB,EAASG,UAAYH,EAASG,QAAQC,SAAS1B,EAAMC,SACvDmB,KAKEO,EAAYtK,WAAW,KAC3B5E,SAASmP,iBAAiB,YAAaJ,IACtC,KAEH,MAAO,KACLK,aAAaF,GACblP,SAASqP,oBAAoB,YAAaN,KAE3C,CAACL,EAAQC,IAMZ7K,EAAAA,UAAU,KACR,IAAK4K,EAAQ,OAEb,MAAMY,EAAmB/B,IACL,WAAdA,EAAMnH,KACRuI,KAMJ,OAFA3O,SAASmP,iBAAiB,UAAWG,GAE9B,KACLtP,SAASqP,oBAAoB,UAAWC,KAEzC,CAACZ,EAAQC,IAcZ,OAAKD,QAKF,MAAA,CAAIrO,UAAW,GAAG+M,GAAOmC,gDACxB7F,SAAA9C,EAAAA,KAAC,MAAA,CACCN,IAAKuI,EACLxO,UAAW,GAAG+M,GAAOoC,SAASpC,GAAOwB,KACrCZ,KAAK,SACL,aAAW,OACX,kBAAgB,4BAChB,mBAAiB,kCAEjBtE,SAAA,GAAA9C,KAAC,MAAA,CAAIvG,UAAW+M,GAAOqC,OACrB/F,SAAA,CAAA/C,MAAC,MAAG8G,GAAG,4BAA4BpN,UAAW+M,GAAOsC,MAAOhG,SAAA,0BAI5D/C,EAAAA,IAAC,SAAA,CACCgJ,QA3BgBpC,IACxBA,EAAMqC,iBACNrC,EAAMsC,kBACNlB,KAyBQtO,UAAW+M,GAAO0C,YAClB,aAAW,sCACX1L,KAAK,SACNsF,SAAA,SAKH/C,EAAAA,IAAC,MAAA,CACC8G,GAAG,kCACHpN,UAAW+M,GAAOQ,YACnBlE,SAAA,+DAID9C,KAAC,MAAA,CAAIvG,UAAW+M,GAAO2C,QACrBrG,SAAA,CAAA/C,EAAAA,IAACwG,EAAA,MAEDvG,KAAC,MAAA,CAAIvG,UAAW+M,GAAO4C,SACrBtG,SAAA,CAAA/C,EAAAA,IAACkH,GAAA,UACAQ,GAAA,UACAG,GAAA,CAAA,cAzCF,2BAuD2DhI,SAEjEqG,EAAA,CACCnD,SAAA/C,EAAAA,IAAC8H,GAAA,IAA4BjI,yVVAE,CACnCjI,EACA0R,EACA5H,KAEA,GAAK9J,EAIL,OAAQ0R,GACN,IAAK,cACHjN,EAAiBqF,GACjB,MACF,IAAK,WACHjF,EAAciF,GACd,MACF,IAAK,kBACHhF,EAAqBgF,GACrB,MACF,QACEjJ,QAAQC,KAAK,8BAA8B4Q,yGDSf,KAChC,IAAKlP,IAAkB,OAAO,EAE9B,MAAMX,EAAWL,IACjB,IAAA,IAASmQ,EAAI,EAAGA,EAAIC,KAAKC,IAAIhQ,EAASwJ,OAAQ,IAAKsG,IACjD,GAAI9P,EAAS8P,GAAGzO,aAAaT,GAC3B,OAAO,EAGX,OAAO,2JFjHgC,CACvCH,EACAwP,EACAvP,KAEA,IACE,OAAOD,GACT,OAAS1B,GAEP,OADAC,QAAQC,KAAKyB,EAAc3B,GACpBkR,CACT,yGIsHAC,IAEA,MAAMzR,SAAEA,EAAAqG,eAAUA,GAAmBzB,IAE/B8M,EAAWpL,cAAakD,IAC5BnD,EAAe,CAAEoL,CAACA,GAAajI,KAC9B,CAACiI,EAAYpL,IAEhB,MAAO,CAACrG,EAASyR,GAAaC,0DASM,KACpC,MAAM1R,SAAEA,EAAAqG,eAAUA,GAAmBzB,IAE/B+M,EAAarL,cAAasL,IAG9BvL,EAAe,CAAE3G,UAAWkS,KAC3B,CAACvL,IAEJ,MAAO,CAACrG,EAASN,UAAWiS","x_google_ignoreList":[6,7,8]}
1
+ {"version":3,"file":"index.umd.js","sources":["../src/types/index.ts","../src/lib/accessibility-storage.ts","../src/lib/dom-manipulator.ts","../node_modules/classnames/index.js","../src/lib/font-size-manager.ts","../src/lib/css-applier.ts","../src/hooks/useAccessibilitySettings.ts","../node_modules/react/jsx-runtime.js","../node_modules/react/cjs/react-jsx-runtime.production.js","../node_modules/react/cjs/react-jsx-runtime.development.js","../src/context/AccessibilityContext.tsx","../src/components/AccessibilityToggle/AccessibilityToggle.tsx","../src/components/ColorSchemeControl/ColorSchemeControl.tsx","../src/components/FontSizeControl/FontSizeControl.tsx","../src/components/ImageControl/ImageControl.tsx","../src/components/AccessibilityPanel/AccessibilityPanel.tsx"],"sourcesContent":["/**\n * Типы для панели доступности\n * Определяет интерфейсы и типы для настроек доступности\n */\n\nexport type ColorScheme = 'standard' | 'high-contrast' | 'grayscale';\nexport type FontSize = 'small' | 'standard' | 'large';\n\n/**\n * Интерфейс настроек доступности\n */\nexport interface AccessibilitySettings {\n /** Включен ли режим доступности */\n isEnabled: boolean;\n /** Цветовая схема */\n colorScheme: ColorScheme;\n /** Размер шрифта */\n fontSize: FontSize;\n /** Показывать ли изображения */\n showImages: boolean;\n}\n\n/**\n * Контекст для управления настройками доступности\n */\nexport interface AccessibilityContextType {\n /** Текущие настройки */\n settings: AccessibilitySettings;\n /** Обновление настроек */\n updateSettings: (updates: Partial<AccessibilitySettings>) => void;\n /** Сброс настроек к значениям по умолчанию */\n resetSettings: () => void;\n /** Загружены ли настройки из localStorage */\n isLoaded: boolean;\n}\n\n/**\n * Свойства основного компонента панели доступности\n */\nexport interface AccessibilityPanelProps {\n /** Открыта ли панель */\n isOpen: boolean;\n /** Обработчик закрытия панели */\n onClose: () => void;\n /** Позиция панели относительно кнопки */\n position?: 'top-right' | 'top-left' | 'bottom-left' | 'bottom-right';\n}\n\n/**\n * Свойства компонентов управления настройками\n */\nexport interface ControlComponentProps {\n /** Текущие настройки */\n settings: AccessibilitySettings;\n /** Обработчик обновления настроек */\n onUpdate: (updates: Partial<AccessibilitySettings>) => void;\n}\n\n/**\n * Настройки по умолчанию\n */\nexport const DEFAULT_ACCESSIBILITY_SETTINGS: AccessibilitySettings = {\n isEnabled: false,\n colorScheme: 'standard',\n fontSize: 'standard',\n showImages: true,\n};\n\n/**\n * Ключ для сохранения в localStorage\n */\nexport const STORAGE_KEY = 'accessibility-settings';","/**\n * Модуль для работы с localStorage\n * Обеспечивает сохранение, загрузку и валидацию настроек доступности\n */\n\nimport { AccessibilitySettings, DEFAULT_ACCESSIBILITY_SETTINGS, STORAGE_KEY } from '../types';\n\n/**\n * Сохранение настроек в localStorage\n */\nexport const saveToStorage = (settings: AccessibilitySettings): void => {\n try {\n if (typeof window === 'undefined') return;\n localStorage.setItem(STORAGE_KEY, JSON.stringify(settings));\n } catch (error) {\n console.warn('Не удалось сохранить настройки доступности:', error);\n }\n};\n\n/**\n * Загрузка настроек из localStorage\n */\nexport const loadFromStorage = (): AccessibilitySettings | null => {\n try {\n if (typeof window === 'undefined') return null;\n const saved = localStorage.getItem(STORAGE_KEY);\n return saved ? validateSettings(JSON.parse(saved)) : null;\n } catch (error) {\n console.warn('Не удалось загрузить настройки доступности:', error);\n return null;\n }\n};\n\n/**\n * Очистка настроек из localStorage\n */\nexport const clearStorage = (): void => {\n try {\n if (typeof window === 'undefined') return;\n localStorage.removeItem(STORAGE_KEY);\n } catch (error) {\n console.warn('Не удалось очистить настройки доступности:', error);\n }\n};\n\n/**\n * Валидация настроек из localStorage\n */\nexport const validateSettings = (settings: unknown): AccessibilitySettings => {\n if (!settings || typeof settings !== 'object') {\n return DEFAULT_ACCESSIBILITY_SETTINGS;\n }\n\n const s = settings as Partial<AccessibilitySettings>;\n \n return {\n isEnabled: typeof s.isEnabled === 'boolean' ? s.isEnabled : DEFAULT_ACCESSIBILITY_SETTINGS.isEnabled,\n colorScheme: ['standard', 'high-contrast', 'grayscale'].includes(s.colorScheme as string) \n ? s.colorScheme as AccessibilitySettings['colorScheme']\n : DEFAULT_ACCESSIBILITY_SETTINGS.colorScheme,\n fontSize: ['small', 'standard', 'large'].includes(s.fontSize as string)\n ? s.fontSize as AccessibilitySettings['fontSize']\n : DEFAULT_ACCESSIBILITY_SETTINGS.fontSize,\n showImages: typeof s.showImages === 'boolean' ? s.showImages : DEFAULT_ACCESSIBILITY_SETTINGS.showImages\n };\n};\n\n/**\n * Безопасное выполнение операций с localStorage\n */\nexport const safeLocalStorageOperation = <T>(\n operation: () => T,\n fallback: T,\n errorMessage: string\n): T => {\n try {\n return operation();\n } catch (error) {\n console.warn(errorMessage, error);\n return fallback;\n }\n};","/**\n * Модуль для работы с DOM элементами\n * Предоставляет функции для поиска и манипуляции элементами страницы\n */\n\n/**\n * Селектор для поиска всех текстовых элементов\n */\nconst TEXT_ELEMENTS_SELECTOR = 'h1, h2, h3, h4, h5, h6, p, span, a, button, label, li';\n\n/**\n * Селектор для поиска всех изображений\n */\nconst IMAGE_ELEMENTS_SELECTOR = 'img, picture, svg[role=\"img\"]';\n\n/**\n * Поиск всех текстовых элементов на странице\n */\nexport const getTextElements = (): NodeListOf<HTMLElement> => {\n if (typeof document === 'undefined') {\n return [] as unknown as NodeListOf<HTMLElement>;\n }\n return document.querySelectorAll(TEXT_ELEMENTS_SELECTOR);\n};\n\n/**\n * Поиск всех изображений на странице\n */\nexport const getImageElements = (): NodeListOf<HTMLElement> => {\n if (typeof document === 'undefined') {\n return [] as unknown as NodeListOf<HTMLElement>;\n }\n return document.querySelectorAll(IMAGE_ELEMENTS_SELECTOR);\n};\n\n/**\n * Применение CSS класса к коллекции элементов\n */\nexport const applyClassToElements = (elements: NodeListOf<HTMLElement>, className: string): void => {\n elements.forEach(element => {\n if (element && element.classList) {\n element.classList.add(className);\n }\n });\n};\n\n/**\n * Удаление CSS класса с коллекции элементов\n */\nexport const removeClassFromElements = (elements: NodeListOf<HTMLElement>, className: string): void => {\n elements.forEach(element => {\n if (element && element.classList) {\n element.classList.remove(className);\n }\n });\n};\n\n/**\n * Безопасное выполнение операций с DOM\n */\nexport const safeDOMOperation = (operation: () => void, errorMessage: string): void => {\n try {\n if (typeof window === 'undefined') return;\n operation();\n } catch (error) {\n console.warn(errorMessage, error);\n }\n};\n\n/**\n * Проверка доступности DOM\n */\nexport const isDOMAvailable = (): boolean => {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n};","/*!\n\tCopyright (c) 2018 Jed Watson.\n\tLicensed under the MIT License (MIT), see\n\thttp://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\n\tfunction classNames () {\n\t\tvar classes = '';\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (arg) {\n\t\t\t\tclasses = appendClass(classes, parseValue(arg));\n\t\t\t}\n\t\t}\n\n\t\treturn classes;\n\t}\n\n\tfunction parseValue (arg) {\n\t\tif (typeof arg === 'string' || typeof arg === 'number') {\n\t\t\treturn arg;\n\t\t}\n\n\t\tif (typeof arg !== 'object') {\n\t\t\treturn '';\n\t\t}\n\n\t\tif (Array.isArray(arg)) {\n\t\t\treturn classNames.apply(null, arg);\n\t\t}\n\n\t\tif (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes('[native code]')) {\n\t\t\treturn arg.toString();\n\t\t}\n\n\t\tvar classes = '';\n\n\t\tfor (var key in arg) {\n\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\tclasses = appendClass(classes, key);\n\t\t\t}\n\t\t}\n\n\t\treturn classes;\n\t}\n\n\tfunction appendClass (value, newClass) {\n\t\tif (!newClass) {\n\t\t\treturn value;\n\t\t}\n\t\n\t\tif (value) {\n\t\t\treturn value + ' ' + newClass;\n\t\t}\n\t\n\t\treturn value + newClass;\n\t}\n\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tclassNames.default = classNames;\n\t\tmodule.exports = classNames;\n\t} else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\tdefine('classnames', [], function () {\n\t\t\treturn classNames;\n\t\t});\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n","/**\n * Модуль для динамического управления размером шрифта\n * Получает текущий размер каждого элемента и применяет процентное изменение\n */\n\nimport { FontSize } from '../types';\nimport { getTextElements, safeDOMOperation, isDOMAvailable } from './dom-manipulator';\n\n/**\n * Атрибут для хранения оригинального размера шрифта\n */\nconst ORIGINAL_FONT_SIZE_ATTR = 'data-original-font-size';\n\n/**\n * Коэффициенты изменения размера шрифта\n */\nconst FONT_SIZE_MULTIPLIERS = {\n small: 0.8, // 80% от оригинального размера\n standard: 1.0, // 100% - оригинальный размер\n large: 1.3, // 130% от оригинального размера\n} as const;\n\n/**\n * Получение вычисленного размера шрифта элемента в пикселях\n * \n * @param element - DOM элемент\n * @returns Размер шрифта в пикселях\n */\nconst getComputedFontSize = (element: HTMLElement): number => {\n const computedStyle = window.getComputedStyle(element);\n const fontSize = computedStyle.fontSize;\n return parseFloat(fontSize);\n};\n\n/**\n * Сохранение оригинального размера шрифта элемента\n * \n * @param element - DOM элемент\n */\nconst saveOriginalFontSize = (element: HTMLElement): void => {\n // Сохраняем оригинальный размер только если он еще не сохранен\n if (!element.hasAttribute(ORIGINAL_FONT_SIZE_ATTR)) {\n const originalSize = getComputedFontSize(element);\n element.setAttribute(ORIGINAL_FONT_SIZE_ATTR, originalSize.toString());\n }\n};\n\n/**\n * Получение оригинального размера шрифта элемента\n * \n * @param element - DOM элемент\n * @returns Оригинальный размер шрифта в пикселях\n */\nconst getOriginalFontSize = (element: HTMLElement): number => {\n const savedSize = element.getAttribute(ORIGINAL_FONT_SIZE_ATTR);\n if (savedSize) {\n return parseFloat(savedSize);\n }\n \n // Если оригинальный размер не сохранен, используем текущий\n const currentSize = getComputedFontSize(element);\n element.setAttribute(ORIGINAL_FONT_SIZE_ATTR, currentSize.toString());\n return currentSize;\n};\n\n/**\n * Применение нового размера шрифта к элементу\n * \n * @param element - DOM элемент\n * @param newSize - Новый размер шрифта в пикселях\n */\nconst applyFontSizeToElement = (element: HTMLElement, newSize: number): void => {\n element.style.fontSize = `${newSize}px`;\n};\n\n/**\n * Сброс размера шрифта элемента к оригинальному\n * \n * @param element - DOM элемент\n */\nconst resetElementFontSize = (element: HTMLElement): void => {\n element.style.fontSize = '';\n element.removeAttribute(ORIGINAL_FONT_SIZE_ATTR);\n};\n\n/**\n * Применение размера шрифта ко всем текстовым элементам\n * \n * @param size - Размер шрифта (small, standard, large)\n */\nexport const applyDynamicFontSize = (size: FontSize): void => {\n safeDOMOperation(() => {\n if (!isDOMAvailable()) return;\n\n const elements = getTextElements();\n const multiplier = FONT_SIZE_MULTIPLIERS[size];\n\n elements.forEach((element) => {\n try {\n if (size === 'standard') {\n // Для стандартного размера сбрасываем к оригинальному\n resetElementFontSize(element);\n } else {\n // Сохраняем оригинальный размер, если еще не сохранен\n saveOriginalFontSize(element);\n \n // Получаем оригинальный размер и применяем множитель\n const originalSize = getOriginalFontSize(element);\n const newSize = originalSize * multiplier;\n \n applyFontSizeToElement(element, newSize);\n }\n } catch (error) {\n console.warn('Ошибка при изменении размера шрифта элемента:', element, error);\n }\n });\n }, `Ошибка при применении динамического размера шрифта: ${size}`);\n};\n\n/**\n * Сброс всех изменений размера шрифта\n */\nexport const resetAllFontSizes = (): void => {\n safeDOMOperation(() => {\n if (!isDOMAvailable()) return;\n\n const elements = getTextElements();\n \n elements.forEach((element) => {\n try {\n resetElementFontSize(element);\n } catch (error) {\n console.warn('Ошибка при сбросе размера шрифта элемента:', element, error);\n }\n });\n }, 'Ошибка при сбросе всех размеров шрифта');\n};\n\n/**\n * Обновление размеров шрифта для новых элементов\n * Используется когда на страницу добавляются новые элементы динамически\n * \n * @param size - Текущий размер шрифта\n */\nexport const updateNewElementsFontSize = (size: FontSize): void => {\n if (size === 'standard') return;\n \n safeDOMOperation(() => {\n if (!isDOMAvailable()) return;\n\n const elements = getTextElements();\n const multiplier = FONT_SIZE_MULTIPLIERS[size];\n\n elements.forEach((element) => {\n // Применяем размер только к элементам, которые еще не обработаны\n if (!element.hasAttribute(ORIGINAL_FONT_SIZE_ATTR) && !element.style.fontSize) {\n try {\n saveOriginalFontSize(element);\n const originalSize = getOriginalFontSize(element);\n const newSize = originalSize * multiplier;\n applyFontSizeToElement(element, newSize);\n } catch (error) {\n console.warn('Ошибка при обновлении размера шрифта нового элемента:', element, error);\n }\n }\n });\n }, `Ошибка при обновлении размера шрифта новых элементов: ${size}`);\n};\n\n/**\n * Проверка, применены ли изменения размера шрифта\n * \n * @returns true, если размер шрифта изменен\n */\nexport const isFontSizeModified = (): boolean => {\n if (!isDOMAvailable()) return false;\n \n const elements = getTextElements();\n for (let i = 0; i < Math.min(elements.length, 10); i++) {\n if (elements[i].hasAttribute(ORIGINAL_FONT_SIZE_ATTR)) {\n return true;\n }\n }\n return false;\n};","/**\n * Модуль для применения CSS стилей доступности\n * Содержит функции для применения различных настроек доступности к DOM\n * \n * Реализует требования:\n * - 2.1, 2.2, 2.3: Настройка цветовой схемы\n * - 3.1, 3.2, 3.3: Настройка размера шрифта \n * - 4.1, 4.2: Управление отображением изображений\n */\nimport cn from 'classnames';\nimport { ColorScheme, FontSize, AccessibilitySettings } from '../types';\nimport { \n getImageElements, \n applyClassToElements, \n removeClassFromElements,\n safeDOMOperation,\n isDOMAvailable\n} from './dom-manipulator';\nimport { \n applyDynamicFontSize, \n resetAllFontSizes\n} from './font-size-manager';\n\n/**\n * CSS классы для различных настроек доступности\n */\nexport const CSS_CLASSES = {\n HIGH_CONTRAST: cn('accessibility-high-contrast'),\n FONT_SMALL: 'accessibility-font-small',\n FONT_LARGE: 'accessibility-font-large',\n HIDE_IMAGES: 'accessibility-hide-images',\n} as const;\n\n/**\n * Применение цветовой схемы\n * Реализует требования 2.1, 2.2, 2.3:\n * - high-contrast: Контрастный белый на черном\n * - grayscale: Черно-белый режим\n * - standard: Стандартное оформление\n */\nexport const applyColorScheme = (scheme: ColorScheme): void => {\n safeDOMOperation(() => {\n if (!isDOMAvailable()) return;\n\n // Удаляем существующие классы и стили высокого контраста перед применением нового режима\n document.body.classList.remove(CSS_CLASSES.HIGH_CONTRAST);\n document.body.style.filter = '';\n // Также удаляем стили высокого контраста со всех элементов\n removeHighContrastStylesFromAllElements();\n \n switch (scheme) {\n case 'high-contrast':\n // Требование 2.1: Контрастный белый на черном\n document.body.classList.add(CSS_CLASSES.HIGH_CONTRAST);\n // Также применяем стили высокого контраста ко всем элементам на странице\n applyHighContrastStylesToAllElements();\n break;\n case 'grayscale':\n // Требование 2.2: Черно-белый режим через CSS фильтр\n document.body.style.filter = 'grayscale(100%)';\n break;\n case 'standard':\n // Требование 2.3: Стандартное оформление\n break;\n default:\n console.warn(`Неизвестная цветовая схема: ${scheme}`);\n break;\n }\n }, `Ошибка при применении цветовой схемы: ${scheme}`);\n};\n\n/**\n * Применение настроек размера шрифта\n * Реализует требования 3.1, 3.2, 3.3:\n * - small: Уменьшение размера на 10% от текущего размера каждого элемента\n * - large: Увеличение размера на 10% от текущего размера каждого элемента\n * - standard: Восстановление оригинального размера шрифта\n */\nexport const applyFontSize = (size: FontSize): void => {\n // Используем новый модуль для динамического управления размером шрифта\n applyDynamicFontSize(size);\n};\n\n/**\n * Управление отображением изображений\n * Реализует требования 4.1, 4.2:\n * - false: Скрывать изображения через CSS свойство hidden\n * - true: Показывать изображения (восстановление видимости)\n * Требование 4.3: Сохраняет возможность восстановления без перезагрузки\n */\nexport const applyImageVisibility = (showImages: boolean): void => {\n safeDOMOperation(() => {\n if (!isDOMAvailable()) return;\n\n const elements = getImageElements();\n \n if (showImages) {\n // Требование 4.2: Показывать изображения (восстановление видимости)\n removeClassFromElements(elements, CSS_CLASSES.HIDE_IMAGES);\n } else {\n // Требование 4.1: Скрывать изображения через CSS класс\n applyClassToElements(elements, CSS_CLASSES.HIDE_IMAGES);\n }\n }, `Ошибка при управлении отображением изображений: ${showImages}`);\n};\n\n/**\n * Удаление всех CSS классов и стилей доступности\n */\nexport const removeAllAccessibilityStyles = (): void => {\n safeDOMOperation(() => {\n if (!isDOMAvailable()) return;\n\n // Удаляем классы с body\n document.body.classList.remove(CSS_CLASSES.HIGH_CONTRAST);\n document.body.classList.remove(CSS_CLASSES.FONT_SMALL);\n document.body.classList.remove(CSS_CLASSES.FONT_LARGE);\n document.body.style.filter = '';\n \n // Сбрасываем все изменения размера шрифта\n resetAllFontSizes();\n \n // Удаляем классы с изображений\n const imageElements = getImageElements();\n removeClassFromElements(imageElements, CSS_CLASSES.HIDE_IMAGES);\n\n // Удаляем стили высокого контраста со всех элементов\n removeHighContrastStylesFromAllElements();\n }, 'Ошибка при удалении всех стилей доступности');\n};\n\n/**\n * Применение всех настроек доступности\n * Применяет все переданные настройки одновременно\n */\nexport const applyAllSettings = (settings: AccessibilitySettings): void => {\n if (!settings.isEnabled) {\n // Если режим доступности выключен, удаляем все стили\n removeAllAccessibilityStyles();\n return;\n }\n\n // Применяем все настройки\n applyColorScheme(settings.colorScheme);\n applyFontSize(settings.fontSize);\n applyImageVisibility(settings.showImages);\n};\n\n/**\n * Применение стилей высокого контраста ко всем элементам на странице\n */\nexport const applyHighContrastStylesToAllElements = (): void => {\n safeDOMOperation(() => {\n if (!isDOMAvailable()) return;\n\n // Получаем все элементы на странице\n const allElements = document.querySelectorAll('*');\n \n allElements.forEach(element => {\n // Проверяем, что элемент является HTMLElement (имеет стиль)\n if (element instanceof HTMLElement) {\n // Применяем стили высокого контраста к каждому элементу\n element.style.backgroundColor = '#000';\n element.style.color = '#fff';\n element.style.borderColor = '#fff';\n }\n });\n\n // Особые стили для ссылок\n const links = document.querySelectorAll('a');\n links.forEach(link => {\n if (link instanceof HTMLElement) {\n link.style.color = '#ffff00'; // желтый цвет для ссылок\n }\n });\n\n // Особые стили для посещенных ссылок\n const visitedLinks = document.querySelectorAll('a:visited');\n visitedLinks.forEach(link => {\n if (link instanceof HTMLElement) {\n link.style.color = '#ff00ff'; // пурпурный для посещенных\n }\n });\n\n // Особые стили для кнопок\n const buttons = document.querySelectorAll('button');\n buttons.forEach(button => {\n if (button instanceof HTMLElement) {\n button.style.backgroundColor = '#fff';\n button.style.color = '#000';\n button.style.border = '2px solid #fff';\n }\n });\n\n // Особые стили для полей ввода\n const inputs = document.querySelectorAll('input, textarea, select');\n inputs.forEach(input => {\n if (input instanceof HTMLElement) {\n input.style.backgroundColor = '#fff';\n input.style.color = '#000';\n input.style.border = '2px solid #fff';\n }\n });\n }, 'Ошибка при применении стилей высокого контраста ко всем элементам');\n};\n\n/**\n * Удаление стилей высокого контраста со всех элементов на странице\n */\nexport const removeHighContrastStylesFromAllElements = (): void => {\n safeDOMOperation(() => {\n if (!isDOMAvailable()) return;\n\n // Получаем все элементы на странице\n const allElements = document.querySelectorAll('*');\n \n allElements.forEach(element => {\n // Проверяем, что элемент является HTMLElement (имеет стиль)\n if (element instanceof HTMLElement) {\n // Удаляем инлайновые стили высокого контраста\n element.style.backgroundColor = '';\n element.style.color = '';\n element.style.borderColor = '';\n }\n });\n\n // Сбрасываем особые стили для ссылок\n const links = document.querySelectorAll('a');\n links.forEach(link => {\n if (link instanceof HTMLElement) {\n link.style.color = '';\n }\n });\n\n // Сбрасываем особые стили для посещенных ссылок\n const visitedLinks = document.querySelectorAll('a:visited');\n visitedLinks.forEach(link => {\n if (link instanceof HTMLElement) {\n link.style.color = '';\n }\n });\n\n // Сбрасываем особые стили для кнопок\n const buttons = document.querySelectorAll('button');\n buttons.forEach(button => {\n if (button instanceof HTMLElement) {\n button.style.backgroundColor = '';\n button.style.color = '';\n button.style.border = '';\n }\n });\n\n // Сбрасываем особые стили для полей ввода\n const inputs = document.querySelectorAll('input, textarea, select');\n inputs.forEach(input => {\n if (input instanceof HTMLElement) {\n input.style.backgroundColor = '';\n input.style.color = '';\n input.style.border = '';\n }\n });\n }, 'Ошибка при удалении стилей высокого контраста со всех элементов');\n};\n\n/**\n * Применение конкретной настройки с проверкой общего режима\n * Применяет настройку только если общий режим доступности включен\n */\nexport const applySettingIfEnabled = (\n isEnabled: boolean,\n settingType: 'colorScheme' | 'fontSize' | 'imageVisibility',\n value: ColorScheme | FontSize | boolean\n): void => {\n if (!isEnabled) {\n return;\n }\n\n switch (settingType) {\n case 'colorScheme':\n applyColorScheme(value as ColorScheme);\n break;\n case 'fontSize':\n applyFontSize(value as FontSize);\n break;\n case 'imageVisibility':\n applyImageVisibility(value as boolean);\n break;\n default:\n console.warn(`Неизвестный тип настройки: ${settingType}`);\n }\n};","/**\n * Хук для управления настройками доступности\n * Обеспечивает централизованное управление состоянием настроек доступности\n * с автоматическим сохранением в localStorage и применением к DOM\n * \n * Реализует требования:\n * - 5.1: Включение режима доступности с активацией всех сохраненных настроек\n * - 5.2: Выключение режима доступности с удалением всех CSS классов и стилей\n * - 6.2: Загрузка настроек из localStorage при инициализации\n * - 6.3: Автоматическое применение сохраненных настроек при загрузке страницы\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { \n AccessibilitySettings, \n DEFAULT_ACCESSIBILITY_SETTINGS,\n AccessibilityContextType \n} from '../types';\nimport { \n saveToStorage, \n loadFromStorage, \n clearStorage \n} from '../lib/accessibility-storage';\nimport { \n applyAllSettings, \n removeAllAccessibilityStyles \n} from '../lib/css-applier';\nimport { updateNewElementsFontSize } from '../lib/font-size-manager';\n\n/**\n * Хук для управления настройками доступности\n * \n * @returns Объект с текущими настройками и методами для их управления\n */\nexport const useAccessibilitySettings = (): AccessibilityContextType => {\n // Состояние настроек доступности\n const [settings, setSettings] = useState<AccessibilitySettings>(DEFAULT_ACCESSIBILITY_SETTINGS);\n \n // Флаг загрузки настроек из localStorage (для SSR совместимости)\n const [isLoaded, setIsLoaded] = useState(false);\n\n /**\n * Наблюдатель за изменениями DOM для обработки динамически добавляемых элементов\n */\n useEffect(() => {\n if (typeof window === 'undefined' || !isLoaded || !settings.isEnabled) return;\n\n const observer = new MutationObserver((mutations) => {\n let hasNewTextElements = false;\n \n mutations.forEach((mutation) => {\n if (mutation.type === 'childList') {\n mutation.addedNodes.forEach((node) => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as Element;\n // Проверяем, есть ли текстовые элементы среди добавленных\n if (element.matches('h1, h2, h3, h4, h5, h6, p, span, a, button, label, li, div') ||\n element.querySelector('h1, h2, h3, h4, h5, h6, p, span, a, button, label, li, div')) {\n hasNewTextElements = true;\n }\n }\n });\n }\n });\n\n // Если добавлены новые текстовые элементы, применяем к ним текущие настройки размера шрифта\n if (hasNewTextElements && settings.fontSize !== 'standard') {\n setTimeout(() => {\n updateNewElementsFontSize(settings.fontSize);\n }, 100); // Небольшая задержка для завершения рендеринга\n }\n });\n\n observer.observe(document.body, {\n childList: true,\n subtree: true\n });\n\n return () => {\n observer.disconnect();\n };\n }, [isLoaded, settings.isEnabled, settings.fontSize]);\n\n /**\n * Загрузка настроек из localStorage при инициализации\n * Реализует требования 6.2, 6.3: Восстановление сохраненных настроек\n * Обеспечивает SSR совместимость с проверкой window\n */\n useEffect(() => {\n // SSR совместимость: выполняем только на клиенте\n if (typeof window === 'undefined') {\n return;\n }\n\n try {\n // Требование 6.2: Загрузка настроек из localStorage\n const savedSettings = loadFromStorage();\n \n if (savedSettings) {\n setSettings(savedSettings);\n \n // Требование 6.3: Автоматическое применение сохраненных настроек\n // Применяем настройки только если режим доступности включен\n if (savedSettings.isEnabled) {\n applyAllSettings(savedSettings);\n }\n }\n } catch (error) {\n console.warn('Ошибка при загрузке настроек доступности:', error);\n // При ошибке используем настройки по умолчанию\n setSettings(DEFAULT_ACCESSIBILITY_SETTINGS);\n } finally {\n // Отмечаем, что настройки загружены\n setIsLoaded(true);\n }\n }, []);\n\n /**\n * Сохранение настроек в localStorage при изменении\n * Реализует автоматическое сохранение всех изменений настроек\n */\n useEffect(() => {\n // Сохраняем только после первоначальной загрузки\n if (!isLoaded) {\n return;\n }\n\n try {\n // Сохраняем настройки в localStorage\n saveToStorage(settings);\n \n // Применяем настройки к DOM только если режим доступности включен\n if (settings.isEnabled) {\n applyAllSettings(settings);\n } else {\n // Если режим выключен, удаляем все стили доступности\n removeAllAccessibilityStyles();\n }\n } catch (error) {\n console.warn('Ошибка при сохранении настроек доступности:', error);\n }\n }, [settings, isLoaded]);\n\n /**\n * Обновление настроек доступности\n * Позволяет частично обновить настройки, сохраняя остальные значения\n * \n * @param updates - Частичные обновления настроек\n */\n const updateSettings = useCallback((updates: Partial<AccessibilitySettings>): void => {\n setSettings(prevSettings => {\n const newSettings = { ...prevSettings, ...updates };\n \n // Если выключается общий режим доступности, удаляем все стили немедленно\n if (prevSettings.isEnabled && !newSettings.isEnabled) {\n // Требование 5.2: Выключение режима доступности с удалением всех стилей\n removeAllAccessibilityStyles();\n }\n \n return newSettings;\n });\n }, []);\n\n /**\n * Сброс настроек к значениям по умолчанию\n * Удаляет все примененные стили и очищает localStorage\n */\n const resetSettings = useCallback((): void => {\n try {\n // Удаляем все примененные стили доступности\n removeAllAccessibilityStyles();\n \n // Сбрасываем настройки к значениям по умолчанию\n setSettings(DEFAULT_ACCESSIBILITY_SETTINGS);\n \n // Очищаем localStorage\n clearStorage();\n } catch (error) {\n console.warn('Ошибка при сбросе настроек доступности:', error);\n }\n }, []);\n\n return {\n settings,\n updateSettings,\n resetSettings,\n isLoaded,\n };\n};\n\n/**\n * Хук для управления конкретной настройкой доступности\n * Предоставляет удобный интерфейс для работы с отдельными настройками\n * \n * @param settingKey - Ключ настройки для управления\n * @returns Значение настройки и функция для её обновления\n */\nexport const useAccessibilitySetting = <K extends keyof AccessibilitySettings>(\n settingKey: K\n): [AccessibilitySettings[K], (value: AccessibilitySettings[K]) => void] => {\n const { settings, updateSettings } = useAccessibilitySettings();\n \n const setValue = useCallback((value: AccessibilitySettings[K]) => {\n updateSettings({ [settingKey]: value } as Partial<AccessibilitySettings>);\n }, [settingKey, updateSettings]);\n \n return [settings[settingKey], setValue];\n};\n\n/**\n * Хук для управления общим режимом доступности\n * Предоставляет удобный интерфейс для включения/выключения всех настроек\n * \n * @returns Состояние режима доступности и функция для его переключения\n */\nexport const useAccessibilityToggle = (): [boolean, (enabled: boolean) => void] => {\n const { settings, updateSettings } = useAccessibilitySettings();\n \n const setEnabled = useCallback((enabled: boolean) => {\n // Требование 5.1: Включение режима доступности с активацией всех настроек\n // Требование 5.2: Выключение режима доступности с удалением всех стилей\n updateSettings({ isEnabled: enabled });\n }, [updateSettings]);\n \n return [settings.isEnabled, setEnabled];\n};\n\nexport default useAccessibilitySettings;","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n var key = null;\n void 0 !== maybeKey && (key = \"\" + maybeKey);\n void 0 !== config.key && (key = \"\" + config.key);\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n config = maybeKey.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n ref: void 0 !== config ? config : null,\n props: maybeKey\n };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","/**\n * @license React\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function getComponentNameFromType(type) {\n if (null == type) return null;\n if (\"function\" === typeof type)\n return type.$$typeof === REACT_CLIENT_REFERENCE\n ? null\n : type.displayName || type.name || null;\n if (\"string\" === typeof type) return type;\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return \"Fragment\";\n case REACT_PROFILER_TYPE:\n return \"Profiler\";\n case REACT_STRICT_MODE_TYPE:\n return \"StrictMode\";\n case REACT_SUSPENSE_TYPE:\n return \"Suspense\";\n case REACT_SUSPENSE_LIST_TYPE:\n return \"SuspenseList\";\n case REACT_ACTIVITY_TYPE:\n return \"Activity\";\n }\n if (\"object\" === typeof type)\n switch (\n (\"number\" === typeof type.tag &&\n console.error(\n \"Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue.\"\n ),\n type.$$typeof)\n ) {\n case REACT_PORTAL_TYPE:\n return \"Portal\";\n case REACT_CONTEXT_TYPE:\n return type.displayName || \"Context\";\n case REACT_CONSUMER_TYPE:\n return (type._context.displayName || \"Context\") + \".Consumer\";\n case REACT_FORWARD_REF_TYPE:\n var innerType = type.render;\n type = type.displayName;\n type ||\n ((type = innerType.displayName || innerType.name || \"\"),\n (type = \"\" !== type ? \"ForwardRef(\" + type + \")\" : \"ForwardRef\"));\n return type;\n case REACT_MEMO_TYPE:\n return (\n (innerType = type.displayName || null),\n null !== innerType\n ? innerType\n : getComponentNameFromType(type.type) || \"Memo\"\n );\n case REACT_LAZY_TYPE:\n innerType = type._payload;\n type = type._init;\n try {\n return getComponentNameFromType(type(innerType));\n } catch (x) {}\n }\n return null;\n }\n function testStringCoercion(value) {\n return \"\" + value;\n }\n function checkKeyStringCoercion(value) {\n try {\n testStringCoercion(value);\n var JSCompiler_inline_result = !1;\n } catch (e) {\n JSCompiler_inline_result = !0;\n }\n if (JSCompiler_inline_result) {\n JSCompiler_inline_result = console;\n var JSCompiler_temp_const = JSCompiler_inline_result.error;\n var JSCompiler_inline_result$jscomp$0 =\n (\"function\" === typeof Symbol &&\n Symbol.toStringTag &&\n value[Symbol.toStringTag]) ||\n value.constructor.name ||\n \"Object\";\n JSCompiler_temp_const.call(\n JSCompiler_inline_result,\n \"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.\",\n JSCompiler_inline_result$jscomp$0\n );\n return testStringCoercion(value);\n }\n }\n function getTaskName(type) {\n if (type === REACT_FRAGMENT_TYPE) return \"<>\";\n if (\n \"object\" === typeof type &&\n null !== type &&\n type.$$typeof === REACT_LAZY_TYPE\n )\n return \"<...>\";\n try {\n var name = getComponentNameFromType(type);\n return name ? \"<\" + name + \">\" : \"<...>\";\n } catch (x) {\n return \"<...>\";\n }\n }\n function getOwner() {\n var dispatcher = ReactSharedInternals.A;\n return null === dispatcher ? null : dispatcher.getOwner();\n }\n function UnknownOwner() {\n return Error(\"react-stack-top-frame\");\n }\n function hasValidKey(config) {\n if (hasOwnProperty.call(config, \"key\")) {\n var getter = Object.getOwnPropertyDescriptor(config, \"key\").get;\n if (getter && getter.isReactWarning) return !1;\n }\n return void 0 !== config.key;\n }\n function defineKeyPropWarningGetter(props, displayName) {\n function warnAboutAccessingKey() {\n specialPropKeyWarningShown ||\n ((specialPropKeyWarningShown = !0),\n console.error(\n \"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)\",\n displayName\n ));\n }\n warnAboutAccessingKey.isReactWarning = !0;\n Object.defineProperty(props, \"key\", {\n get: warnAboutAccessingKey,\n configurable: !0\n });\n }\n function elementRefGetterWithDeprecationWarning() {\n var componentName = getComponentNameFromType(this.type);\n didWarnAboutElementRef[componentName] ||\n ((didWarnAboutElementRef[componentName] = !0),\n console.error(\n \"Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.\"\n ));\n componentName = this.props.ref;\n return void 0 !== componentName ? componentName : null;\n }\n function ReactElement(type, key, props, owner, debugStack, debugTask) {\n var refProp = props.ref;\n type = {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n props: props,\n _owner: owner\n };\n null !== (void 0 !== refProp ? refProp : null)\n ? Object.defineProperty(type, \"ref\", {\n enumerable: !1,\n get: elementRefGetterWithDeprecationWarning\n })\n : Object.defineProperty(type, \"ref\", { enumerable: !1, value: null });\n type._store = {};\n Object.defineProperty(type._store, \"validated\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: 0\n });\n Object.defineProperty(type, \"_debugInfo\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: null\n });\n Object.defineProperty(type, \"_debugStack\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugStack\n });\n Object.defineProperty(type, \"_debugTask\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugTask\n });\n Object.freeze && (Object.freeze(type.props), Object.freeze(type));\n return type;\n }\n function jsxDEVImpl(\n type,\n config,\n maybeKey,\n isStaticChildren,\n debugStack,\n debugTask\n ) {\n var children = config.children;\n if (void 0 !== children)\n if (isStaticChildren)\n if (isArrayImpl(children)) {\n for (\n isStaticChildren = 0;\n isStaticChildren < children.length;\n isStaticChildren++\n )\n validateChildKeys(children[isStaticChildren]);\n Object.freeze && Object.freeze(children);\n } else\n console.error(\n \"React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.\"\n );\n else validateChildKeys(children);\n if (hasOwnProperty.call(config, \"key\")) {\n children = getComponentNameFromType(type);\n var keys = Object.keys(config).filter(function (k) {\n return \"key\" !== k;\n });\n isStaticChildren =\n 0 < keys.length\n ? \"{key: someKey, \" + keys.join(\": ..., \") + \": ...}\"\n : \"{key: someKey}\";\n didWarnAboutKeySpread[children + isStaticChildren] ||\n ((keys =\n 0 < keys.length ? \"{\" + keys.join(\": ..., \") + \": ...}\" : \"{}\"),\n console.error(\n 'A props object containing a \"key\" prop is being spread into JSX:\\n let props = %s;\\n <%s {...props} />\\nReact keys must be passed directly to JSX without using spread:\\n let props = %s;\\n <%s key={someKey} {...props} />',\n isStaticChildren,\n children,\n keys,\n children\n ),\n (didWarnAboutKeySpread[children + isStaticChildren] = !0));\n }\n children = null;\n void 0 !== maybeKey &&\n (checkKeyStringCoercion(maybeKey), (children = \"\" + maybeKey));\n hasValidKey(config) &&\n (checkKeyStringCoercion(config.key), (children = \"\" + config.key));\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n children &&\n defineKeyPropWarningGetter(\n maybeKey,\n \"function\" === typeof type\n ? type.displayName || type.name || \"Unknown\"\n : type\n );\n return ReactElement(\n type,\n children,\n maybeKey,\n getOwner(),\n debugStack,\n debugTask\n );\n }\n function validateChildKeys(node) {\n isValidElement(node)\n ? node._store && (node._store.validated = 1)\n : \"object\" === typeof node &&\n null !== node &&\n node.$$typeof === REACT_LAZY_TYPE &&\n (\"fulfilled\" === node._payload.status\n ? isValidElement(node._payload.value) &&\n node._payload.value._store &&\n (node._payload.value._store.validated = 1)\n : node._store && (node._store.validated = 1));\n }\n function isValidElement(object) {\n return (\n \"object\" === typeof object &&\n null !== object &&\n object.$$typeof === REACT_ELEMENT_TYPE\n );\n }\n var React = require(\"react\"),\n REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_PORTAL_TYPE = Symbol.for(\"react.portal\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\"),\n REACT_STRICT_MODE_TYPE = Symbol.for(\"react.strict_mode\"),\n REACT_PROFILER_TYPE = Symbol.for(\"react.profiler\"),\n REACT_CONSUMER_TYPE = Symbol.for(\"react.consumer\"),\n REACT_CONTEXT_TYPE = Symbol.for(\"react.context\"),\n REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\"),\n REACT_SUSPENSE_TYPE = Symbol.for(\"react.suspense\"),\n REACT_SUSPENSE_LIST_TYPE = Symbol.for(\"react.suspense_list\"),\n REACT_MEMO_TYPE = Symbol.for(\"react.memo\"),\n REACT_LAZY_TYPE = Symbol.for(\"react.lazy\"),\n REACT_ACTIVITY_TYPE = Symbol.for(\"react.activity\"),\n REACT_CLIENT_REFERENCE = Symbol.for(\"react.client.reference\"),\n ReactSharedInternals =\n React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n hasOwnProperty = Object.prototype.hasOwnProperty,\n isArrayImpl = Array.isArray,\n createTask = console.createTask\n ? console.createTask\n : function () {\n return null;\n };\n React = {\n react_stack_bottom_frame: function (callStackForError) {\n return callStackForError();\n }\n };\n var specialPropKeyWarningShown;\n var didWarnAboutElementRef = {};\n var unknownOwnerDebugStack = React.react_stack_bottom_frame.bind(\n React,\n UnknownOwner\n )();\n var unknownOwnerDebugTask = createTask(getTaskName(UnknownOwner));\n var didWarnAboutKeySpread = {};\n exports.Fragment = REACT_FRAGMENT_TYPE;\n exports.jsx = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !1,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n exports.jsxs = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !0,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n })();\n","/**\n * Контекст для управления настройками доступности\n * Обеспечивает единое состояние для всех компонентов панели доступности\n */\n\nimport React, { createContext, useContext, ReactNode } from 'react';\nimport { AccessibilityContextType } from '../types';\nimport { useAccessibilitySettings } from '../hooks/useAccessibilitySettings';\n\n/**\n * Контекст настроек доступности\n */\nconst AccessibilityContext = createContext<AccessibilityContextType | null>(null);\n\n/**\n * Свойства провайдера контекста\n */\ninterface AccessibilityProviderProps {\n children: ReactNode;\n}\n\n/**\n * Провайдер контекста настроек доступности\n * \n * @param props - Свойства провайдера\n * @returns JSX элемент с провайдером контекста\n */\nexport const AccessibilityProvider: React.FC<AccessibilityProviderProps> = ({ children }) => {\n const accessibilityState = useAccessibilitySettings();\n\n return (\n <AccessibilityContext.Provider value={accessibilityState}>\n {children}\n </AccessibilityContext.Provider>\n );\n};\n\n/**\n * Хук для использования контекста настроек доступности\n * \n * @returns Контекст настроек доступности\n * @throws Ошибка, если хук используется вне провайдера\n */\nexport const useAccessibilityContext = (): AccessibilityContextType => {\n const context = useContext(AccessibilityContext);\n \n if (!context) {\n throw new Error('useAccessibilityContext должен использоваться внутри AccessibilityProvider');\n }\n \n return context;\n};\n\nexport default AccessibilityProvider;","/**\n * Компонент главного переключателя режима доступности\n * Предоставляет переключатель для включения/выключения всех настроек доступности\n * \n * Реализует требования:\n * - 5.1: Включение режима доступности с активацией всех сохраненных настроек\n * - 5.2: Выключение режима доступности с удалением всех CSS классов и стилей\n * - 5.3: Возврат страницы к исходному состоянию без настроек доступности\n */\n\nimport React from 'react';\nimport { useAccessibilityContext } from '../../context/AccessibilityContext';\nimport styles from './AccessibilityToggle.module.scss';\n\n/**\n * Свойства компонента AccessibilityToggle\n */\ninterface AccessibilityToggleProps {\n /** CSS класс для дополнительной стилизации */\n className?: string;\n}\n\n/**\n * Компонент главного переключателя режима доступности\n * \n * @param props - Свойства компонента\n * @returns JSX элемент с переключателем общего режима доступности\n */\nexport const AccessibilityToggle: React.FC<AccessibilityToggleProps> = ({ \n className \n}) => {\n // Используем контекст для получения состояния и методов управления\n const { settings, updateSettings } = useAccessibilityContext();\n const isEnabled = settings.isEnabled;\n\n /**\n * Обработчик изменения общего режима доступности\n * \n * @param event - Событие изменения чекбокса\n */\n const handleToggleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n updateSettings({ isEnabled: event.target.checked });\n };\n\n return (\n <div className={`${styles.accessibilityToggle} ${className || ''} ${settings.colorScheme === 'high-contrast' ? styles.highContrastMode : ''}`}>\n <div className={styles.toggleContainer}>\n <label className={styles.toggleLabel}>\n <input\n type=\"checkbox\"\n checked={isEnabled}\n onChange={handleToggleChange}\n className={styles.toggleInput}\n aria-describedby=\"accessibility-toggle-description\"\n />\n \n <span className={styles.toggleSlider} aria-hidden=\"true\">\n <span className={styles.toggleThumb} />\n </span>\n \n <div className={styles.toggleContent}>\n <span className={styles.toggleTitle}>\n Режим доступности\n </span>\n <span className={styles.toggleStatus}>\n {isEnabled ? 'Включен' : 'Выключен'}\n </span>\n </div>\n </label>\n \n <p \n id=\"accessibility-toggle-description\"\n className={styles.description}\n >\n {isEnabled \n ? 'Все настройки доступности активны. Используйте элементы управления ниже для точной настройки.' \n : 'Включите режим доступности для активации всех настроек. При выключении все изменения будут сброшены.'\n }\n </p>\n </div>\n </div>\n );\n};\n\nexport default AccessibilityToggle;","/**\n * Компонент управления цветовой схемой\n * Предоставляет радио-кнопки для выбора цветовой схемы доступности\n * \n * Реализует требования:\n * - 2.1: Применение высококонтрастной цветовой схемы\n * - 2.2: Применение черно-белой цветовой схемы\n * - 2.3: Возврат к стандартной цветовой схеме\n */\n\nimport React from 'react';\nimport { ColorScheme } from '../../types';\nimport { useAccessibilityContext } from '../../context/AccessibilityContext';\nimport styles from './ColorSchemeControl.module.scss';\n\n/**\n * Свойства компонента ColorSchemeControl\n */\ninterface ColorSchemeControlProps {\n /** CSS класс для дополнительной стилизации */\n className?: string;\n}\n\n/**\n * Опции цветовых схем с описаниями\n */\nconst COLOR_SCHEME_OPTIONS: Array<{\n value: ColorScheme;\n label: string;\n description: string;\n}> = [\n {\n value: 'standard',\n label: 'Стандартный',\n description: 'Обычная цветовая схема сайта'\n },\n {\n value: 'high-contrast',\n label: 'Контрастный белый на черном',\n description: 'Высококонтрастная схема для лучшей читаемости'\n },\n {\n value: 'grayscale',\n label: 'Черно-белый',\n description: 'Преобразование всех цветов в оттенки серого'\n }\n];\n\n/**\n * Компонент управления цветовой схемой\n * \n * @param props - Свойства компонента\n * @returns JSX элемент с радио-кнопками для выбора цветовой схемы\n */\nexport const ColorSchemeControl: React.FC<ColorSchemeControlProps> = ({ \n className \n}) => {\n // Используем контекст для получения состояния и методов управления\n const { settings, updateSettings } = useAccessibilityContext();\n const colorScheme = settings.colorScheme;\n const isEnabled = settings.isEnabled;\n\n /**\n * Обработчик изменения цветовой схемы\n * \n * @param event - Событие изменения радио-кнопки\n */\n const handleColorSchemeChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const newColorScheme = event.target.value as ColorScheme;\n updateSettings({ colorScheme: newColorScheme });\n };\n\n return (\n <div className={`${styles.colorSchemeControl} ${className || ''} ${!isEnabled ? styles.disabled : ''} ${colorScheme === 'high-contrast' ? styles.highContrastMode : ''}`}>\n <h4 className={styles.title}>\n Цветовая схема\n </h4>\n \n <div className={styles.optionsContainer} role=\"radiogroup\" aria-labelledby=\"color-scheme-title\">\n {COLOR_SCHEME_OPTIONS.map((option) => (\n <label \n key={option.value}\n className={`${styles.option} ${colorScheme === option.value ? styles.selected : ''} ${!isEnabled ? styles.optionDisabled : ''}`}\n >\n <input\n type=\"radio\"\n name=\"colorScheme\"\n value={option.value}\n checked={colorScheme === option.value}\n onChange={handleColorSchemeChange}\n className={styles.radioInput}\n aria-describedby={`color-scheme-${option.value}-description`}\n disabled={!isEnabled}\n />\n \n <div className={styles.optionContent}>\n <span className={styles.optionLabel}>\n {option.label}\n </span>\n <span \n id={`color-scheme-${option.value}-description`}\n className={styles.optionDescription}\n >\n {option.description}\n </span>\n </div>\n \n <div className={styles.radioIndicator} aria-hidden=\"true\" />\n </label>\n ))}\n </div>\n </div>\n );\n};\n\nexport default ColorSchemeControl;","/**\n * Компонент управления размером шрифта\n * Предоставляет радио-кнопки для выбора размера шрифта\n * \n * Реализует требования:\n * - 3.1: Уменьшение размера шрифта на 10%\n * - 3.2: Увеличение размера шрифта на 10%\n * - 3.3: Возврат к стандартному размеру шрифта\n */\n\nimport React from 'react';\nimport { FontSize } from '../../types';\nimport { useAccessibilityContext } from '../../context/AccessibilityContext';\nimport styles from './FontSizeControl.module.scss';\n\n/**\n * Свойства компонента FontSizeControl\n */\ninterface FontSizeControlProps {\n /** CSS класс для дополнительной стилизации */\n className?: string;\n}\n\n/**\n * Опции размеров шрифта с описаниями\n */\nconst FONT_SIZE_OPTIONS: Array<{\n value: FontSize;\n label: string;\n description: string;\n}> = [\n {\n value: 'small',\n label: 'Мелкий',\n description: 'Уменьшенный размер текста (80%)'\n },\n {\n value: 'standard',\n label: 'Стандартный',\n description: 'Обычный размер текста'\n },\n {\n value: 'large',\n label: 'Крупный',\n description: 'Увеличенный размер текста (130%)'\n }\n];\n\n/**\n * Компонент управления размером шрифта\n * \n * @param props - Свойства компонента\n * @returns JSX элемент с радио-кнопками для выбора размера шрифта\n */\nexport const FontSizeControl: React.FC<FontSizeControlProps> = ({ \n className \n}) => {\n // Используем контекст для получения состояния и методов управления\n const { settings, updateSettings } = useAccessibilityContext();\n const fontSize = settings.fontSize;\n const isEnabled = settings.isEnabled;\n\n /**\n * Обработчик изменения размера шрифта\n * \n * @param event - Событие изменения радио-кнопки\n */\n const handleFontSizeChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const newFontSize = event.target.value as FontSize;\n updateSettings({ fontSize: newFontSize });\n };\n\n return (\n <div className={`${styles.fontSizeControl} ${className || ''} ${!isEnabled ? styles.disabled : ''} ${settings.colorScheme === 'high-contrast' ? styles.highContrastMode : ''}`}>\n <h4 className={styles.title}>\n Размер шрифта\n </h4>\n \n <div className={styles.optionsContainer} role=\"radiogroup\" aria-labelledby=\"font-size-title\">\n {FONT_SIZE_OPTIONS.map((option) => (\n <label \n key={option.value}\n className={`${styles.option} ${fontSize === option.value ? styles.selected : ''} ${!isEnabled ? styles.optionDisabled : ''}`}\n >\n <input\n type=\"radio\"\n name=\"fontSize\"\n value={option.value}\n checked={fontSize === option.value}\n onChange={handleFontSizeChange}\n className={styles.radioInput}\n aria-describedby={`font-size-${option.value}-description`}\n disabled={!isEnabled}\n />\n \n <div className={styles.optionContent}>\n <span className={styles.optionLabel}>\n {option.label}\n </span>\n <span \n id={`font-size-${option.value}-description`}\n className={styles.optionDescription}\n >\n {option.description}\n </span>\n </div>\n \n <div className={styles.radioIndicator} aria-hidden=\"true\" />\n </label>\n ))}\n </div>\n </div>\n );\n};\n\nexport default FontSizeControl;","/**\n * Компонент управления отображением изображений\n * Предоставляет переключатель для скрытия/показа изображений\n * \n * Реализует требования:\n * - 4.1: Скрытие изображений через CSS свойство hidden\n * - 4.2: Восстановление видимости изображений\n */\n\nimport React from 'react';\nimport { useAccessibilityContext } from '../../context/AccessibilityContext';\nimport styles from './ImageControl.module.scss';\n\n/**\n * Свойства компонента ImageControl\n */\ninterface ImageControlProps {\n /** CSS класс для дополнительной стилизации */\n className?: string;\n}\n\n/**\n * Компонент управления отображением изображений\n * \n * @param props - Свойства компонента\n * @returns JSX элемент с переключателем для управления изображениями\n */\nexport const ImageControl: React.FC<ImageControlProps> = ({ \n className \n}) => {\n // Используем контекст для получения состояния и методов управления\n const { settings, updateSettings } = useAccessibilityContext();\n const showImages = settings.showImages;\n const isEnabled = settings.isEnabled;\n\n /**\n * Обработчик изменения настройки отображения изображений\n * \n * @param event - Событие изменения чекбокса\n */\n const handleImageVisibilityChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n updateSettings({ showImages: event.target.checked });\n };\n\n return (\n <div className={`${styles.imageControl} ${className || ''} ${!isEnabled ? styles.disabled : ''} ${settings.colorScheme === 'high-contrast' ? styles.highContrastMode : ''}`}>\n <h4 className={styles.title}>\n Изображения\n </h4>\n \n <div className={styles.switchContainer}>\n <label className={`${styles.switchLabel} ${!isEnabled ? styles.switchDisabled : ''}`}>\n <input\n type=\"checkbox\"\n checked={showImages}\n onChange={handleImageVisibilityChange}\n className={styles.switchInput}\n aria-describedby=\"image-control-description\"\n disabled={!isEnabled}\n />\n \n <span className={styles.switchSlider} aria-hidden=\"true\">\n <span className={styles.switchThumb} />\n </span>\n \n <span className={styles.switchText}>\n {showImages ? 'Показывать изображения' : 'Скрывать изображения'}\n </span>\n </label>\n \n <p \n id=\"image-control-description\"\n className={styles.description}\n >\n {showImages \n ? 'Изображения отображаются на странице' \n : 'Изображения скрыты для лучшей концентрации на тексте'\n }\n </p>\n </div>\n </div>\n );\n};\n\nexport default ImageControl;","/**\n * Основной компонент панели доступности\n * Объединяет все подкомпоненты управления настройками доступности\n * \n * Реализует требования:\n * - 1.1: Отображение панели доступности при клике на кнопку\n * - 1.2: Закрытие панели кликом вне области или по кнопке закрытия\n * - 1.3: Скрытие панели без изменения текущих настроек\n */\n\nimport React, { useEffect, useRef } from 'react';\nimport { AccessibilityPanelProps } from '../../types';\nimport { AccessibilityProvider, useAccessibilityContext } from '../../context/AccessibilityContext';\nimport { AccessibilityToggle } from '../AccessibilityToggle/AccessibilityToggle';\nimport { ColorSchemeControl } from '../ColorSchemeControl/ColorSchemeControl';\nimport { FontSizeControl } from '../FontSizeControl/FontSizeControl';\nimport { ImageControl } from '../ImageControl/ImageControl';\nimport cn from 'classnames';\nimport * as stylesImport from './AccessibilityPanel.module.scss';\n\n// Обеспечиваем безопасный доступ к стилям\nconst styles = typeof stylesImport === 'object' && stylesImport.default ? stylesImport.default : stylesImport.default || stylesImport;\n\n/**\n * Внутренний компонент панели доступности\n * Содержит всю логику панели, обернутый в провайдер контекста\n */\nconst AccessibilityPanelInner: React.FC<AccessibilityPanelProps> = ({\n isOpen,\n onClose,\n position = 'top-right'\n}) => {\n const panelRef = useRef<HTMLDivElement>(null);\n\n /**\n * Обработка клика вне области панели для закрытия\n * Реализует требование 1.2: Закрытие панели кликом вне области\n */\n useEffect(() => {\n if (!isOpen) return;\n\n const handleClickOutside = (event: MouseEvent) => {\n if (panelRef.current && !panelRef.current.contains(event.target as Node)) {\n onClose();\n }\n };\n\n // Добавляем обработчик с небольшой задержкой, чтобы избежать немедленного закрытия\n const timeoutId = setTimeout(() => {\n document.addEventListener('mousedown', handleClickOutside);\n }, 100);\n\n return () => {\n clearTimeout(timeoutId);\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [isOpen, onClose]);\n\n /**\n * Обработка нажатия клавиши Escape для закрытия панели\n * Реализует требование 1.2: Закрытие панели по клавише Escape\n */\n useEffect(() => {\n if (!isOpen) return;\n\n const handleEscapeKey = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n onClose();\n }\n };\n\n document.addEventListener('keydown', handleEscapeKey);\n\n return () => {\n document.removeEventListener('keydown', handleEscapeKey);\n };\n }, [isOpen, onClose]);\n\n /**\n * Обработчик закрытия панели по кнопке\n * \n * @param event - Событие клика\n */\n const handleCloseClick = (event: React.MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n onClose();\n };\n\n // Если панель закрыта, не рендерим её\n if (!isOpen) {\n return null;\n }\n\n const { settings } = useAccessibilityContext();\n\n return (\n <div className={cn(styles.stickyContainer)}>\n <div\n ref={panelRef}\n className={cn(\n styles.panel,\n styles[position],\n settings.colorScheme === 'high-contrast' && styles.highContrastMode\n )}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"accessibility-panel-title\"\n aria-describedby=\"accessibility-panel-description\"\n >\n <div className={cn(styles.header)}>\n <h3 id=\"accessibility-panel-title\" className={cn(styles.title)}>\n Настройки доступности\n </h3>\n \n <button\n onClick={handleCloseClick}\n className={cn(styles.closeButton)}\n aria-label=\"Закрыть панель настроек доступности\"\n type=\"button\"\n >\n ×\n </button>\n </div>\n\n <div\n id=\"accessibility-panel-description\"\n className={cn(styles.description)}\n >\n Настройте отображение страницы для улучшения доступности\n </div>\n\n <div className={cn(styles.content)}>\n <AccessibilityToggle />\n \n <div className={cn(styles.controls)}>\n <ColorSchemeControl />\n <FontSizeControl />\n <ImageControl />\n </div>\n </div>\n </div>\n </div>\n );\n};\n\n/**\n * Основной компонент панели доступности с провайдером контекста\n * \n * @param props - Свойства компонента\n * @returns JSX элемент с полной панелью настроек доступности\n */\nexport const AccessibilityPanel: React.FC<AccessibilityPanelProps> = (props) => {\n return (\n <AccessibilityProvider>\n <AccessibilityPanelInner {...props} />\n </AccessibilityProvider>\n );\n};\n\nexport default AccessibilityPanel;"],"names":["DEFAULT_ACCESSIBILITY_SETTINGS","isEnabled","colorScheme","fontSize","showImages","STORAGE_KEY","saveToStorage","settings","window","localStorage","setItem","JSON","stringify","error","console","warn","loadFromStorage","saved","getItem","validateSettings","parse","clearStorage","removeItem","s","includes","getTextElements","document","querySelectorAll","getImageElements","applyClassToElements","elements","className","forEach","element","classList","add","removeClassFromElements","remove","safeDOMOperation","operation","errorMessage","isDOMAvailable","hasOwn","hasOwnProperty","classNames","classes","i","arguments","length","arg","appendClass","parseValue","Array","isArray","apply","toString","Object","prototype","key","call","value","newClass","module","exports","default","ORIGINAL_FONT_SIZE_ATTR","FONT_SIZE_MULTIPLIERS","small","standard","large","getComputedFontSize","getComputedStyle","parseFloat","saveOriginalFontSize","hasAttribute","originalSize","setAttribute","getOriginalFontSize","savedSize","getAttribute","currentSize","applyFontSizeToElement","newSize","style","resetElementFontSize","removeAttribute","applyDynamicFontSize","size","multiplier","resetAllFontSizes","updateNewElementsFontSize","CSS_CLASSES","HIGH_CONTRAST","cn","FONT_SMALL","FONT_LARGE","HIDE_IMAGES","applyColorScheme","scheme","body","filter","removeHighContrastStylesFromAllElements","applyHighContrastStylesToAllElements","applyFontSize","applyImageVisibility","removeAllAccessibilityStyles","imageElements","applyAllSettings","HTMLElement","backgroundColor","color","borderColor","link","button","border","input","useAccessibilitySettings","setSettings","useState","isLoaded","setIsLoaded","useEffect","observer","MutationObserver","mutations","hasNewTextElements","mutation","type","addedNodes","node","nodeType","Node","ELEMENT_NODE","matches","querySelector","setTimeout","observe","childList","subtree","disconnect","savedSettings","updateSettings","useCallback","updates","prevSettings","newSettings","resetSettings","process","env","NODE_ENV","jsxRuntimeModule","REACT_ELEMENT_TYPE","Symbol","for","REACT_FRAGMENT_TYPE","jsxProd","config","maybeKey","propName","ref","$$typeof","props","reactJsxRuntime_production","Fragment","jsx","jsxs","require$$0","getComponentNameFromType","REACT_CLIENT_REFERENCE","displayName","name","REACT_PROFILER_TYPE","REACT_STRICT_MODE_TYPE","REACT_SUSPENSE_TYPE","REACT_SUSPENSE_LIST_TYPE","REACT_ACTIVITY_TYPE","tag","REACT_PORTAL_TYPE","REACT_CONTEXT_TYPE","REACT_CONSUMER_TYPE","_context","REACT_FORWARD_REF_TYPE","innerType","render","REACT_MEMO_TYPE","REACT_LAZY_TYPE","_payload","_init","x","testStringCoercion","checkKeyStringCoercion","JSCompiler_inline_result","e","JSCompiler_temp_const","JSCompiler_inline_result$jscomp$0","toStringTag","constructor","getTaskName","UnknownOwner","Error","elementRefGetterWithDeprecationWarning","componentName","this","didWarnAboutElementRef","jsxDEVImpl","isStaticChildren","debugStack","debugTask","dispatcher","children","isArrayImpl","validateChildKeys","freeze","keys","k","join","didWarnAboutKeySpread","getter","getOwnPropertyDescriptor","get","isReactWarning","hasValidKey","warnAboutAccessingKey","specialPropKeyWarningShown","defineProperty","configurable","defineKeyPropWarningGetter","owner","refProp","_owner","enumerable","_store","writable","ReactElement","ReactSharedInternals","A","getOwner","isValidElement","validated","status","object","React","__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE","createTask","unknownOwnerDebugStack","react_stack_bottom_frame","callStackForError","bind","unknownOwnerDebugTask","reactJsxRuntime_development","trackActualOwner","recentlyCreatedOwnerStacks","AccessibilityContext","createContext","AccessibilityProvider","accessibilityState","Provider","useAccessibilityContext","context","useContext","AccessibilityToggle","styles","checked","onChange","event","target","id","COLOR_SCHEME_OPTIONS","label","description","ColorSchemeControl","handleColorSchemeChange","newColorScheme","role","map","option","disabled","FONT_SIZE_OPTIONS","FontSizeControl","handleFontSizeChange","newFontSize","ImageControl","stylesImport","stylesImport.default","AccessibilityPanelInner","isOpen","onClose","position","panelRef","useRef","handleClickOutside","current","contains","timeoutId","addEventListener","clearTimeout","removeEventListener","handleEscapeKey","stickyContainer","panel","highContrastMode","header","title","onClick","preventDefault","stopPropagation","closeButton","content","controls","settingType","Math","min","fallback","settingKey","setValue","setEnabled","enabled"],"mappings":"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","x_google_ignoreList":[3,7,8,9]}
@@ -4,7 +4,7 @@ import { ColorScheme, FontSize, AccessibilitySettings } from '../types';
4
4
  * CSS классы для различных настроек доступности
5
5
  */
6
6
  export declare const CSS_CLASSES: {
7
- readonly HIGH_CONTRAST: "accessibility-high-contrast";
7
+ readonly HIGH_CONTRAST: string;
8
8
  readonly FONT_SMALL: "accessibility-font-small";
9
9
  readonly FONT_LARGE: "accessibility-font-large";
10
10
  readonly HIDE_IMAGES: "accessibility-hide-images";
@@ -42,6 +42,14 @@ export declare const removeAllAccessibilityStyles: () => void;
42
42
  * Применяет все переданные настройки одновременно
43
43
  */
44
44
  export declare const applyAllSettings: (settings: AccessibilitySettings) => void;
45
+ /**
46
+ * Применение стилей высокого контраста ко всем элементам на странице
47
+ */
48
+ export declare const applyHighContrastStylesToAllElements: () => void;
49
+ /**
50
+ * Удаление стилей высокого контраста со всех элементов на странице
51
+ */
52
+ export declare const removeHighContrastStylesFromAllElements: () => void;
45
53
  /**
46
54
  * Применение конкретной настройки с проверкой общего режима
47
55
  * Применяет настройку только если общий режим доступности включен
@@ -1 +1 @@
1
- {"version":3,"file":"css-applier.d.ts","sourceRoot":"","sources":["../../src/lib/css-applier.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAaxE;;GAEG;AACH,eAAO,MAAM,WAAW;;;;;CAKd,CAAC;AAEX;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,GAAI,QAAQ,WAAW,KAAG,IAyBtD,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,GAAI,MAAM,QAAQ,KAAG,IAG9C,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,GAAI,YAAY,OAAO,KAAG,IAc1D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,4BAA4B,QAAO,IAiB/C,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAAI,UAAU,qBAAqB,KAAG,IAWlE,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,qBAAqB,GAChC,WAAW,OAAO,EAClB,aAAa,aAAa,GAAG,UAAU,GAAG,iBAAiB,EAC3D,OAAO,WAAW,GAAG,QAAQ,GAAG,OAAO,KACtC,IAkBF,CAAC"}
1
+ {"version":3,"file":"css-applier.d.ts","sourceRoot":"","sources":["../../src/lib/css-applier.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAaxE;;GAEG;AACH,eAAO,MAAM,WAAW;;;;;CAKd,CAAC;AAEX;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,GAAI,QAAQ,WAAW,KAAG,IA6BtD,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,GAAI,MAAM,QAAQ,KAAG,IAG9C,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,GAAI,YAAY,OAAO,KAAG,IAc1D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,4BAA4B,QAAO,IAoB/C,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAAI,UAAU,qBAAqB,KAAG,IAWlE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oCAAoC,QAAO,IAqDvD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,uCAAuC,QAAO,IAqD1D,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,qBAAqB,GAChC,WAAW,OAAO,EAClB,aAAa,aAAa,GAAG,UAAU,GAAG,iBAAiB,EAC3D,OAAO,WAAW,GAAG,QAAQ,GAAG,OAAO,KACtC,IAkBF,CAAC"}
package/dist/style.css CHANGED
@@ -1 +1 @@
1
- @charset "UTF-8";._accessibilityToggle_jwfla_9{margin-bottom:20px;padding-bottom:16px;border-bottom:1px solid #dee2e6}._toggleContainer_jwfla_15{display:flex;flex-direction:column;gap:8px}._toggleLabel_jwfla_21{display:flex;align-items:center;gap:16px;cursor:pointer;padding:16px;border:2px solid #007bff;border-radius:8px;transition:all .2s ease;background:#f8f9ff}._toggleLabel_jwfla_21:hover{background:#e3f2fd;border-color:#0056b3}._toggleLabel_jwfla_21:focus-within{background:#e3f2fd;border-color:#0056b3;box-shadow:0 0 0 3px #007bff40}._toggleInput_jwfla_42{position:absolute;opacity:0;width:0;height:0;margin:0}._toggleInput_jwfla_42:focus+._toggleSlider_jwfla_49{box-shadow:0 0 0 3px #007bff40}._toggleInput_jwfla_42:checked+._toggleSlider_jwfla_49{background:#28a745}._toggleInput_jwfla_42:checked+._toggleSlider_jwfla_49 ._toggleThumb_jwfla_55{transform:translate(28px)}._toggleSlider_jwfla_49{position:relative;width:56px;height:28px;background:#ced4da;border-radius:14px;transition:all .3s ease;flex-shrink:0}._toggleThumb_jwfla_55{position:absolute;top:2px;left:2px;width:24px;height:24px;background:#fff;border-radius:50%;transition:transform .3s ease;box-shadow:0 2px 6px #0000004d}._toggleContent_jwfla_81{flex:1;display:flex;flex-direction:column;gap:4px}._toggleTitle_jwfla_88{font-size:16px;font-weight:600;color:#343a40;line-height:1.3}._toggleStatus_jwfla_95{font-size:14px;font-weight:500;color:#007bff;line-height:1.2}._description_jwfla_102{font-size:13px;color:#6c757d;line-height:1.4;margin:0;padding:0 16px}.accessibility-high-contrast ._accessibilityToggle_jwfla_9{border-bottom-color:#fff!important}.accessibility-high-contrast ._accessibilityToggle_jwfla_9 ._toggleLabel_jwfla_21{background:#000!important;border-color:#fff!important;color:#fff!important}.accessibility-high-contrast ._accessibilityToggle_jwfla_9 ._toggleLabel_jwfla_21:hover,.accessibility-high-contrast ._accessibilityToggle_jwfla_9 ._toggleLabel_jwfla_21:focus-within{background:#343a40!important;border-color:#ff0!important}.accessibility-high-contrast ._accessibilityToggle_jwfla_9 ._toggleTitle_jwfla_88{color:#fff!important}.accessibility-high-contrast ._accessibilityToggle_jwfla_9 ._toggleStatus_jwfla_95{color:#ff0!important}.accessibility-high-contrast ._accessibilityToggle_jwfla_9 ._description_jwfla_102{color:#ced4da!important}.accessibility-high-contrast ._accessibilityToggle_jwfla_9 ._toggleSlider_jwfla_49{background:#6c757d!important;border:2px solid #ffffff!important}.accessibility-high-contrast ._accessibilityToggle_jwfla_9 ._toggleInput_jwfla_42:checked+._toggleSlider_jwfla_49{background:#ff0!important}.accessibility-high-contrast ._accessibilityToggle_jwfla_9 ._toggleInput_jwfla_42:checked+._toggleSlider_jwfla_49 ._toggleThumb_jwfla_55{background:#000!important;border:2px solid #ffffff!important}.accessibility-high-contrast ._accessibilityToggle_jwfla_9 ._toggleThumb_jwfla_55{background:#fff!important;border:2px solid #000000!important}._colorSchemeControl_tkb2w_9{margin-bottom:16px}._colorSchemeControl_tkb2w_9._disabled_tkb2w_12 ._title_tkb2w_12{opacity:.6}._title_tkb2w_12{font-size:14px;font-weight:600;margin:0 0 12px;color:#343a40}._optionsContainer_tkb2w_23{display:flex;flex-direction:column;gap:8px}._option_tkb2w_23{display:flex;align-items:flex-start;gap:12px;cursor:pointer;padding:12px;border:1px solid #dee2e6;border-radius:6px;transition:all .2s ease;position:relative;background:#fff}._option_tkb2w_23:hover{background:#f8f9fa;border-color:#007bff}._option_tkb2w_23:focus-within{background:#f8f9fa;border-color:#007bff;box-shadow:0 0 0 2px #007bff40}._option_tkb2w_23._selected_tkb2w_50{background:#e3f2fd;border-color:#007bff}._option_tkb2w_23._selected_tkb2w_50 ._radioIndicator_tkb2w_54{background:#007bff;border-color:#007bff}._option_tkb2w_23._selected_tkb2w_50 ._radioIndicator_tkb2w_54:after{opacity:1;transform:scale(1)}._option_tkb2w_23._optionDisabled_tkb2w_62{opacity:.5;cursor:not-allowed;pointer-events:none}._option_tkb2w_23._optionDisabled_tkb2w_62:hover{background:#fff;border-color:#dee2e6}._radioInput_tkb2w_72{position:absolute;opacity:0;width:0;height:0;margin:0}._radioInput_tkb2w_72:focus+._optionContent_tkb2w_79{outline:2px solid #007bff;outline-offset:2px}._optionContent_tkb2w_79{flex:1;display:flex;flex-direction:column;gap:4px}._optionLabel_tkb2w_91{font-size:14px;font-weight:500;color:#343a40;line-height:1.4}._optionDescription_tkb2w_98{font-size:12px;color:#6c757d;line-height:1.3}._radioIndicator_tkb2w_54{width:18px;height:18px;border:2px solid #ced4da;border-radius:50%;background:#fff;transition:all .2s ease;position:relative;flex-shrink:0;margin-top:1px}._radioIndicator_tkb2w_54:after{content:"";position:absolute;top:50%;left:50%;width:8px;height:8px;background:#fff;border-radius:50%;transform:translate(-50%,-50%) scale(0);transition:all .2s ease;opacity:0}.accessibility-high-contrast ._colorSchemeControl_tkb2w_9 ._title_tkb2w_12{color:#fff!important}.accessibility-high-contrast ._colorSchemeControl_tkb2w_9 ._option_tkb2w_23{background:#000!important;border-color:#fff!important;color:#fff!important}.accessibility-high-contrast ._colorSchemeControl_tkb2w_9 ._option_tkb2w_23:hover,.accessibility-high-contrast ._colorSchemeControl_tkb2w_9 ._option_tkb2w_23:focus-within{background:#343a40!important}.accessibility-high-contrast ._colorSchemeControl_tkb2w_9 ._option_tkb2w_23._selected_tkb2w_50{background:#343a40!important}.accessibility-high-contrast ._colorSchemeControl_tkb2w_9 ._optionLabel_tkb2w_91{color:#fff!important}.accessibility-high-contrast ._colorSchemeControl_tkb2w_9 ._optionDescription_tkb2w_98{color:#ced4da!important}.accessibility-high-contrast ._colorSchemeControl_tkb2w_9 ._radioIndicator_tkb2w_54{border-color:#fff!important;background:#000!important}.accessibility-high-contrast ._colorSchemeControl_tkb2w_9 ._radioIndicator_tkb2w_54:after{background:#fff!important}._fontSizeControl_xe2rx_9{margin-bottom:16px}._fontSizeControl_xe2rx_9._disabled_xe2rx_12 ._title_xe2rx_12{opacity:.6}._title_xe2rx_12{font-size:14px;font-weight:600;margin:0 0 12px;color:#343a40}._optionsContainer_xe2rx_23{display:flex;flex-direction:column;gap:8px}._option_xe2rx_23{display:flex;align-items:flex-start;gap:12px;cursor:pointer;padding:12px;border:1px solid #dee2e6;border-radius:6px;transition:all .2s ease;position:relative;background:#fff}._option_xe2rx_23:hover{background:#f8f9fa;border-color:#007bff}._option_xe2rx_23:focus-within{background:#f8f9fa;border-color:#007bff;box-shadow:0 0 0 2px #007bff40}._option_xe2rx_23._selected_xe2rx_50{background:#e3f2fd;border-color:#007bff}._option_xe2rx_23._selected_xe2rx_50 ._radioIndicator_xe2rx_54{background:#007bff;border-color:#007bff}._option_xe2rx_23._selected_xe2rx_50 ._radioIndicator_xe2rx_54:after{opacity:1;transform:scale(1)}._option_xe2rx_23._optionDisabled_xe2rx_62{opacity:.5;cursor:not-allowed;pointer-events:none}._option_xe2rx_23._optionDisabled_xe2rx_62:hover{background:#fff;border-color:#dee2e6}._radioInput_xe2rx_72{position:absolute;opacity:0;width:0;height:0;margin:0}._radioInput_xe2rx_72:focus+._optionContent_xe2rx_79{outline:2px solid #007bff;outline-offset:2px}._optionContent_xe2rx_79{flex:1;display:flex;flex-direction:column;gap:4px}._optionLabel_xe2rx_91{font-size:14px;font-weight:500;color:#343a40;line-height:1.4}._optionDescription_xe2rx_98{font-size:12px;color:#6c757d;line-height:1.3}._radioIndicator_xe2rx_54{width:18px;height:18px;border:2px solid #ced4da;border-radius:50%;background:#fff;transition:all .2s ease;position:relative;flex-shrink:0;margin-top:1px}._radioIndicator_xe2rx_54:after{content:"";position:absolute;top:50%;left:50%;width:8px;height:8px;background:#fff;border-radius:50%;transform:translate(-50%,-50%) scale(0);transition:all .2s ease;opacity:0}.accessibility-high-contrast ._fontSizeControl_xe2rx_9 ._title_xe2rx_12{color:#fff!important}.accessibility-high-contrast ._fontSizeControl_xe2rx_9 ._option_xe2rx_23{background:#000!important;border-color:#fff!important;color:#fff!important}.accessibility-high-contrast ._fontSizeControl_xe2rx_9 ._option_xe2rx_23:hover,.accessibility-high-contrast ._fontSizeControl_xe2rx_9 ._option_xe2rx_23:focus-within{background:#343a40!important}.accessibility-high-contrast ._fontSizeControl_xe2rx_9 ._option_xe2rx_23._selected_xe2rx_50{background:#343a40!important}.accessibility-high-contrast ._fontSizeControl_xe2rx_9 ._optionLabel_xe2rx_91{color:#fff!important}.accessibility-high-contrast ._fontSizeControl_xe2rx_9 ._optionDescription_xe2rx_98{color:#ced4da!important}.accessibility-high-contrast ._fontSizeControl_xe2rx_9 ._radioIndicator_xe2rx_54{border-color:#fff!important;background:#000!important}.accessibility-high-contrast ._fontSizeControl_xe2rx_9 ._radioIndicator_xe2rx_54:after{background:#fff!important}._imageControl_rczak_9{margin-bottom:16px}._imageControl_rczak_9._disabled_rczak_12 ._title_rczak_12{opacity:.6}._title_rczak_12{font-size:14px;font-weight:600;margin:0 0 12px;color:#343a40}._switchContainer_rczak_23{display:flex;flex-direction:column;gap:8px}._switchLabel_rczak_29{display:flex;align-items:center;gap:12px;cursor:pointer;padding:12px;border:1px solid #dee2e6;border-radius:6px;transition:all .2s ease;background:#fff}._switchLabel_rczak_29:hover{background:#f8f9fa;border-color:#007bff}._switchLabel_rczak_29:focus-within{background:#f8f9fa;border-color:#007bff;box-shadow:0 0 0 2px #007bff40}._switchLabel_rczak_29._switchDisabled_rczak_49{opacity:.5;cursor:not-allowed;pointer-events:none}._switchLabel_rczak_29._switchDisabled_rczak_49:hover{background:#fff;border-color:#dee2e6}._switchInput_rczak_59{position:absolute;opacity:0;width:0;height:0;margin:0}._switchInput_rczak_59:focus+._switchSlider_rczak_66{box-shadow:0 0 0 2px #007bff40}._switchInput_rczak_59:checked+._switchSlider_rczak_66{background:#007bff}._switchInput_rczak_59:checked+._switchSlider_rczak_66 ._switchThumb_rczak_72{transform:translate(20px)}._switchSlider_rczak_66{position:relative;width:44px;height:24px;background:#ced4da;border-radius:12px;transition:all .2s ease;flex-shrink:0}._switchThumb_rczak_72{position:absolute;top:2px;left:2px;width:20px;height:20px;background:#fff;border-radius:50%;transition:transform .2s ease;box-shadow:0 2px 4px #0003}._switchText_rczak_98{font-size:14px;font-weight:500;color:#343a40;line-height:1.4;flex:1}._description_rczak_106{font-size:12px;color:#6c757d;line-height:1.3;margin:0;padding-left:56px}.accessibility-high-contrast ._imageControl_rczak_9 ._title_rczak_12{color:#fff!important}.accessibility-high-contrast ._imageControl_rczak_9 ._switchLabel_rczak_29{background:#000!important;border-color:#fff!important;color:#fff!important}.accessibility-high-contrast ._imageControl_rczak_9 ._switchLabel_rczak_29:hover,.accessibility-high-contrast ._imageControl_rczak_9 ._switchLabel_rczak_29:focus-within{background:#343a40!important}.accessibility-high-contrast ._imageControl_rczak_9 ._switchText_rczak_98{color:#fff!important}.accessibility-high-contrast ._imageControl_rczak_9 ._description_rczak_106{color:#ced4da!important}.accessibility-high-contrast ._imageControl_rczak_9 ._switchSlider_rczak_66{background:#6c757d!important;border:1px solid #ffffff!important}.accessibility-high-contrast ._imageControl_rczak_9 ._switchInput_rczak_59:checked+._switchSlider_rczak_66{background:#fff!important}.accessibility-high-contrast ._imageControl_rczak_9 ._switchInput_rczak_59:checked+._switchSlider_rczak_66 ._switchThumb_rczak_72{background:#000!important}.accessibility-high-contrast ._imageControl_rczak_9 ._switchThumb_rczak_72{background:#fff!important;border:1px solid #000000!important}._stickyContainer_1xqyi_9{position:fixed;top:70px;right:0;left:0;pointer-events:none;z-index:1000}@media (max-width: 767px){._stickyContainer_1xqyi_9{top:60px}}._panel_1xqyi_23{position:sticky;top:20px;width:360px;max-width:calc(100vw - 40px);max-height:calc(100vh - 40px);background:#fff;border:1px solid #dee2e6;border-radius:12px;box-shadow:0 8px 32px #0000001f;overflow:hidden;display:flex;flex-direction:column;pointer-events:auto}._panel_1xqyi_23._topRight_1xqyi_38{margin-left:auto;margin-right:20px}._panel_1xqyi_23._topLeft_1xqyi_42{margin-left:20px;margin-right:auto}@media (max-width: 767px){._panel_1xqyi_23{width:calc(100vw - 32px);max-height:calc(100vh - 100px);margin-left:16px;margin-right:16px}._panel_1xqyi_23._topRight_1xqyi_38,._panel_1xqyi_23._topLeft_1xqyi_42{margin-left:16px;margin-right:16px}}._header_1xqyi_59{display:flex;justify-content:space-between;align-items:center;padding:20px 24px 16px;border-bottom:1px solid #e9ecef;background:#f8f9fa}._title_1xqyi_68{margin:0;font-size:18px;font-weight:600;color:#343a40;line-height:1.3}._closeButton_1xqyi_76{background:none;border:none;font-size:24px;font-weight:300;color:#6c757d;cursor:pointer;padding:4px 8px;border-radius:4px;transition:all .2s ease;line-height:1;width:32px;height:32px;display:flex;align-items:center;justify-content:center}._closeButton_1xqyi_76:hover{background:#e9ecef;color:#343a40}._closeButton_1xqyi_76:focus{outline:2px solid #007bff;outline-offset:2px;background:#e9ecef;color:#343a40}._closeButton_1xqyi_76:active{background:#dee2e6}._description_1xqyi_107{padding:16px 24px 0;font-size:14px;color:#6c757d;line-height:1.4;margin:0}._content_1xqyi_115{flex:1;padding:20px 24px 24px;overflow-y:auto}._content_1xqyi_115::-webkit-scrollbar{width:6px}._content_1xqyi_115::-webkit-scrollbar-track{background:#e9ecef;border-radius:3px}._content_1xqyi_115::-webkit-scrollbar-thumb{background:#ced4da;border-radius:3px}._content_1xqyi_115::-webkit-scrollbar-thumb:hover{background:#adb5bd}._controls_1xqyi_135{display:flex;flex-direction:column;gap:4px}.accessibility-high-contrast ._panel_1xqyi_23{background:#000!important;border-color:#fff!important;color:#fff!important}.accessibility-high-contrast ._panel_1xqyi_23 ._header_1xqyi_59{background:#000!important;border-bottom-color:#fff!important}.accessibility-high-contrast ._panel_1xqyi_23 ._title_1xqyi_68{color:#fff!important}.accessibility-high-contrast ._panel_1xqyi_23 ._closeButton_1xqyi_76{color:#fff!important;border:1px solid #ffffff!important}.accessibility-high-contrast ._panel_1xqyi_23 ._closeButton_1xqyi_76:hover,.accessibility-high-contrast ._panel_1xqyi_23 ._closeButton_1xqyi_76:focus{background:#343a40!important;color:#ff0!important}.accessibility-high-contrast ._panel_1xqyi_23 ._closeButton_1xqyi_76:active{background:#6c757d!important}.accessibility-high-contrast ._panel_1xqyi_23 ._description_1xqyi_107{color:#ced4da!important}.accessibility-high-contrast ._panel_1xqyi_23 ._content_1xqyi_115::-webkit-scrollbar-track{background:#343a40!important}.accessibility-high-contrast ._panel_1xqyi_23 ._content_1xqyi_115::-webkit-scrollbar-thumb{background:#6c757d!important}.accessibility-high-contrast ._panel_1xqyi_23 ._content_1xqyi_115::-webkit-scrollbar-thumb:hover{background:#adb5bd!important}@keyframes _slideIn_1xqyi_1{0%{opacity:0;transform:translateY(-10px) scale(.95)}to{opacity:1;transform:translateY(0) scale(1)}}._panel_1xqyi_23{animation:_slideIn_1xqyi_1 .2s ease}
1
+ @charset "UTF-8";._accessibilityToggle_kpjm6_9{margin-bottom:20px;padding-bottom:16px;border-bottom:1px solid #dee2e6}._toggleContainer_kpjm6_15{display:flex;flex-direction:column;gap:8px}._toggleLabel_kpjm6_21{display:flex;align-items:center;gap:16px;cursor:pointer;padding:16px;border:2px solid #007bff;border-radius:8px;transition:all .2s ease;background:#f8f9ff}._toggleLabel_kpjm6_21:hover{background:#e3f2fd;border-color:#0056b3}._toggleLabel_kpjm6_21:focus-within{background:#e3f2fd;border-color:#0056b3;box-shadow:0 0 0 3px #007bff40}._toggleInput_kpjm6_42{position:absolute;opacity:0;width:0;height:0;margin:0}._toggleInput_kpjm6_42:focus+._toggleSlider_kpjm6_49{box-shadow:0 0 0 3px #007bff40}._toggleInput_kpjm6_42:checked+._toggleSlider_kpjm6_49{background:#28a745}._toggleInput_kpjm6_42:checked+._toggleSlider_kpjm6_49 ._toggleThumb_kpjm6_55{transform:translate(28px)}._toggleSlider_kpjm6_49{position:relative;width:56px;height:28px;background:#ced4da;border-radius:14px;transition:all .3s ease;flex-shrink:0}._toggleThumb_kpjm6_55{position:absolute;top:2px;left:2px;width:24px;height:24px;background:#fff;border-radius:50%;transition:transform .3s ease;box-shadow:0 2px 6px #0000004d}._toggleContent_kpjm6_81{flex:1;display:flex;flex-direction:column;gap:4px}._toggleTitle_kpjm6_88{font-size:16px;font-weight:600;color:#343a40;line-height:1.3}._toggleStatus_kpjm6_95{font-size:14px;font-weight:500;color:#007bff;line-height:1.2}._description_kpjm6_102{font-size:13px;color:#6c757d;line-height:1.4;margin:0;padding:0 16px}._accessibilityToggle_kpjm6_9._highContrastMode_kpjm6_110{border-bottom-color:#fff!important}._accessibilityToggle_kpjm6_9._highContrastMode_kpjm6_110 ._toggleLabel_kpjm6_21{background:#000!important;border-color:#fff!important;color:#fff!important}._accessibilityToggle_kpjm6_9._highContrastMode_kpjm6_110 ._toggleLabel_kpjm6_21:hover,._accessibilityToggle_kpjm6_9._highContrastMode_kpjm6_110 ._toggleLabel_kpjm6_21:focus-within{background:#343a40!important;border-color:#ff0!important}._accessibilityToggle_kpjm6_9._highContrastMode_kpjm6_110 ._toggleTitle_kpjm6_88{color:#fff!important}._accessibilityToggle_kpjm6_9._highContrastMode_kpjm6_110 ._toggleStatus_kpjm6_95{color:#ff0!important}._accessibilityToggle_kpjm6_9._highContrastMode_kpjm6_110 ._description_kpjm6_102{color:#ced4da!important}._accessibilityToggle_kpjm6_9._highContrastMode_kpjm6_110 ._toggleSlider_kpjm6_49{background:#6c757d!important;border:2px solid #ffffff!important}._accessibilityToggle_kpjm6_9._highContrastMode_kpjm6_110 ._toggleInput_kpjm6_42:checked+._toggleSlider_kpjm6_49{background:#ff0!important}._accessibilityToggle_kpjm6_9._highContrastMode_kpjm6_110 ._toggleInput_kpjm6_42:checked+._toggleSlider_kpjm6_49 ._toggleThumb_kpjm6_55{background:#000!important;border:2px solid #ffffff!important}._accessibilityToggle_kpjm6_9._highContrastMode_kpjm6_110 ._toggleThumb_kpjm6_55{background:#fff!important;border:2px solid #000000!important}._colorSchemeControl_1kr72_9{margin-bottom:16px}._colorSchemeControl_1kr72_9._disabled_1kr72_12 ._title_1kr72_12{opacity:.6}._title_1kr72_12{font-size:14px;font-weight:600;margin:0 0 12px;color:#343a40}._optionsContainer_1kr72_23{display:flex;flex-direction:column;gap:8px}._option_1kr72_23{display:flex;align-items:flex-start;gap:12px;cursor:pointer;padding:12px;border:1px solid #dee2e6;border-radius:6px;transition:all .2s ease;position:relative;background:#fff}._option_1kr72_23:hover{background:#f8f9fa;border-color:#007bff}._option_1kr72_23:focus-within{background:#f8f9fa;border-color:#007bff;box-shadow:0 0 0 2px #007bff40}._option_1kr72_23._selected_1kr72_50{background:#e3f2fd;border-color:#007bff}._option_1kr72_23._selected_1kr72_50 ._radioIndicator_1kr72_54{background:#007bff;border-color:#007bff}._option_1kr72_23._selected_1kr72_50 ._radioIndicator_1kr72_54:after{opacity:1;transform:scale(1)}._option_1kr72_23._optionDisabled_1kr72_62{opacity:.5;cursor:not-allowed;pointer-events:none}._option_1kr72_23._optionDisabled_1kr72_62:hover{background:#fff;border-color:#dee2e6}._radioInput_1kr72_72{position:absolute;opacity:0;width:0;height:0;margin:0}._radioInput_1kr72_72:focus+._optionContent_1kr72_79{outline:2px solid #007bff;outline-offset:2px}._optionContent_1kr72_79{flex:1;display:flex;flex-direction:column;gap:4px}._optionLabel_1kr72_91{font-size:14px;font-weight:500;color:#343a40;line-height:1.4}._optionDescription_1kr72_98{font-size:12px;color:#6c757d;line-height:1.3}._radioIndicator_1kr72_54{width:18px;height:18px;border:2px solid #ced4da;border-radius:50%;background:#fff;transition:all .2s ease;position:relative;flex-shrink:0;margin-top:1px}._radioIndicator_1kr72_54:after{content:"";position:absolute;top:50%;left:50%;width:8px;height:8px;background:#fff;border-radius:50%;transform:translate(-50%,-50%) scale(0);transition:all .2s ease;opacity:0}._colorSchemeControl_1kr72_9._highContrastMode_1kr72_129 ._title_1kr72_12{color:#fff!important}._colorSchemeControl_1kr72_9._highContrastMode_1kr72_129 ._option_1kr72_23{background:#000!important;border-color:#fff!important;color:#fff!important}._colorSchemeControl_1kr72_9._highContrastMode_1kr72_129 ._option_1kr72_23:hover,._colorSchemeControl_1kr72_9._highContrastMode_1kr72_129 ._option_1kr72_23:focus-within{background:#343a40!important}._colorSchemeControl_1kr72_9._highContrastMode_1kr72_129 ._option_1kr72_23._selected_1kr72_50{background:#343a40!important}._colorSchemeControl_1kr72_9._highContrastMode_1kr72_129 ._optionLabel_1kr72_91{color:#fff!important}._colorSchemeControl_1kr72_9._highContrastMode_1kr72_129 ._optionDescription_1kr72_98{color:#ced4da!important}._colorSchemeControl_1kr72_9._highContrastMode_1kr72_129 ._radioIndicator_1kr72_54{border-color:#fff!important;background:#000!important}._colorSchemeControl_1kr72_9._highContrastMode_1kr72_129 ._radioIndicator_1kr72_54:after{background:#fff!important}._fontSizeControl_1c68l_9{margin-bottom:16px}._fontSizeControl_1c68l_9._disabled_1c68l_12 ._title_1c68l_12{opacity:.6}._title_1c68l_12{font-size:14px;font-weight:600;margin:0 0 12px;color:#343a40}._optionsContainer_1c68l_23{display:flex;flex-direction:column;gap:8px}._option_1c68l_23{display:flex;align-items:flex-start;gap:12px;cursor:pointer;padding:12px;border:1px solid #dee2e6;border-radius:6px;transition:all .2s ease;position:relative;background:#fff}._option_1c68l_23:hover{background:#f8f9fa;border-color:#007bff}._option_1c68l_23:focus-within{background:#f8f9fa;border-color:#007bff;box-shadow:0 0 0 2px #007bff40}._option_1c68l_23._selected_1c68l_50{background:#e3f2fd;border-color:#007bff}._option_1c68l_23._selected_1c68l_50 ._radioIndicator_1c68l_54{background:#007bff;border-color:#007bff}._option_1c68l_23._selected_1c68l_50 ._radioIndicator_1c68l_54:after{opacity:1;transform:scale(1)}._option_1c68l_23._optionDisabled_1c68l_62{opacity:.5;cursor:not-allowed;pointer-events:none}._option_1c68l_23._optionDisabled_1c68l_62:hover{background:#fff;border-color:#dee2e6}._radioInput_1c68l_72{position:absolute;opacity:0;width:0;height:0;margin:0}._radioInput_1c68l_72:focus+._optionContent_1c68l_79{outline:2px solid #007bff;outline-offset:2px}._optionContent_1c68l_79{flex:1;display:flex;flex-direction:column;gap:4px}._optionLabel_1c68l_91{font-size:14px;font-weight:500;color:#343a40;line-height:1.4}._optionDescription_1c68l_98{font-size:12px;color:#6c757d;line-height:1.3}._radioIndicator_1c68l_54{width:18px;height:18px;border:2px solid #ced4da;border-radius:50%;background:#fff;transition:all .2s ease;position:relative;flex-shrink:0;margin-top:1px}._radioIndicator_1c68l_54:after{content:"";position:absolute;top:50%;left:50%;width:8px;height:8px;background:#fff;border-radius:50%;transform:translate(-50%,-50%) scale(0);transition:all .2s ease;opacity:0}._fontSizeControl_1c68l_9._highContrastMode_1c68l_129 ._title_1c68l_12{color:#fff!important}._fontSizeControl_1c68l_9._highContrastMode_1c68l_129 ._option_1c68l_23{background:#000!important;border-color:#fff!important;color:#fff!important}._fontSizeControl_1c68l_9._highContrastMode_1c68l_129 ._option_1c68l_23:hover,._fontSizeControl_1c68l_9._highContrastMode_1c68l_129 ._option_1c68l_23:focus-within{background:#343a40!important}._fontSizeControl_1c68l_9._highContrastMode_1c68l_129 ._option_1c68l_23._selected_1c68l_50{background:#343a40!important}._fontSizeControl_1c68l_9._highContrastMode_1c68l_129 ._optionLabel_1c68l_91{color:#fff!important}._fontSizeControl_1c68l_9._highContrastMode_1c68l_129 ._optionDescription_1c68l_98{color:#ced4da!important}._fontSizeControl_1c68l_9._highContrastMode_1c68l_129 ._radioIndicator_1c68l_54{border-color:#fff!important;background:#000!important}._fontSizeControl_1c68l_9._highContrastMode_1c68l_129 ._radioIndicator_1c68l_54:after{background:#fff!important}._imageControl_hkxkm_9{margin-bottom:16px}._imageControl_hkxkm_9._disabled_hkxkm_12 ._title_hkxkm_12{opacity:.6}._title_hkxkm_12{font-size:14px;font-weight:600;margin:0 0 12px;color:#343a40}._switchContainer_hkxkm_23{display:flex;flex-direction:column;gap:8px}._switchLabel_hkxkm_29{display:flex;align-items:center;gap:12px;cursor:pointer;padding:12px;border:1px solid #dee2e6;border-radius:6px;transition:all .2s ease;background:#fff}._switchLabel_hkxkm_29:hover{background:#f8f9fa;border-color:#007bff}._switchLabel_hkxkm_29:focus-within{background:#f8f9fa;border-color:#007bff;box-shadow:0 0 0 2px #007bff40}._switchLabel_hkxkm_29._switchDisabled_hkxkm_49{opacity:.5;cursor:not-allowed;pointer-events:none}._switchLabel_hkxkm_29._switchDisabled_hkxkm_49:hover{background:#fff;border-color:#dee2e6}._switchInput_hkxkm_59{position:absolute;opacity:0;width:0;height:0;margin:0}._switchInput_hkxkm_59:focus+._switchSlider_hkxkm_66{box-shadow:0 0 0 2px #007bff40}._switchInput_hkxkm_59:checked+._switchSlider_hkxkm_66{background:#007bff}._switchInput_hkxkm_59:checked+._switchSlider_hkxkm_66 ._switchThumb_hkxkm_72{transform:translate(20px)}._switchSlider_hkxkm_66{position:relative;width:44px;height:24px;background:#ced4da;border-radius:12px;transition:all .2s ease;flex-shrink:0}._switchThumb_hkxkm_72{position:absolute;top:2px;left:2px;width:20px;height:20px;background:#fff;border-radius:50%;transition:transform .2s ease;box-shadow:0 2px 4px #0003}._switchText_hkxkm_98{font-size:14px;font-weight:500;color:#343a40;line-height:1.4;flex:1}._description_hkxkm_106{font-size:12px;color:#6c757d;line-height:1.3;margin:0;padding-left:56px}._imageControl_hkxkm_9._highContrastMode_hkxkm_114 ._title_hkxkm_12{color:#fff!important}._imageControl_hkxkm_9._highContrastMode_hkxkm_114 ._switchLabel_hkxkm_29{background:#000!important;border-color:#fff!important;color:#fff!important}._imageControl_hkxkm_9._highContrastMode_hkxkm_114 ._switchLabel_hkxkm_29:hover,._imageControl_hkxkm_9._highContrastMode_hkxkm_114 ._switchLabel_hkxkm_29:focus-within{background:#343a40!important}._imageControl_hkxkm_9._highContrastMode_hkxkm_114 ._switchText_hkxkm_98{color:#fff!important}._imageControl_hkxkm_9._highContrastMode_hkxkm_114 ._description_hkxkm_106{color:#ced4da!important}._imageControl_hkxkm_9._highContrastMode_hkxkm_114 ._switchSlider_hkxkm_66{background:#6c757d!important;border:1px solid #ffffff!important}._imageControl_hkxkm_9._highContrastMode_hkxkm_114 ._switchInput_hkxkm_59:checked+._switchSlider_hkxkm_66{background:#fff!important}._imageControl_hkxkm_9._highContrastMode_hkxkm_114 ._switchInput_hkxkm_59:checked+._switchSlider_hkxkm_66 ._switchThumb_hkxkm_72{background:#000!important}._imageControl_hkxkm_9._highContrastMode_hkxkm_114 ._switchThumb_hkxkm_72{background:#fff!important;border:1px solid #000000!important}._stickyContainer_18ltw_9{position:fixed;top:70px;pointer-events:none;z-index:1000}@media (max-width: 767px){._stickyContainer_18ltw_9{top:60px}}._panel_18ltw_21{position:sticky;top:20px;width:360px;max-width:calc(100vw - 40px);max-height:calc(100vh - 40px);background:#fff;border:1px solid #dee2e6;border-radius:12px;box-shadow:0 8px 32px #0000001f;overflow:hidden;display:flex;flex-direction:column;pointer-events:auto}._panel_18ltw_21._top-right_18ltw_36{margin-left:auto;margin-right:20px}._panel_18ltw_21._top-left_18ltw_40{margin-left:20px;margin-right:auto}._panel_18ltw_21._bottom-right_18ltw_44{margin-left:auto;margin-right:20px;position:fixed;top:auto;bottom:20px;width:360px}._panel_18ltw_21._bottom-left_18ltw_52{margin-left:20px;margin-right:auto;position:fixed;top:auto;bottom:20px;width:360px}@media (max-width: 767px){._panel_18ltw_21{width:calc(100vw - 32px);max-height:calc(100vh - 100px);margin-left:16px;margin-right:16px}._panel_18ltw_21._top-right_18ltw_36,._panel_18ltw_21._top-left_18ltw_40,._panel_18ltw_21._bottom-right_18ltw_44,._panel_18ltw_21._bottom-left_18ltw_52{margin-left:16px;margin-right:16px}}._header_18ltw_73{display:flex;justify-content:space-between;align-items:center;padding:20px 24px 16px;border-bottom:1px solid #e9ecef;background:#f8f9fa}._title_18ltw_82{margin:0;font-size:18px;font-weight:600;color:#343a40;line-height:1.3}._closeButton_18ltw_90{background:none;border:none;font-size:24px;font-weight:300;color:#6c757d;cursor:pointer;padding:4px 8px;border-radius:4px;transition:all .2s ease;line-height:1;width:32px;height:32px;display:flex;align-items:center;justify-content:center}._closeButton_18ltw_90:hover{background:#e9ecef;color:#343a40}._closeButton_18ltw_90:focus{outline:2px solid #007bff;outline-offset:2px;background:#e9ecef;color:#343a40}._closeButton_18ltw_90:active{background:#dee2e6}._description_18ltw_121{padding:16px 24px 0;font-size:14px;color:#6c757d;line-height:1.4;margin:0}._content_18ltw_129{flex:1;padding:20px 24px 24px;overflow-y:auto}._content_18ltw_129::-webkit-scrollbar{width:6px}._content_18ltw_129::-webkit-scrollbar-track{background:#e9ecef;border-radius:3px}._content_18ltw_129::-webkit-scrollbar-thumb{background:#ced4da;border-radius:3px}._content_18ltw_129::-webkit-scrollbar-thumb:hover{background:#adb5bd}._controls_18ltw_149{display:flex;flex-direction:column;gap:4px}._panel_18ltw_21._highContrastMode_18ltw_155{background:#000!important;border-color:#fff!important;color:#fff!important}._panel_18ltw_21._highContrastMode_18ltw_155 ._header_18ltw_73{background:#000!important;border-bottom-color:#fff!important}._panel_18ltw_21._highContrastMode_18ltw_155 ._title_18ltw_82{color:#fff!important}._panel_18ltw_21._highContrastMode_18ltw_155 ._closeButton_18ltw_90{color:#fff!important;border:1px solid #ffffff!important}._panel_18ltw_21._highContrastMode_18ltw_155 ._closeButton_18ltw_90:hover,._panel_18ltw_21._highContrastMode_18ltw_155 ._closeButton_18ltw_90:focus{background:#343a40!important;color:#ff0!important}._panel_18ltw_21._highContrastMode_18ltw_155 ._closeButton_18ltw_90:active{background:#6c757d!important}._panel_18ltw_21._highContrastMode_18ltw_155 ._description_18ltw_121{color:#ced4da!important}._panel_18ltw_21._highContrastMode_18ltw_155 ._content_18ltw_129::-webkit-scrollbar-track{background:#343a40!important}._panel_18ltw_21._highContrastMode_18ltw_155 ._content_18ltw_129::-webkit-scrollbar-thumb{background:#6c757d!important}._panel_18ltw_21._highContrastMode_18ltw_155 ._content_18ltw_129::-webkit-scrollbar-thumb:hover{background:#adb5bd!important}@keyframes _slideIn_18ltw_1{0%{opacity:0;transform:translateY(-10px) scale(.95)}to{opacity:1;transform:translateY(0) scale(1)}}._panel_18ltw_21{animation:_slideIn_18ltw_1 .2s ease}
@@ -39,7 +39,7 @@ export interface AccessibilityPanelProps {
39
39
  /** Обработчик закрытия панели */
40
40
  onClose: () => void;
41
41
  /** Позиция панели относительно кнопки */
42
- position?: 'top-right' | 'top-left';
42
+ position?: 'top-right' | 'top-left' | 'bottom-left' | 'bottom-right';
43
43
  }
44
44
  /**
45
45
  * Свойства компонентов управления настройками