{"version":3,"file":"bvi.cjs","sources":["../../src/js/i18n/locales/index.js","../../src/js/config.js","../../src/js/i18n/i18n.js","../../src/js/speech/template.js","../../src/js/util/selector-engine.js","../../src/js/util/dom.js","../../src/js/util/check-config.js","../../src/js/util/collection.js","../../src/js/util/convert.js","../../src/js/util/event-handler.js","../../src/js/util/manipulator.js","../../src/js/util/synth.js","../../src/js/util/cookie.js","../../src/js/speech/speech.js","../../src/js/bvi/controls.js","../../src/js/panel/template.js","../../src/js/bvi/bvi.js","../../src/js/index.esm.js"],"sourcesContent":["import deDE from './de-DE.json'\nimport enUS from './en-US.json'\nimport esES from './es-ES.json'\nimport frFR from './fr-FR.json'\nimport itIT from './it-IT.json'\nimport jaJP from './ja-JP.json'\nimport plPL from './pl-PL.json'\nimport ptBR from './pt-BR.json'\nimport ruRU from './ru-RU.json'\nimport trTR from './tr-TR.json'\nimport zhCN from './zh-CN.json'\n\n/**\n * Встроенные словари. Ключ — код языка BCP 47, значение — тексты интерфейса и голосовые сообщения.\n * Единственный источник списка языков: из него строятся проверка `lang` в конфиге и выбор словаря.\n * @type {Record<string, {text: Record<string, string>, voice: Record<string, string>}>}\n */\nconst locales = {\n  'ru-RU': ruRU,\n  'en-US': enUS,\n  'es-ES': esES,\n  'de-DE': deDE,\n  'fr-FR': frFR,\n  'pt-BR': ptBR,\n  'it-IT': itIT,\n  'tr-TR': trTR,\n  'pl-PL': plPL,\n  'zh-CN': zhCN,\n  'ja-JP': jaJP,\n}\n\n/** Коды поддерживаемых языков. */\nconst LANGUAGES = Object.keys(locales)\n\nexport { LANGUAGES, locales }\n","import { LANGUAGES } from './i18n/locales'\n\n/**\n * Значения параметров Bvi, применяемые при отсутствии пользовательских настроек.\n * @type {Record<string, string|number|boolean>}\n */\nconst Default = {\n  target: '.bvi-open',\n  fontSize: 16,\n  theme: 'white',\n  images: 'grayscale',\n  letterSpacing: 'normal',\n  lineHeight: 'normal',\n  speech: true,\n  speechVoice: '',\n  fontFamily: 'arial',\n  builtElements: false,\n  panelFixed: true,\n  panelHide: false,\n  reload: false,\n  lang: 'ru-RU',\n  copyright: true,\n}\n\n/**\n * Допустимые JavaScript-типы для проверки конфигурации.\n * @type {Record<string, string>}\n */\nconst DefaultType = {\n  target: 'string',\n  fontSize: 'number',\n  theme: 'string',\n  images: '(string|boolean)',\n  letterSpacing: 'string',\n  lineHeight: 'string',\n  speech: 'boolean',\n  speechVoice: 'string',\n  fontFamily: 'string',\n  builtElements: 'boolean',\n  panelFixed: 'boolean',\n  panelHide: 'boolean',\n  reload: 'boolean',\n  lang: 'string',\n  copyright: 'boolean',\n}\n\n/**\n * Регулярные выражения допустимых значений конфигурации.\n * @type {Record<string, string>}\n */\nconst DefaultOptions = {\n  target: '',\n  fontSize: '(^[1-9]$|^[1-3][0-9]?$|^39$)',\n  theme: '(white|black|blue|brown|green)',\n  images: '(true|false|grayscale)',\n  letterSpacing: '(normal|average|big)',\n  lineHeight: '(normal|average|big)',\n  speech: '(true|false)',\n  speechVoice: '',\n  fontFamily: '(arial|times)',\n  builtElements: '(true|false)',\n  panelFixed: '(true|false)',\n  panelHide: '(true|false)',\n  reload: '(true|false)',\n  lang: `(${LANGUAGES.join('|')})`,\n  copyright: '(true|false)',\n}\n\nexport {\n  Default,\n  DefaultOptions,\n  DefaultType,\n}\n","import { locales } from './locales'\n\nconst DEFAULT_LANG = 'ru-RU'\n\n/**\n * Предоставляет локализованные тексты и голосовые сообщения интерфейса.\n * @class\n * @classdesc Выбирает словарь по языку и безопасно возвращает сообщения.\n */\nclass I18n {\n  /**\n   * Создаёт локализатор.\n   * @param {{lang?: string}} options - Параметры локализации; `lang` — код языка из `locales`, иначе русский.\n   */\n  constructor (options) {\n    this._config = options\n  }\n\n  /**\n   * Возвращает сообщение из выбранного словаря. Неизвестный язык или пропущенный ключ не роняют плагин:\n   * берётся русский текст.\n   * @private\n   * @param {'text'|'voice'} type - Раздел словаря.\n   * @param {string} key - Ключ сообщения.\n   * @returns {string} Локализованное сообщение.\n   */\n  _get (type, key) {\n    const messages = (this._config.lang && locales[this._config.lang]) || locales[DEFAULT_LANG]\n\n    return key in messages[type] ? messages[type][key] : locales[DEFAULT_LANG][type][key]\n  }\n\n  /**\n   * Возвращает текстовую подпись интерфейса.\n   * @param {string} key - Ключ подписи.\n   * @returns {string} Локализованный текст.\n   */\n  text (key) {\n    return this._get('text', key)\n  }\n\n  /**\n   * Возвращает голосовую подсказку.\n   * @param {string} key - Ключ подсказки.\n   * @returns {string} Локализованный текст подсказки.\n   */\n  voice (key) {\n    return this._get('voice', key)\n  }\n}\n\nexport default I18n\n","/** @typedef {import('../i18n').I18n} I18n */\n\n/**\n * Создаёт HTML-контролы воспроизведения речи.\n * @param {I18n} i18n - Локализатор подписей кнопок.\n * @returns {string} HTML-разметка контролов речи.\n */\nconst getSpeechControlsTemplate = i18n => {\n  /**\n   * Кнопка управления озвучкой.\n   * @param {string} name - Суффикс класса `bvi-speech-*` (`play`, `pause`, `resume`, `stop`).\n   * @param {string} key - Ключ подписи в словаре.\n   * @param {boolean} [disabled=false] - Кнопка недоступна до начала воспроизведения.\n   * @returns {string} HTML кнопки.\n   */\n  const control = (name, key, disabled = false) => {\n    const label = i18n.text(key)\n    const state = disabled ? ' disabled' : ''\n    const attribute = disabled ? ' disabled' : ''\n\n    return `<button type=\"button\" class=\"bvi-link bvi-speech-${name}${state}\"${attribute} title=\"${label}\">${label}</button>`\n  }\n\n  return `\n  <div class=\"bvi-speech-link\">\n    ${control('play', 'speechPlay')}\n    ${control('pause', 'speechPause', true)}\n    ${control('resume', 'speechResume', true)}\n    ${control('stop', 'speechStop', true)}\n  </div>`\n}\n\nexport { getSpeechControlsTemplate }\n","/**\n * Кандидаты на фокус: окончательно отбираются по tabIndex, доступности и видимости.\n * @type {string}\n */\nconst FOCUSABLE = 'a[href], button, input, select, textarea, summary, [tabindex]'\n\n/**\n * Проверяет видимость элемента с поддержкой старых браузеров.\n * @param {Element} element - Проверяемый элемент.\n * @returns {boolean} Видим ли элемент.\n */\nconst isVisible = element => typeof element.checkVisibility === 'function'\n  ? element.checkVisibility({ visibilityProperty: true })\n  : element.getClientRects().length > 0\n\n/**\n * Поиск элементов. Методы, которым нужен один результат, возвращают элемент или null,\n * а не массив: так вызывающему коду не нужно брать `[0]`.\n */\nconst SelectorEngine = {\n  /**\n   * Все элементы по селектору обычным массивом.\n   * @param {string} selector - CSS-селектор.\n   * @param {ParentNode} [root=document] - Область поиска; по умолчанию вся страница.\n   * @returns {HTMLElement[]} Найденные элементы; пустой массив, если ничего нет.\n   */\n  all (selector, root = document) {\n    return /** @type {HTMLElement[]} */ ([...root.querySelectorAll(selector)])\n  },\n\n  /**\n   * Первый элемент по селектору.\n   * @param {string} selector - CSS-селектор.\n   * @param {ParentNode} [root=document] - Область поиска.\n   * @returns {HTMLElement|null} Элемент или `null`, если ничего не найдено.\n   */\n  one (selector, root = document) {\n    return /** @type {HTMLElement|null} */ (root.querySelector(selector))\n  },\n\n  /**\n   * Прямые потомки, подходящие под селектор.\n   * @param {Element} element - Родитель.\n   * @param {string} selector - CSS-селектор потомков.\n   * @returns {HTMLElement[]} Подходящие дочерние элементы.\n   */\n  children (element, selector) {\n    return /** @type {HTMLElement[]} */ ([...element.children].filter(child => child.matches(selector)))\n  },\n\n  /**\n   * Ближайший предок (сам элемент не в счёт).\n   * @param {Element} element - Элемент, от которого идёт поиск вверх.\n   * @param {string} selector - CSS-селектор предка.\n   * @returns {HTMLElement|null} Предок или `null`, если такого нет.\n   */\n  ancestor (element, selector) {\n    return /** @type {HTMLElement|null} */ (element.parentElement ? element.parentElement.closest(selector) : null)\n  },\n\n  /**\n   * Ближайший сосед в заданном направлении.\n   * @param {Element} element - Исходный элемент.\n   * @param {string} selector - CSS-селектор соседа.\n   * @param {'next'|'previous'} [direction='next'] - Искать после элемента или перед ним.\n   * @returns {HTMLElement|null} Первый подходящий сосед или `null`.\n   */\n  sibling (element, selector, direction = 'next') {\n    const step = direction === 'previous' ? 'previousElementSibling' : 'nextElementSibling'\n\n    for (let node = element[step]; node; node = node[step]) {\n      if (node.matches(selector)) {\n        return /** @type {HTMLElement} */ (node)\n      }\n    }\n\n    return null\n  },\n\n  /**\n   * Подходит ли значение под селектор (не элемент, например `window`, — просто `false`).\n   * @param {*} element - Проверяемое значение.\n   * @param {string} selector - CSS-селектор.\n   * @returns {boolean} `true`, если это элемент и он подходит под селектор.\n   */\n  is (element, selector) {\n    return element instanceof Element && element.matches(selector)\n  },\n\n  /**\n   * Элементы внутри, на которые можно перейти с клавиатуры: видимые, доступные и с tabIndex ≥ 0.\n   * @param {ParentNode} root - Область поиска.\n   * @param {string} [selector] - Оставить только подходящие под селектор.\n   * @returns {HTMLElement[]} Элементы в порядке документа.\n   */\n  focusable (root, selector) {\n    return SelectorEngine.all(FOCUSABLE, root)\n      .filter(element => element.tabIndex >= 0 && !element.matches(':disabled') && isVisible(element))\n      .filter(element => !selector || element.matches(selector))\n  },\n}\n\nexport { SelectorEngine }\n","import { SelectorEngine } from './selector-engine'\n\n/**\n * Проверяет, является ли значение DOM-элементом.\n * @param {*} object - Проверяемое значение.\n * @returns {boolean} Является ли значение DOM-элементом.\n */\nconst isElement = object => {\n  if (!object || typeof object !== 'object') {\n    return false\n  }\n\n  return typeof object.nodeType !== 'undefined'\n}\n\n/**\n * Возвращает элемент по ссылке на него или CSS-селектору.\n * @param {Element|string|null} object - Элемент, CSS-селектор или `null` (тогда результат `null`).\n * @param {ParentNode} [root=document] - Корень поиска.\n * @returns {Element|null} Найденный элемент или `null`.\n */\nconst getElement = (object, root = document) => {\n  if (isElement(object)) {\n    return /** @type {Element} */ (object)\n  }\n\n  return typeof object === 'string' && object.length > 0 ? SelectorEngine.one(object, root) : null\n}\n\n/**\n * Создаёт HTML-элемент с необязательным классом.\n * @param {string} tag - Имя тега.\n * @param {string} [className] - Имя CSS-класса.\n * @returns {HTMLElement} Созданный элемент.\n */\nconst createElement = (tag, className = '') => {\n  const element = document.createElement(tag)\n\n  if (className) {\n    element.className = className\n  }\n\n  return element\n}\n\n/**\n * Вставляет HTML-строку или элемент относительно `target`.\n * @param {Element} target - Целевой элемент.\n * @param {InsertPosition} position - Позиция вставки.\n * @param {string|Element} content - Вставляемая разметка или элемент.\n * @returns {void}\n */\nconst insert = (target, position, content) => {\n  if (typeof content === 'string') {\n    target.insertAdjacentHTML(position, content)\n  } else {\n    target.insertAdjacentElement(position, content)\n  }\n}\n\n/**\n * Удаляет элемент из DOM, если он существует.\n * @param {Element|null} element - Удаляемый элемент.\n * @returns {void}\n */\nconst removeElement = element => {\n  if (element) {\n    element.remove()\n  }\n}\n\n/**\n * Оборачивает дочерние узлы родителя в указанный элемент.\n * @param {Element} parent - Родительский элемент.\n * @param {Element|string} wrapper - Обёртка или имя её тега.\n * @param {string} className - Класс обёртки.\n * @returns {void}\n */\nconst wrapInner = (parent, wrapper, className) => {\n  if (typeof wrapper === 'string') {\n    wrapper = createElement(wrapper)\n  }\n\n  parent.appendChild(wrapper).className = className\n\n  while (parent.firstChild !== wrapper) {\n    wrapper.appendChild(/** @type {ChildNode} */ (parent.firstChild))\n  }\n}\n\n/**\n * Удаляет обёртку, сохраняя её дочерние узлы в DOM.\n * @param {Element|null} wrapper - Удаляемая обёртка.\n * @returns {void}\n */\nconst unwrap = wrapper => {\n  if (!wrapper || !wrapper.parentNode) return\n\n  const docFrag = document.createDocumentFragment()\n\n  while (wrapper.firstChild) {\n    const child = wrapper.removeChild(wrapper.firstChild)\n    docFrag.appendChild(child)\n  }\n\n  wrapper.parentNode.replaceChild(docFrag, wrapper)\n}\n\nexport { createElement, getElement, insert, isElement, removeElement, wrapInner, unwrap }\n","import { isElement } from './dom'\n\n/**\n * Определяет нормализованный тип JavaScript-значения.\n * @param {*} obj - Значение для проверки.\n * @returns {string} Имя типа в нижнем регистре.\n */\nconst toType = obj => {\n  if (obj === null || obj === undefined) {\n    return `${obj}`\n  }\n\n  const tag = {}.toString.call(obj).match(/\\s([a-z]+)/i)\n\n  return tag ? tag[1].toLowerCase() : 'object'\n}\n\n/**\n * Проверяет типы и допустимые значения конфигурации.\n * @param {Record<string, *>} config - Проверяемая конфигурация.\n * @param {Object<string, string>} configTypes - Регулярные выражения типов.\n * @param {Object<string, string>} configOptions - Регулярные выражения значений.\n * @returns {void}\n * @throws {TypeError} Если тип или значение параметра недопустимы.\n */\nconst checkConfig = (config, configTypes, configOptions) => {\n  Object.keys(configTypes).forEach(key => {\n    const expectedTypes = configTypes[key]\n    const value = config[key]\n    const valueType = value && isElement(value) ? 'element' : toType(value)\n\n    if (!new RegExp(expectedTypes).test(valueType)) {\n      throw new TypeError(\n        `Bvi console: Опция \"${key}\" предоставленный тип \"${valueType}\", ожидаемый тип \"${expectedTypes}\".`,\n      )\n    }\n  })\n\n  Object.keys(configOptions).forEach(key => {\n    const expectedOptions = configOptions[key]\n    const value = config[key]\n\n    if (!new RegExp(expectedOptions).test(value)) {\n      throw new TypeError(\n        `Bvi console: Опция \"${key}\" параметр \"${value}\", ожидаемый параметр \"${expectedOptions}\".`,\n      )\n    }\n  })\n}\n\nexport { checkConfig }\n","/**\n * Перебирает собственные ключи объекта.\n * @param {Object} object - Исходный объект.\n * @param {(key: string) => void} callback - Функция для каждого ключа.\n * @returns {void}\n */\nconst getObject = (object, callback) => {\n  Object.keys(object).forEach(key => {\n    if (typeof callback === 'function') {\n      callback(key)\n    }\n  })\n}\n\n/**\n * Перебирает элементы итерируемого значения.\n * @param {Iterable<*>} array - Итерируемое значение.\n * @param {(item: *) => void} callback - Функция для каждого элемента.\n * @returns {void}\n */\nconst getArray = (array, callback) => {\n  Array.from(array).forEach(key => {\n    if (typeof callback === 'function') {\n      callback(key)\n    }\n  })\n}\n\nexport { getObject, getArray }\n","/**\n * Преобразует строковое представление включённого состояния в boolean.\n * @param {*} string - Значение для преобразования.\n * @returns {boolean} `true` для `on`, `true` или `1`; иначе `false`.\n */\nconst stringToBoolean = string => {\n  switch (string) {\n    case 'on':\n    case 'true':\n    case '1':\n      return true\n    default:\n      return false\n  }\n}\n\nexport { stringToBoolean }\n","/**\n * Подписки на события с учётом жизненного цикла плагина.\n *\n * `on()` возвращает функцию отписки, а `scope()` собирает подписки в набор, который снимается\n * одним вызовом `clear()`. Так `destroy()` и повторная инициализация не оставляют лишних обработчиков.\n */\n/**\n * Обработчик события: тип события выводится из имени (`click` → `MouseEvent`, `keydown` → `KeyboardEvent`).\n * @template {string} T\n * @typedef {(event: T extends keyof GlobalEventHandlersEventMap ? GlobalEventHandlersEventMap[T] : Event) => void} Handler\n */\n\nconst EventHandler = {\n  /**\n   * Подписывает обработчик на событие.\n   * @template {string} T\n   * @param {EventTarget} target - Элемент, окно или другой источник событий.\n   * @param {T} type - Тип события, например `click`.\n   * @param {Handler<T>} handler - Обработчик.\n   * @param {AddEventListenerOptions|boolean} [options] - Параметры `addEventListener`.\n   * @returns {() => void} Функция отписки.\n   */\n  on (target, type, handler, options) {\n    const listener = /** @type {EventListener} */ (handler)\n\n    target.addEventListener(type, listener, options)\n\n    return () => target.removeEventListener(type, listener, options)\n  },\n\n  /**\n   * Набор подписок, которые снимаются вместе.\n   * @returns {{\n   *   on: <T extends string>(target: EventTarget, type: T, handler: Handler<T>, options?: AddEventListenerOptions|boolean) => void,\n   *   add: (cleanup: () => void) => void,\n   *   clear: () => void\n   * }} Набор подписок.\n   */\n  scope () {\n    /** @type {(() => void)[]} */\n    const cleanups = []\n\n    return {\n      /**\n       * Подписывает обработчик и запоминает отписку в наборе.\n       * @template {string} T\n       * @param {EventTarget} target - Источник событий.\n       * @param {T} type - Тип события.\n       * @param {Handler<T>} handler - Обработчик.\n       * @param {AddEventListenerOptions|boolean} [options] - Параметры `addEventListener`.\n       * @returns {void}\n       */\n      on (target, type, handler, options) {\n        cleanups.push(EventHandler.on(target, type, handler, options))\n      },\n\n      /**\n       * Добавляет в набор своё действие отмены, например `onvoiceschanged = null`.\n       * @param {() => void} cleanup - Функция, которую вызовет `clear()`.\n       * @returns {void}\n       */\n      add (cleanup) {\n        cleanups.push(cleanup)\n      },\n\n      /**\n       * Снимает все подписки набора и очищает его.\n       * @returns {void}\n       */\n      clear () {\n        cleanups.splice(0).forEach(cleanup => cleanup())\n      },\n    }\n  },\n}\n\nexport { EventHandler }\n","const DATA = 'data-bvi'\n\n/**\n * Строит имя служебного атрибута `data-bvi`. Имя всегда в нижнем регистре: CSS обращается к нему как\n * `[data-bvi-fontsize]`. Без ключа получается сам `data-bvi` (в нём хранится действие кнопки).\n * @param {string} [key] - Суффикс атрибута.\n * @returns {string} Имя атрибута.\n */\nconst dataName = key => key ? `${DATA}-${String(key).toLowerCase()}` : DATA\n\n/**\n * Состояние элемента в одном месте: атрибуты (`getAttr`...), служебные `data-bvi-*` (`getData`...),\n * классы (`addClass`...) и стили (`setStyle`).\n */\nconst Manipulator = {\n  /**\n   * Читает значение атрибута.\n   * @param {Element} element - Элемент.\n   * @param {string} name - Имя атрибута.\n   * @returns {string|null} Значение или `null`, если атрибута нет.\n   */\n  getAttr (element, name) {\n    return element.getAttribute(name)\n  },\n\n  /**\n   * Записывает атрибут, приводя значение к строке.\n   * @param {Element} element - Элемент.\n   * @param {string} name - Имя атрибута.\n   * @param {string|number|boolean} value - Новое значение.\n   * @returns {void}\n   */\n  setAttr (element, name, value) {\n    element.setAttribute(name, String(value))\n  },\n\n  /**\n   * Проверяет наличие атрибута.\n   * @param {Element} element - Элемент.\n   * @param {string} name - Имя атрибута.\n   * @returns {boolean} `true`, если атрибут есть.\n   */\n  hasAttr (element, name) {\n    return element.hasAttribute(name)\n  },\n\n  /**\n   * Удаляет атрибут.\n   * @param {Element} element - Элемент.\n   * @param {string} name - Имя атрибута.\n   * @returns {void}\n   */\n  removeAttr (element, name) {\n    element.removeAttribute(name)\n  },\n\n  /**\n   * Добавляет один или несколько классов.\n   * @param {Element} element - Элемент.\n   * @param {...string} classNames - Добавляемые классы.\n   * @returns {void}\n   */\n  addClass (element, ...classNames) {\n    element.classList.add(...classNames)\n  },\n\n  /**\n   * Убирает один или несколько классов.\n   * @param {Element} element - Элемент.\n   * @param {...string} classNames - Убираемые классы.\n   * @returns {void}\n   */\n  removeClass (element, ...classNames) {\n    element.classList.remove(...classNames)\n  },\n\n  /**\n   * Переключает класс или принудительно включает и выключает его.\n   * @param {Element} element - Элемент.\n   * @param {string} className - Класс.\n   * @param {boolean} [force] - `true` добавляет класс, `false` убирает; без него класс переключается.\n   * @returns {boolean} `true`, если после вызова класс есть у элемента.\n   */\n  toggleClass (element, className, force) {\n    return element.classList.toggle(className, force)\n  },\n\n  /**\n   * Проверяет наличие класса.\n   * @param {Element} element - Элемент.\n   * @param {string} className - Класс.\n   * @returns {boolean} `true`, если класс есть.\n   */\n  hasClass (element, className) {\n    return element.classList.contains(className)\n  },\n\n  /**\n   * Задаёт встроенный стиль. Пустое значение убирает его.\n   * @param {HTMLElement} element - Элемент.\n   * @param {string} property - Свойство в camelCase (`display`, `overflow`, `height`) или CSS-переменная (`--bvi-panel-offset`).\n   * @param {string} value - Значение свойства.\n   * @returns {void}\n   */\n  setStyle (element, property, value) {\n    const style = /** @type {any} */ (element.style)\n\n    if (property.startsWith('--')) {\n      style.setProperty(property, value)\n    } else {\n      style[property] = value\n    }\n  },\n\n  /**\n   * Читает служебный атрибут `data-bvi-*`.\n   * @param {Element} element - Элемент.\n   * @param {string} [key] - `fontSize` → `data-bvi-fontsize`; без ключа читается `data-bvi` (действие кнопки).\n   * @returns {string|null} Значение или `null`, если атрибута нет.\n   */\n  getData (element, key) {\n    return Manipulator.getAttr(element, dataName(key))\n  },\n\n  /**\n   * Записывает служебный атрибут `data-bvi-*`.\n   * @param {Element} element - Элемент.\n   * @param {string} key - Суффикс атрибута: `fontSize` → `data-bvi-fontsize`.\n   * @param {string|number|boolean} value - Новое значение.\n   * @returns {void}\n   */\n  setData (element, key, value) {\n    Manipulator.setAttr(element, dataName(key), value)\n  },\n\n  /**\n   * Удаляет служебный атрибут `data-bvi-*`.\n   * @param {Element} element - Элемент.\n   * @param {string} key - Суффикс атрибута.\n   * @returns {void}\n   */\n  removeData (element, key) {\n    Manipulator.removeAttr(element, dataName(key))\n  },\n}\n\nexport { Manipulator }\n","/**\n * @file Утилита доступа к браузерному синтезатору речи.\n *\n * Возвращает браузерный API синтеза речи.\n * @returns {SpeechSynthesis} Экземпляр синтезатора речи.\n */\nconst synth = () => window.speechSynthesis\n\n/**\n * Приводит код языка к виду `pt-br`: Android отдаёт голоса как `pt_BR`, регистр бывает любым.\n * @param {string} code - Код языка.\n * @returns {string} Код в нижнем регистре с дефисом.\n */\nconst normalizeLang = code => String(code || '').toLowerCase().replace('_', '-')\n\n/**\n * Подбирает голос для языка: сначала полное совпадение кода ('pt-BR'), затем тот же язык\n * другого региона ('pt-PT'). Порядок в списке голосов не важен: точное совпадение всегда важнее.\n * @param {SpeechSynthesisVoice[]} voices - Доступные голоса.\n * @param {string} lang - Код языка, например `pt-BR`.\n * @returns {SpeechSynthesisVoice|undefined} Подходящий голос или `undefined`, если нет голоса на этом языке.\n */\nconst findVoice = (voices, lang) => {\n  const wanted = normalizeLang(lang)\n  /**\n   * Язык без региона.\n   * @param {string} code - Код языка, например `pt-BR`.\n   * @returns {string} Основа кода, например `pt`.\n   */\n  const baseOf = code => normalizeLang(code).split('-')[0]\n\n  return voices.find(voice => normalizeLang(voice.lang) === wanted)\n    || voices.find(voice => baseOf(voice.lang) === baseOf(wanted))\n}\n\nexport { findVoice, synth }\n","/**\n * Сохраняет значение cookie с префиксом `bvi_` на один день.\n * @param {string} name - Имя cookie без префикса.\n * @param {string|number|boolean} [value=''] - Значение, преобразуемое в строку.\n * @returns {void}\n */\nconst setCookie = function (name = '', value = '') {\n  const expires = new Date(Date.now() + 24 * 60 * 60 * 1000)\n\n  document.cookie = `bvi_${name}=${encodeURIComponent(value)};path=/;expires=${expires.toUTCString()};SameSite=Lax`\n}\n\n/**\n * Читает cookie с префиксом `bvi_`.\n * @param {string} name - Имя cookie без префикса.\n * @returns {string|undefined} Значение cookie или `undefined`, если оно не найдено.\n */\nconst getCookie = function (name = '') {\n  const cookieName = `bvi_${name}=`\n  const cookies = document.cookie.split(';')\n\n  for (let i = 0; i < cookies.length; i++) {\n    const cookie = cookies[i].trim()\n\n    if (cookie.indexOf(cookieName) === 0) {\n      return decodeURIComponent(cookie.substring(cookieName.length, cookie.length))\n    }\n  }\n}\n\n/**\n * Удаляет cookie с префиксом `bvi_`.\n * @param {string} name - Имя cookie без префикса.\n * @returns {void}\n */\nconst removeCookie = function (name = '') {\n  document.cookie = `bvi_${name}=;path=/;expires=Thu, 01 Jan 1970 00:00:01 GMT;SameSite=Lax`\n}\n\nexport {\n  setCookie,\n  getCookie,\n  removeCookie,\n}\n","/**\n * Управление синтезом речи, кнопками воспроизведения и подсветкой текста.\n * @file\n */\nimport I18n from '../i18n'\nimport { getSpeechControlsTemplate } from './template'\nimport {\n  createElement,\n  EventHandler,\n  findVoice,\n  insert,\n  Manipulator,\n  removeElement,\n  SelectorEngine,\n  stringToBoolean,\n  synth,\n  unwrap,\n  wrapInner,\n} from '../util'\nimport { getCookie } from '../util/cookie'\n\n/**\n * Управляет озвучиванием текста, состоянием кнопок и подсветкой слов.\n * @class\n * @classdesc Оборачивает Web Speech API и связывает его с DOM-контролами.\n */\nclass Speech {\n  /**\n   * Создаёт контроллер синтеза речи.\n   * @param {{lang?: string}} [options={}] - Параметры речи.\n   */\n  constructor (options = {}) {\n    this._lang = options.lang || 'ru-RU'\n    this._i18n = new I18n({ lang: this._lang })\n    this._statusTimer = null\n    this._playback = null\n    this._listeners = EventHandler.scope()\n  }\n\n  /**\n   * Добавляет контролы речи к найденным блокам текста.\n   * @returns {void}\n   */\n  mount () {\n    this.destroyControls()\n\n    if (!this.isEnabled()) {\n      return\n    }\n\n    SelectorEngine.all('.bvi-speech').forEach((speechBlock, index) => {\n      const id = `bvi-speech-text-id-${index + 1}`\n\n      wrapInner(speechBlock, 'div', `bvi-speech-text ${id}`)\n      insert(speechBlock, 'afterbegin', getSpeechControlsTemplate(this._i18n))\n    })\n\n    this._bindControls()\n  }\n\n  /**\n   * Останавливает речь и удаляет связанные DOM-контролы.\n   * @returns {void}\n   */\n  destroy () {\n    this.stopStatusTimer()\n    this.destroyControls()\n\n    if (this.isSupported()) {\n      this._cancelSpeech()\n    }\n\n    this._playback = null\n  }\n\n  /**\n   * Отменяет все реплики в очереди синтезатора и снимает с него паузу: иначе после паузы следующая озвучка не начнётся.\n   * @private\n   * @returns {void}\n   */\n  _cancelSpeech () {\n    synth().cancel()\n\n    if (synth().paused) {\n      synth().resume()\n    }\n  }\n\n  /**\n   * Удаляет контролы речи и восстанавливает исходный текст.\n   * @returns {void}\n   */\n  destroyControls () {\n    this._listeners.clear()\n    this._restoreAllHighlightedText()\n    SelectorEngine.all('.bvi-speech-text').forEach(element => unwrap(element))\n    SelectorEngine.all('.bvi-speech-link').forEach(element => removeElement(element))\n  }\n\n  /**\n   * Запускает опрос синтезатора раз в секунду: когда речь закончилась (очередь пуста, пауз нет),\n   * кнопки блоков возвращаются в состояние «остановлено». Ничего не делает, если озвучка выключена.\n   * @returns {void}\n   */\n  startStatusTimer () {\n    this.stopStatusTimer()\n\n    if (!this.isEnabled()) {\n      return\n    }\n\n    this._statusTimer = setInterval(() => {\n      if (this._playback && this._playback.paused) {\n        return\n      }\n\n      if (!synth().pending && !synth().speaking && !synth().paused) {\n        this.disableButtons()\n      }\n    }, 1000)\n  }\n\n  /**\n   * Останавливает опрос состояния синтезатора.\n   * @returns {void}\n   */\n  stopStatusTimer () {\n    if (this._statusTimer) {\n      clearInterval(this._statusTimer)\n      this._statusTimer = null\n    }\n  }\n\n  /**\n   * Озвучивает текст и при необходимости подсвечивает произносимые слова.\n   * @param {string} text - Текст для озвучивания.\n   * @param {HTMLElement|null} [element=null] - Блок для подсветки слов.\n   * @param {boolean} [echo=false] - Включить подсветку во время озвучивания.\n   * @returns {void}\n   */\n  speak (text, element = null, echo = false) {\n    if (!this.isEnabled()) {\n      return\n    }\n\n    this._restoreAllHighlightedText()\n    this._cancelSpeech()\n    this._startPlayback(String(text), element, echo)\n  }\n\n  /**\n   * Делит текст на фрагменты и ставит их в очередь синтезатора, при необходимости готовя подсветку слов.\n   * @private\n   * @param {string} text - Полный текст блока.\n   * @param {HTMLElement|null} element - Блок, в котором подсвечиваются произносимые слова.\n   * @param {boolean} [echo=false] - Подсвечивать ли слова во время озвучки.\n   * @param {number} [startPosition=0] - Индекс символа, с которого начать; нужен для продолжения после паузы.\n   * @returns {void}\n   */\n  _startPlayback (text, element, echo = false, startPosition = 0) {\n    const sourceText = String(text)\n    const target = echo && element ? this._prepareHighlighting(element) : null\n    const chunks = this._splitText(sourceText.slice(startPosition), startPosition)\n\n    const playback = {\n      echo,\n      element,\n      paused: false,\n      pauseFallback: false,\n      position: startPosition,\n      target,\n      text: sourceText,\n    }\n\n    this._playback = playback\n\n    chunks.forEach((chunk, index) => {\n      const utter = this._createUtterance(chunk.text)\n\n      if (target) {\n        this._addHighlighting(utter, target, chunk.start, index === chunks.length - 1, playback)\n      }\n\n      try {\n        synth().speak(utter)\n      } catch (error) {\n        this._playback = null\n        this._restoreAllHighlightedText()\n      }\n    })\n  }\n\n  /**\n   * Проверяет, включён ли синтез речи в настройках и браузере.\n   * @returns {boolean} Доступна ли озвучка.\n   */\n  isEnabled () {\n    return this.isSupported() && stringToBoolean(getCookie('speech'))\n  }\n\n  /**\n   * Проверяет наличие Web Speech API.\n   * @returns {boolean} Поддерживается ли синтез речи.\n   */\n  isSupported () {\n    return 'speechSynthesis' in window\n  }\n\n  /**\n   * Переводит кнопки речи в состояние «остановлено».\n   * @returns {void}\n   */\n  disableButtons () {\n    SelectorEngine.all('.bvi-speech-play').forEach(element => this._setDisabled(element, false))\n    SelectorEngine.all('.bvi-speech-pause').forEach(element => this._setDisabled(element, true))\n    SelectorEngine.all('.bvi-speech-resume').forEach(element => this._setDisabled(element, true))\n    SelectorEngine.all('.bvi-speech-stop').forEach(element => this._setDisabled(element, true))\n  }\n\n  /**\n   * Делает кнопку доступной или недоступной: класс `disabled` и свойство `disabled` меняются вместе.\n   * @private\n   * @param {HTMLElement} element - Кнопка озвучки.\n   * @param {boolean} disabled - `true` — кнопка недоступна.\n   * @returns {void}\n   */\n  _setDisabled (element, disabled) {\n    const button = /** @type {HTMLButtonElement} */ (element)\n\n    Manipulator.toggleClass(button, 'disabled', disabled)\n    button.disabled = disabled\n  }\n\n  /**\n   * Подписывает кнопки «Воспроизвести», «Пауза», «Продолжить» и «Стоп» во всех блоках озвучки на обработчики.\n   * @private\n   * @returns {void}\n   */\n  _bindControls () {\n    this._onClickAll('.bvi-speech-play', button => this._playBlock(button))\n    this._onClickAll('.bvi-speech-pause', button => this._pauseBlock(button))\n    this._onClickAll('.bvi-speech-resume', button => this._resumeBlock(button))\n    this._onClickAll('.bvi-speech-stop', button => this._stopBlock(button))\n  }\n\n  /**\n   * Возвращает контейнер кнопок озвучки, в котором лежит кнопка.\n   * @private\n   * @param {HTMLElement} button - Нажатая кнопка.\n   * @returns {HTMLElement|null} Контейнер `.bvi-speech-link` или `null`.\n   */\n  _getControls (button) {\n    return SelectorEngine.ancestor(button, '.bvi-speech-link')\n  }\n\n  /**\n   * Озвучивает текст блока, к которому относится нажатая кнопка, и переводит кнопки блока в состояние «воспроизведение».\n   * @private\n   * @param {HTMLElement} button - Нажатая кнопка «Воспроизвести».\n   * @returns {void}\n   */\n  _playBlock (button) {\n    const controls = this._getControls(button)\n    const text = controls ? SelectorEngine.sibling(controls, '.bvi-speech-text') : null\n\n    if (!controls || !text) {\n      return\n    }\n\n    const hadFocus = controls.contains(document.activeElement)\n\n    this.speak(text.textContent, text, true)\n    this.disableButtons()\n\n    this._setControlsState(controls, 'playing', hadFocus)\n  }\n\n  /**\n   * Ставит воспроизведение на паузу и переводит кнопки блока в состояние «пауза».\n   * @private\n   * @param {HTMLElement} button - Нажатая кнопка «Пауза».\n   * @returns {void}\n   */\n  _pauseBlock (button) {\n    const controls = this._getControls(button)\n\n    if (!controls) {\n      return\n    }\n\n    synth().pause()\n    this._pauseWithFallback()\n    this._setControlsState(controls, 'paused')\n  }\n\n  /**\n   * Продолжает воспроизведение после паузы. Если пауза была заменена отменой речи (`pauseFallback`),\n   * озвучка запускается заново с сохранённой позиции.\n   * @private\n   * @param {HTMLElement} button - Нажатая кнопка «Продолжить».\n   * @returns {void}\n   */\n  _resumeBlock (button) {\n    const controls = this._getControls(button)\n\n    if (!controls) {\n      return\n    }\n\n    if (this._playback && this._playback.pauseFallback) {\n      const position = this._getResumePosition()\n      const playback = this._playback\n\n      this._restoreHighlightedText(playback.target)\n      this._startPlayback(playback.text, playback.element, playback.echo, position)\n    } else {\n      if (this._playback) {\n        this._playback.paused = false\n      }\n\n      synth().resume()\n    }\n\n    this._setControlsState(controls, 'playing')\n  }\n\n  /**\n   * Останавливает воспроизведение, сбрасывает состояние и убирает подсветку слов.\n   * @private\n   * @param {HTMLElement} button - Нажатая кнопка «Стоп».\n   * @returns {void}\n   */\n  _stopBlock (button) {\n    const controls = this._getControls(button)\n\n    if (!controls) {\n      return\n    }\n\n    this._cancelSpeech()\n    this._playback = null\n    this._setControlsState(controls, 'stopped')\n    this._restoreAllHighlightedText()\n  }\n\n  /**\n   * Обновляет доступность кнопок управления воспроизведением.\n   * @private\n   * @param {HTMLElement} controls - Контейнер кнопок.\n   * @param {'playing'|'paused'|'stopped'} state - Состояние воспроизведения.\n   * @param {boolean} [hadFocus] - Был ли фокус внутри контейнера.\n   * @returns {void}\n   */\n  _setControlsState (controls, state, hadFocus = controls.contains(document.activeElement)) {\n    /**\n     * Кнопка внутри контейнера: все четыре кнопки создаёт шаблон, поэтому она всегда есть.\n     * @param {string} name - Суффикс класса `bvi-speech-*`.\n     * @returns {HTMLElement} Кнопка.\n     */\n    const button = name => /** @type {HTMLElement} */ (SelectorEngine.one(`.bvi-speech-${name}`, controls))\n    const play = button('play')\n    const pause = button('pause')\n    const resume = button('resume')\n    const stop = button('stop')\n\n    this._setDisabled(play, state !== 'stopped')\n    this._setDisabled(pause, state !== 'playing')\n    this._setDisabled(resume, state !== 'paused')\n    this._setDisabled(stop, state === 'stopped')\n\n    if (hadFocus) {\n      ({ playing: pause, paused: resume, stopped: play })[state].focus()\n    }\n  }\n\n  /**\n   * Помечает воспроизведение приостановленным. Если `pause()` ненадёжна (Firefox) или синтезатор продолжил\n   * говорить спустя 120 мс, речь отменяется, а продолжение запускается заново с сохранённой позиции.\n   * @private\n   * @returns {void}\n   */\n  _pauseWithFallback () {\n    if (!this._playback) {\n      return\n    }\n\n    this._playback.paused = true\n\n    if (this._needsCancelForPause()) {\n      this._playback.pauseFallback = true\n      this._cancelSpeech()\n      return\n    }\n\n    setTimeout(() => {\n      if (!this._playback || !this._playback.paused) {\n        return\n      }\n\n      if (synth().speaking && !synth().paused) {\n        this._playback.pauseFallback = true\n        this._cancelSpeech()\n      }\n    }, 120)\n  }\n\n  /**\n   * Определяет, нужно ли заменять паузу отменой речи: в Firefox `pause()` не останавливает речь надёжно.\n   * @private\n   * @returns {boolean} `true`, если браузер — Firefox.\n   */\n  _needsCancelForPause () {\n    return typeof navigator !== 'undefined' && /firefox/i.test(navigator.userAgent)\n  }\n\n  /**\n   * Вычисляет позицию продолжения: ближайшая граница слова после последней произнесённой позиции,\n   * чтобы озвучка не начиналась с середины слова.\n   * @private\n   * @returns {number} Индекс символа в полном тексте блока; `0`, если воспроизведения нет.\n   */\n  _getResumePosition () {\n    if (!this._playback) {\n      return 0\n    }\n\n    const position = Number(this._playback.position) || 0\n    const text = this._playback.text\n\n    if (position <= 0) {\n      return 0\n    }\n\n    const nextSpace = text.slice(position).search(/\\s/)\n\n    if (nextSpace < 0) {\n      return position\n    }\n\n    return Math.min(position + nextSpace + 1, text.length)\n  }\n\n  /**\n   * Делит текст на фрагменты до 120 символов, предпочитая границы по знакам препинания и пробелам:\n   * длинные реплики синтезатор нередко обрывает.\n   * @private\n   * @param {string} text - Текст для озвучки.\n   * @param {number} [startOffset=0] - Смещение текста в полном тексте блока: по нему подсветка узнаёт абсолютную позицию.\n   * @returns {{start: number, text: string}[]} Фрагменты и индекс начала каждого в полном тексте.\n   */\n  _splitText (text, startOffset = 0) {\n    const chunkLength = 120\n    const patternRegex = new RegExp(\n      '^[\\\\s\\\\S]{' + Math.floor(chunkLength / 2) + ',' + chunkLength + '}[.!?,]{1}' +\n      '|^[\\\\s\\\\S]{1,' + chunkLength + '}$' +\n      '|^[\\\\s\\\\S]{1,' + chunkLength + '} ',\n    )\n    const chunks = []\n    let value = String(text)\n\n    while (value.length > 0) {\n      const match = value.match(patternRegex)\n\n      if (!match) {\n        chunks.push({\n          start: startOffset + String(text).length - value.length,\n          text: value.slice(0, chunkLength),\n        })\n        value = value.slice(chunkLength)\n        continue\n      }\n\n      chunks.push({\n        start: startOffset + String(text).length - value.length,\n        text: match[0],\n      })\n      value = value.substring(match[0].length)\n    }\n\n    return chunks\n  }\n\n  /**\n   * Создаёт реплику синтезатора. Голос выбирается так: сохранённый в настройках (cookie `speechVoice`),\n   * иначе подходящий языку плагина (`findVoice`), иначе выбор остаётся за браузером по `utter.lang`.\n   * @private\n   * @param {string} text - Текст фрагмента.\n   * @returns {SpeechSynthesisUtterance} Реплика с громкостью, скоростью, тоном, языком и голосом.\n   */\n  _createUtterance (text) {\n    const utter = new SpeechSynthesisUtterance(text.trim())\n    const voices = synth().getVoices()\n    const selectedVoice = getCookie('speechVoice')\n\n    utter.volume = 1\n    utter.rate = 1\n    utter.pitch = 1\n    utter.lang = this._lang\n\n    const configuredVoice = voices.find(voice => {\n      return selectedVoice && this._isSelectedVoice(voice, selectedVoice)\n    })\n\n    if (configuredVoice) {\n      utter.voice = configuredVoice\n      utter.lang = configuredVoice.lang\n      return utter\n    }\n\n    const langVoice = findVoice(voices, this._lang)\n\n    if (langVoice) {\n      utter.voice = langVoice\n      utter.lang = langVoice.lang\n    }\n\n    return utter\n  }\n\n  /**\n   * Проверяет, совпадает ли голос с сохранённым в настройках: по `voiceURI` или по имени.\n   * @private\n   * @param {SpeechSynthesisVoice} voice - Проверяемый голос.\n   * @param {string} selectedVoice - Значение из cookie `speechVoice`.\n   * @returns {boolean} `true`, если это выбранный голос.\n   */\n  _isSelectedVoice (voice, selectedVoice) {\n    return voice && (voice.voiceURI === selectedVoice || voice.name === selectedVoice)\n  }\n\n  /**\n   * Оборачивает каждое слово блока в `span.bvi-speech-word` с границами в `data-bvi-start` и `data-bvi-end`,\n   * чтобы подсвечивать произносимое слово. Исходный HTML сохраняется для восстановления.\n   * @private\n   * @param {HTMLElement} element - Блок с текстом.\n   * @returns {HTMLElement} Тот же блок, готовый к подсветке.\n   */\n  _prepareHighlighting (element) {\n    if (!Manipulator.getData(element, 'originalHtml')) {\n      Manipulator.setData(element, 'originalHtml', element.innerHTML)\n    }\n\n    const text = element.textContent\n    const fragment = document.createDocumentFragment()\n    const tokens = text.match(/\\S+|\\s+/g) || []\n    let offset = 0\n\n    tokens.forEach(token => {\n      if (/^\\s+$/.test(token)) {\n        fragment.appendChild(document.createTextNode(token))\n      } else {\n        const word = createElement('span')\n\n        word.className = 'bvi-speech-word'\n        Manipulator.setData(word, 'start', offset)\n        Manipulator.setData(word, 'end', offset + token.length)\n        word.textContent = token\n        fragment.appendChild(word)\n      }\n\n      offset += token.length\n    })\n\n    element.innerHTML = ''\n    element.appendChild(fragment)\n    Manipulator.addClass(element, 'bvi-highlighting')\n\n    return element\n  }\n\n  /**\n   * Подписывает реплику на события синтезатора: `onboundary` подсвечивает слово и запоминает позицию,\n   * `onend` последней реплики убирает подсветку. Если границы слов не приходят 700 мс (браузер не даёт их),\n   * включается запасная подсветка блока целиком.\n   * @private\n   * @param {SpeechSynthesisUtterance} utter - Реплика фрагмента.\n   * @param {HTMLElement} element - Блок, подготовленный `_prepareHighlighting`.\n   * @param {number} [offset=0] - Индекс начала фрагмента в полном тексте блока.\n   * @param {boolean} [isLast=false] - Последний ли это фрагмент воспроизведения.\n   * @param {Object|null} [playback=null] - Состояние воспроизведения: события уже прерванного воспроизведения игнорируются.\n   * @returns {void}\n   */\n  _addHighlighting (utter, element, offset = 0, isLast = false, playback = null) {\n    let hasBoundary = false\n    const fallbackTimer = setTimeout(() => {\n      if (!hasBoundary) {\n        Manipulator.addClass(element, 'bvi-highlighting-fallback')\n      }\n    }, 700)\n\n    /**\n     * Относится ли событие к воспроизведению, которое уже прервали или заменили новым.\n     * @returns {boolean} `true`, если событие устарело и его нужно игнорировать.\n     */\n    const isStale = () => playback !== null && this._playback !== playback\n\n    utter.onboundary = event => {\n      if (isStale()) {\n        return\n      }\n\n      hasBoundary = true\n      clearTimeout(fallbackTimer)\n      Manipulator.removeClass(element, 'bvi-highlighting-fallback')\n      this._setPlaybackPosition(offset + event.charIndex)\n      this._highlightWordAt(element, offset + event.charIndex)\n    }\n\n    utter.onend = () => {\n      clearTimeout(fallbackTimer)\n\n      if (isStale()) {\n        return\n      }\n\n      if (this._playback && this._playback.paused) {\n        return\n      }\n\n      if (isLast) {\n        this._restoreHighlightedText(element)\n        this._playback = null\n      }\n    }\n  }\n\n  /**\n   * Запоминает индекс последнего произнесённого символа для продолжения после паузы.\n   * @private\n   * @param {number|string} position - Индекс символа в полном тексте блока.\n   * @returns {void}\n   */\n  _setPlaybackPosition (position) {\n    if (this._playback) {\n      this._playback.position = Number(position) || 0\n    }\n  }\n\n  /**\n   * Подсвечивает слово, в границы которого попадает символ, и снимает подсветку с предыдущего слова.\n   * @private\n   * @param {HTMLElement} element - Блок с подготовленными словами.\n   * @param {number|string} position - Индекс символа в полном тексте блока.\n   * @returns {void}\n   */\n  _highlightWordAt (element, position) {\n    const index = Number(position) >>> 0\n    const active = SelectorEngine.one('.bvi-speech-word-active', element)\n\n    if (active) {\n      Manipulator.removeClass(active, 'bvi-speech-word-active')\n    }\n\n    const word = SelectorEngine.all('.bvi-speech-word', element).find(item => {\n      const start = Number(Manipulator.getData(item, 'start'))\n      const end = Number(Manipulator.getData(item, 'end'))\n\n      return index >= start && index < end\n    })\n\n    if (word) {\n      Manipulator.addClass(word, 'bvi-speech-word-active')\n    }\n  }\n\n  /**\n   * Снимает подсветку во всех блоках озвучки и возвращает им исходный HTML.\n   * @private\n   * @returns {void}\n   */\n  _restoreAllHighlightedText () {\n    SelectorEngine.all('.bvi-speech-text.bvi-highlighting').forEach(element => {\n      this._restoreHighlightedText(element)\n    })\n  }\n\n  /**\n   * Возвращает блоку исходный HTML и убирает классы подсветки.\n   * @private\n   * @param {HTMLElement|null} element - Блок озвучки; `null` игнорируется.\n   * @returns {void}\n   */\n  _restoreHighlightedText (element) {\n    if (!element) {\n      return\n    }\n\n    Manipulator.removeClass(element, 'bvi-highlighting', 'bvi-highlighting-fallback')\n\n    const original = Manipulator.getData(element, 'originalHtml')\n\n    if (original) {\n      element.innerHTML = original\n      Manipulator.removeData(element, 'originalHtml')\n    }\n  }\n\n  /**\n   * Подписывает клик на все элементы, найденные по селектору; подписки снимаются вместе с остальными в `destroyControls()`.\n   * @private\n   * @param {string} selector - CSS-селектор кнопок.\n   * @param {(button: HTMLElement) => void} callback - Обработчик; получает нажатую кнопку, `preventDefault()` уже вызван.\n   * @returns {void}\n   */\n  _onClickAll (selector, callback) {\n    SelectorEngine.all(selector).forEach(element => {\n      this._listeners.on(element, 'click', event => {\n        event.preventDefault()\n        callback(element)\n      })\n    })\n  }\n}\n\nexport { Speech }\nexport default Speech\n","/**\n * Связывает значения настроек с селекторами кнопок и ключами озвучки.\n * @type {Record<string, Record<string, [string, string]>>}\n */\nconst DATA_CONTROLS = {\n  theme: {\n    white: ['.bvi-theme-white', 'siteColorBlackOnWhite'],\n    black: ['.bvi-theme-black', 'siteColorWhiteOnBlack'],\n    blue: ['.bvi-theme-blue', 'siteColorDarkBlueOnBlue'],\n    brown: ['.bvi-theme-brown', 'siteColorBeigeBrown'],\n    green: ['.bvi-theme-green', 'siteColorGreenOnDarkBrown'],\n  },\n  images: {\n    true: ['.bvi-images-on', 'imagesOn'],\n    false: ['.bvi-images-off', 'imagesOff'],\n    grayscale: ['.bvi-images-grayscale', 'imagesGrayscale'],\n  },\n  speech: {\n    true: ['.bvi-speech-on', 'speechOn'],\n    false: ['.bvi-speech-off', 'speechOff'],\n  },\n  lineHeight: {\n    normal: ['.bvi-line-height-normal', 'lineHeightNormal'],\n    average: ['.bvi-line-height-average', 'lineHeightAverage'],\n    big: ['.bvi-line-height-big', 'lineHeightBig'],\n  },\n  letterSpacing: {\n    normal: ['.bvi-letter-spacing-normal', 'letterSpacingNormal'],\n    average: ['.bvi-letter-spacing-average', 'letterSpacingAverage'],\n    big: ['.bvi-letter-spacing-big', 'letterSpacingBig'],\n  },\n  fontFamily: {\n    arial: ['.bvi-font-family-arial', 'fontArial'],\n    times: ['.bvi-font-family-times', 'fontTimes'],\n  },\n  builtElements: {\n    true: ['.bvi-built-elements-on', 'builtElementsOn'],\n    false: ['.bvi-built-elements-off', 'builtElementsOff'],\n  },\n}\n\nexport { DATA_CONTROLS }\n","/** @typedef {import('../i18n').I18n} I18n */\n\n/**\n * Создаёт HTML-разметку панели настроек.\n * @param {I18n} i18n - Локализатор подписей панели.\n * @param {boolean} [panelHidden=false] - Скрыть панель при создании.\n * @param {boolean} [copyright=true] - Добавить ссылку на проект.\n * @returns {string} HTML-разметка панели.\n */\nconst getPanelTemplate = (i18n, panelHidden = false, copyright = true) => {\n  const panelHide = panelHidden ? ' bvi-panel-hide' : ''\n  /**\n   * Атрибуты подписи кнопки без текста: `aria-label` и `title` с одним и тем же переводом.\n   * @param {string} key - Ключ подписи в словаре.\n   * @returns {string} Строка атрибутов для вставки в тег.\n   */\n  const label = key => `aria-label=\"${i18n.text(key)}\" title=\"${i18n.text(key)}\"`\n  /**\n   * Атрибуты кнопки-переключателя: подпись и начальное состояние `aria-pressed=\"false\"`.\n   * @param {string} key - Ключ подписи в словаре.\n   * @returns {string} Строка атрибутов для вставки в тег.\n   */\n  const toggle = key => `${label(key)} aria-pressed=\"false\"`\n\n  return `\n    <div class=\"bvi-panel${panelHide}\" role=\"region\" aria-label=\"${i18n.text('panelLabel')}\">\n      <button type=\"button\" class=\"bvi-link bvi-menu-toggle\" data-bvi=\"menu\" aria-expanded=\"false\" aria-controls=\"bvi-menu\">\n        <i class=\"bvi-images bvi-images-bars\" aria-hidden=\"true\"></i>\n        <span>${i18n.text('menu')}</span>\n      </button>\n      <div class=\"bvi-menu\" id=\"bvi-menu\">\n      <div class=\"bvi-blocks bvi-block-center\">\n        <div class=\"bvi-block\" role=\"group\" aria-labelledby=\"bvi-title-fontSize\">\n          <div class=\"bvi-block-title\" id=\"bvi-title-fontSize\">${i18n.text('fontSize')}</div>\n          <button type=\"button\" class=\"bvi-link bvi-font-size-minus\" ${label('fontSizeMinus')}>А-</button>\n          <button type=\"button\" class=\"bvi-link bvi-font-size-plus\" ${label('fontSizePlus')}>А+</button>\n        </div>\n        <div class=\"bvi-block\" role=\"group\" aria-labelledby=\"bvi-title-siteColors\">\n          <div class=\"bvi-block-title\" id=\"bvi-title-siteColors\">${i18n.text('siteColors')}</div>\n          <button type=\"button\" class=\"bvi-link bvi-theme-white\" ${toggle('themeWhite')}>Ц</button>\n          <button type=\"button\" class=\"bvi-link bvi-theme-black\" ${toggle('themeBlack')}>Ц</button>\n          <button type=\"button\" class=\"bvi-link bvi-theme-blue\" ${toggle('themeBlue')}>Ц</button>\n          <button type=\"button\" class=\"bvi-link bvi-theme-brown\" ${toggle('themeBrown')}>Ц</button>\n          <button type=\"button\" class=\"bvi-link bvi-theme-green\" ${toggle('themeGreen')}>Ц</button>\n        </div>\n        <div class=\"bvi-block\" role=\"group\" aria-labelledby=\"bvi-title-images\">\n          <div class=\"bvi-block-title\" id=\"bvi-title-images\">${i18n.text('images')}</div>\n          <button type=\"button\" class=\"bvi-link bvi-images-on\" ${toggle('imagesOn')}>\n            <i class=\"bvi-images bvi-images-image\" aria-hidden=\"true\"></i>\n          </button>\n          <button type=\"button\" class=\"bvi-link bvi-images-off\" ${toggle('imagesOff')}>\n            <i class=\"bvi-images bvi-images-minus-circle\" aria-hidden=\"true\"></i>\n          </button>\n          <button type=\"button\" class=\"bvi-link bvi-images-grayscale\" ${toggle('imagesGrayscale')}>\n            <i class=\"bvi-images bvi-images-adjust\" aria-hidden=\"true\"></i>\n          </button>\n        </div>\n        <div class=\"bvi-block\" role=\"group\" aria-labelledby=\"bvi-title-speech\">\n          <div class=\"bvi-block-title\" id=\"bvi-title-speech\">${i18n.text('speech')}</div>\n          <button type=\"button\" class=\"bvi-link bvi-speech-off\" ${toggle('speechOff')}>\n            <i class=\"bvi-images bvi-images-volume-off\" aria-hidden=\"true\"></i>\n          </button>\n          <button type=\"button\" class=\"bvi-link bvi-speech-on\" ${toggle('speechOn')}>\n            <i class=\"bvi-images bvi-images-volume-up\" aria-hidden=\"true\"></i>\n          </button>\n        </div>\n        <div class=\"bvi-block\" role=\"group\" aria-labelledby=\"bvi-title-settings\">\n          <div class=\"bvi-block-title\" id=\"bvi-title-settings\">${i18n.text('settings')}</div>\n          <button type=\"button\" class=\"bvi-link\" data-bvi=\"modal\" ${label('openSettings')} aria-haspopup=\"dialog\">\n            <i class=\"bvi-images bvi-images-cog\" aria-hidden=\"true\"></i>\n          </button>\n          <button type=\"button\" class=\"bvi-link\" data-bvi=\"close\">\n            ${i18n.text('regularVersionOfTheSite')}\n          </button>\n          <button type=\"button\" class=\"bvi-link\" data-bvi=\"panel-hide\" ${label('hidePanel')}>\n            <i class=\"bvi-images bvi-images-minus\" aria-hidden=\"true\"></i>\n          </button>\n        </div>\n      </div>\n      </div>\n      <div class=\"bvi-modal\">\n        <div class=\"bvi-modal-dialog\">\n          <div class=\"bvi-modal-content\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"bvi-modal-title\">\n            <div class=\"bvi-modal-header\">\n              <div class=\"bvi-modal-title\" id=\"bvi-modal-title\">${i18n.text('settings')}</div>\n              <button type=\"button\" class=\"bvi-link bvi-modal-close\" data-bvi=\"modal-close\" ${label('closeSettings')}>×</button>\n            </div>\n            <div class=\"bvi-modal-body\">\n              <div class=\"bvi-blocks bvi-block-center\">\n                <div class=\"bvi-block\" role=\"group\" aria-labelledby=\"bvi-title-letterSpacing\">\n                  <div class=\"bvi-block-title\" id=\"bvi-title-letterSpacing\">${i18n.text('letterSpacing')}</div>\n                  <button type=\"button\" class=\"bvi-link bvi-letter-spacing-normal\" aria-pressed=\"false\">${i18n.text('normal')}</button>\n                  <button type=\"button\" class=\"bvi-link bvi-letter-spacing-average\" aria-pressed=\"false\">${i18n.text('average')}</button>\n                  <button type=\"button\" class=\"bvi-link bvi-letter-spacing-big\" aria-pressed=\"false\">${i18n.text('big')}</button>\n                </div>\n                <div class=\"bvi-block\" role=\"group\" aria-labelledby=\"bvi-title-lineHeight\">\n                  <div class=\"bvi-block-title\" id=\"bvi-title-lineHeight\">${i18n.text('lineHeight')}</div>\n                  <button type=\"button\" class=\"bvi-link bvi-line-height-normal\" aria-pressed=\"false\">${i18n.text('normal')}</button>\n                  <button type=\"button\" class=\"bvi-link bvi-line-height-average\" aria-pressed=\"false\">${i18n.text('average')}</button>\n                  <button type=\"button\" class=\"bvi-link bvi-line-height-big\" aria-pressed=\"false\">${i18n.text('big')}</button>\n                </div>\n                <div class=\"bvi-block\" role=\"group\" aria-labelledby=\"bvi-title-font\">\n                  <div class=\"bvi-block-title\" id=\"bvi-title-font\">${i18n.text('font')}</div>\n                  <button type=\"button\" class=\"bvi-link bvi-font-family-arial\" aria-pressed=\"false\">${i18n.text('arial')}</button>\n                  <button type=\"button\" class=\"bvi-link bvi-font-family-times\" aria-pressed=\"false\">${i18n.text('times')}</button>\n                </div>\n                <div class=\"bvi-block\" role=\"group\" aria-labelledby=\"bvi-title-builtElements\">\n                  <div class=\"bvi-block-title\" id=\"bvi-title-builtElements\">${i18n.text('builtElements')}</div>\n                  <button type=\"button\" class=\"bvi-link bvi-built-elements-on\" aria-pressed=\"false\">${i18n.text('on')}</button>\n                  <button type=\"button\" class=\"bvi-link bvi-built-elements-off\" aria-pressed=\"false\">${i18n.text('off')}</button>\n                </div>\n                <div class=\"bvi-block bvi-block-wide\">\n                  <label class=\"bvi-block-title\" for=\"bvi-speech-voice\">${i18n.text('speechVoice')}</label>\n                  <select class=\"bvi-select bvi-speech-voice\" id=\"bvi-speech-voice\">\n                    <option value=\"\">${i18n.text('speechVoiceDefault')}</option>\n                  </select>\n                </div>\n              </div>\n              ${copyright ? `<div class=\"bvi-blocks bvi-block-center\">\n                <a href=\"https://bvi.isvek.ru\" class=\"bvi-copyright\" target=\"_blank\" rel=\"noopener noreferrer\" aria-label=\"bvi.isvek.ru, ${i18n.text('openInNewTab')}\">bvi.isvek.ru</a>\n              </div>` : ''}\n            </div>\n            <div class=\"bvi-modal-footer\">\n              <button type=\"button\" class=\"bvi-link bvi-reset\">${i18n.text('reset')}</button>\n              <button type=\"button\" class=\"bvi-link bvi-modal-dismiss\" data-bvi=\"modal-close\">${i18n.text('close')}</button>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>`\n}\n\n/**\n * Создаёт кнопку показа скрытой панели.\n * @param {I18n} i18n - Локализатор подписи кнопки.\n * @param {boolean} [panelHidden=false] - Признак скрытого состояния панели.\n * @returns {string} HTML-разметка кнопки.\n */\nconst getPanelShowLinkTemplate = (i18n, panelHidden = false) => {\n  const linkHide = panelHidden ? 'bvi-show' : 'bvi-hide'\n  const label = i18n.text('showPanel')\n\n  return `\n    <button type=\"button\" class=\"bvi-link bvi-link-fixed-top bvi-no-styles ${linkHide}\" data-bvi=\"panel-show\" aria-label=\"${label}\" title=\"${label}\">\n      <i class=\"bvi-images bvi-images-eye bvi-images-size-32 bvi-no-styles\" aria-hidden=\"true\"></i>\n    </button>`\n}\n\nexport {\n  getPanelShowLinkTemplate,\n  getPanelTemplate,\n}\n","import { Default, DefaultOptions, DefaultType } from '../config'\nimport I18n from '../i18n'\nimport Speech from '../speech'\nimport {\n  checkConfig,\n  createElement,\n  EventHandler,\n  getArray,\n  getElement,\n  getObject,\n  insert,\n  Manipulator,\n  removeElement,\n  SelectorEngine,\n  stringToBoolean,\n  unwrap,\n  wrapInner,\n} from '../util'\nimport {\n  getCookie,\n  removeCookie,\n  setCookie,\n} from '../util/cookie'\nimport { version } from '../../../package.json'\nimport { DATA_CONTROLS } from './controls'\nimport {\n  getPanelShowLinkTemplate,\n  getPanelTemplate,\n} from '../panel'\n\n/**\n * Параметры инициализации плагина.\n * @typedef {Object} BviOptions\n * @property {string} [target='.bvi-open'] - Селектор элементов открытия режима.\n * @property {number} [fontSize=16] - Базовый размер шрифта.\n * @property {'white'|'black'|'blue'|'brown'|'green'} [theme='white'] - Цветовая тема.\n * @property {boolean|'grayscale'} [images='grayscale'] - Режим показа изображений.\n * @property {'normal'|'average'|'big'} [letterSpacing='normal'] - Межбуквенный интервал.\n * @property {'normal'|'average'|'big'} [lineHeight='normal'] - Межстрочный интервал.\n * @property {boolean} [speech=true] - Использовать синтез речи.\n * @property {string} [speechVoice=''] - Идентификатор голоса.\n * @property {'arial'|'times'} [fontFamily='arial'] - Семейство шрифта.\n * @property {boolean} [builtElements=false] - Стилизовать встроенные элементы.\n * @property {boolean} [panelFixed=true] - Закреплять панель при прокрутке.\n * @property {boolean} [panelHide=false] - Скрывать панель при запуске.\n * @property {boolean} [reload=false] - Перезагружать страницу при отключении.\n * @property {'ru-RU'|'en-US'|'es-ES'|'de-DE'|'fr-FR'|'pt-BR'|'it-IT'|'tr-TR'|'pl-PL'|'zh-CN'|'ja-JP'} [lang='ru-RU'] - Язык интерфейса.\n * @property {boolean} [copyright=true] - Показывать ссылку на проект.\n */\n\n/**\n * Направление перемещения фокуса для клавиш со стрелками.\n * @type {Record<string, number>}\n */\nconst ARROW_STEPS = { ArrowRight: 1, ArrowDown: 1, ArrowLeft: -1, ArrowUp: -1 }\n\n/**\n * Управляет режимом сайта для слабовидящих: панелью, настройками, DOM и синтезом речи.\n * @class\n * @classdesc Создаёт и обслуживает экземпляр режима на странице.\n */\nclass Bvi {\n  /**\n   * Создаёт экземпляр плагина, регистрирует триггеры и восстанавливает состояние.\n   * @param {BviOptions} [options={}] - Параметры работы плагина.\n   */\n  constructor (options) {\n    this._config = this._getConfig(options)\n    this._elements = SelectorEngine.all(this._config.target)\n    this._i18n = new I18n({ lang: this._config.lang })\n    this._speech = new Speech({ lang: this._config.lang })\n    this._onPanelScroll = this._handlePanelScroll.bind(this)\n    this._onPanelResize = this._handlePanelResize.bind(this)\n    this._onVoicesChanged = this._renderSpeechVoices.bind(this)\n    this._onModalKeydown = this._handleModalKeydown.bind(this)\n    this._onArrowKeys = this._handleArrowKeys.bind(this)\n    /** @type {HTMLElement|null} */\n    this._modalOpener = null\n    this._offModalKeydown = null\n    this._listeners = EventHandler.scope()\n    this._panelListeners = EventHandler.scope()\n\n    this._addOpenListeners()\n    this._init()\n\n    console.log(`Bvi console: ready Button visually impaired v${version}`)\n  }\n\n  /**\n   * Включает или отключает режим согласно сохранённому состоянию.\n   * @private\n   * @returns {void}\n   */\n  _init () {\n    this._disablePanelIfSettingsAreMissing()\n\n    if (!stringToBoolean(getCookie('panelActive'))) {\n      this._remove()\n      return\n    }\n\n    this._set()\n    this._renderPanel()\n    this._addPanelListeners()\n    this._images()\n    this._speech.mount()\n    this._speech.startStatusTimer()\n  }\n\n  /**\n   * Регистрирует обработчики открытия режима.\n   * @private\n   * @returns {void}\n   */\n  _addOpenListeners () {\n    if (!this._elements) {\n      return\n    }\n\n    this._elements.forEach(element => {\n      /**\n       * Включает режим для слабовидящих по клику на кнопку-триггер.\n       * @param {Event} event - Клик по элементу из опции `target`.\n       * @returns {void}\n       */\n      const listener = event => {\n        event.preventDefault()\n        this._saveDefaultSettings()\n        setCookie('panelActive', true)\n        this._init()\n        this._speech.speak(this._i18n.voice('panelOn'))\n      }\n\n      this._listeners.on(element, 'click', listener)\n    })\n  }\n\n  /**\n   * Регистрирует обработчики панели и обновляет её элементы управления.\n   * @private\n   * @returns {void}\n   */\n  _addPanelListeners () {\n    this._panelListeners.clear()\n    this._panelListeners.on(window, 'scroll', this._onPanelScroll)\n    this._panelListeners.on(window, 'resize', this._onPanelResize)\n    this._panelListeners.on(document, 'keydown', this._onArrowKeys)\n\n    this._setActiveControls()\n    this._bindFontSizeControls()\n    this._bindDataControls()\n    this._bindResetControl()\n    this._bindSpeechVoiceControl()\n    this._bindPanelActions()\n    this._bindModalOverlay()\n    this._renderSpeechVoices()\n    this._observePanelSize()\n  }\n\n  /**\n   * Пересчитывает закрепление и его заполнитель при изменении viewport.\n   * @private\n   * @returns {void}\n   */\n  _handlePanelResize () {\n    this._handlePanelScroll()\n  }\n\n  /**\n   * Синхронизирует заполнитель, когда перенос кнопок меняет высоту панели.\n   * @private\n   * @returns {void}\n   */\n  _observePanelSize () {\n    const panel = SelectorEngine.one('.bvi-panel')\n\n    if (!panel || typeof ResizeObserver === 'undefined') {\n      return\n    }\n\n    const observer = new ResizeObserver(() => this._syncPanelPlaceholder(panel))\n\n    observer.observe(panel)\n    this._panelListeners.add(() => observer.disconnect())\n  }\n\n  /**\n   * Связывает кнопки изменения размера шрифта с настройкой.\n   * @private\n   * @returns {void}\n   */\n  _bindFontSizeControls () {\n    this._onClick('.bvi-font-size-minus', element => {\n      this._changeFontSize(-1, element, 'fontSizeMinus')\n    })\n\n    this._onClick('.bvi-font-size-plus', element => {\n      this._changeFontSize(1, element, 'fontSizePlus')\n    })\n  }\n\n  /**\n   * Связывает декларативные контролы с настройками и голосовыми сообщениями.\n   * @private\n   * @returns {void}\n   */\n  _bindDataControls () {\n    getObject(DATA_CONTROLS, settingName => {\n      getObject(DATA_CONTROLS[settingName], settingValue => {\n        const [selector, speechKey] = DATA_CONTROLS[settingName][settingValue]\n\n        this._onClick(selector, element => {\n          if (settingName === 'speech' && settingValue === 'false') {\n            this._speech.speak(this._i18n.voice(speechKey))\n          }\n\n          this._setSetting(settingName, settingValue)\n\n          if (settingName !== 'speech' || settingValue !== 'false') {\n            this._speech.speak(this._i18n.voice(speechKey))\n          }\n\n          this._activateSiblingLink(element)\n\n          if (settingName === 'speech') {\n            this._speech.mount()\n            this._speech.startStatusTimer()\n          }\n        })\n      })\n    })\n  }\n\n  /**\n   * Связывает кнопку сброса с исходными настройками.\n   * @private\n   * @returns {void}\n   */\n  _bindResetControl () {\n    this._onClick('.bvi-reset', () => {\n      this._speech.speak(this._i18n.voice('resetSettings'))\n\n      const config = /** @type {Record<string, string|number|boolean>} */ (this._config)\n\n      getObject(config, key => {\n        this._setSetting(key, config[key])\n      })\n\n      this._setActiveControls()\n    })\n  }\n\n  /**\n   * Связывает селектор голоса с настройкой `speechVoice`.\n   * @private\n   * @returns {void}\n   */\n  _bindSpeechVoiceControl () {\n    const select = /** @type {HTMLSelectElement|null} */ (SelectorEngine.one('.bvi-speech-voice'))\n\n    if (!select) {\n      return\n    }\n\n    this._bindVoicesChanged()\n\n    this._panelListeners.on(select, 'change', () => {\n      this._setSetting('speechVoice', select.value)\n      this._speech.speak(this._i18n.voice('speechVoiceChanged'))\n    })\n  }\n\n  /**\n   * Подписывается на появление списка голосов синтезатора.\n   * @private\n   * @returns {void}\n   */\n  _bindVoicesChanged () {\n    if (!this._speech.isSupported()) {\n      return\n    }\n\n    const synth = window.speechSynthesis\n\n    if (typeof synth.addEventListener === 'function') {\n      this._panelListeners.on(synth, 'voiceschanged', this._onVoicesChanged)\n    } else {\n      synth.onvoiceschanged = this._onVoicesChanged\n      this._panelListeners.add(() => {\n        synth.onvoiceschanged = null\n      })\n    }\n  }\n\n  /**\n   * Заполняет селектор голосами для текущего языка.\n   * @private\n   * @returns {void}\n   */\n  _renderSpeechVoices () {\n    const select = /** @type {HTMLSelectElement|null} */ (SelectorEngine.one('.bvi-speech-voice'))\n\n    if (!select || !this._speech.isSupported()) {\n      return\n    }\n\n    const selectedValue = getCookie('speechVoice') || ''\n    const voices = this._getSpeechVoices(window.speechSynthesis.getVoices(), selectedValue)\n    const currentOptions = JSON.stringify(Array.from(select.options).map(option => option.value))\n    const nextOptions = JSON.stringify(['', ...voices.map(voice => this._getSpeechVoiceValue(voice))])\n\n    if (currentOptions === nextOptions) {\n      this._setSpeechVoiceSelectValue(select, selectedValue)\n      return\n    }\n\n    select.innerHTML = `<option value=\"\">${this._i18n.text('speechVoiceDefault')}</option>`\n\n    voices.forEach(voice => {\n      const option = /** @type {HTMLOptionElement} */ (createElement('option'))\n\n      option.value = this._getSpeechVoiceValue(voice)\n      option.textContent = voice.lang ? `${voice.name} (${voice.lang})` : voice.name\n      select.appendChild(option)\n    })\n\n    this._setSpeechVoiceSelectValue(select, selectedValue)\n  }\n\n  /**\n   * Возвращает стабильный идентификатор голоса.\n   * @private\n   * @param {SpeechSynthesisVoice} voice - Голос синтезатора.\n   * @returns {string} Идентификатор голоса.\n   */\n  _getSpeechVoiceValue (voice) {\n    return voice.voiceURI || voice.name\n  }\n\n  /**\n   * Выбирает уникальные голоса текущего языка и ранее выбранный голос.\n   * @private\n   * @param {SpeechSynthesisVoice[]} voices - Все доступные голоса.\n   * @param {string} [selectedValue=''] - Идентификатор выбранного голоса.\n   * @returns {SpeechSynthesisVoice[]} Подходящие голоса.\n   */\n  _getSpeechVoices (voices, selectedValue = '') {\n    const langPrefix = this._config.lang.toLowerCase().split('-')[0]\n    /** @type {string[]} */\n    const values = []\n\n    return voices.filter(voice => {\n      if (!voice || !(voice.voiceURI || voice.name)) {\n        return false\n      }\n\n      const value = this._getSpeechVoiceValue(voice)\n      const voiceLang = String(voice.lang || '').toLowerCase()\n      const isSelected = selectedValue && value === selectedValue\n      const isCurrentLang = voiceLang === this._config.lang.toLowerCase() || voiceLang.startsWith(langPrefix)\n\n      if (!isSelected && !isCurrentLang) {\n        return false\n      }\n\n      if (values.indexOf(value) !== -1) {\n        return false\n      }\n\n      values.push(value)\n      return true\n    })\n  }\n\n  /**\n   * Устанавливает значение селектора, если соответствующий вариант существует.\n   * @private\n   * @param {HTMLSelectElement} select - Селектор голосов.\n   * @param {string} value - Идентификатор голоса.\n   * @returns {void}\n   */\n  _setSpeechVoiceSelectValue (select, value) {\n    const hasValue = Array.from(select.options).some(option => option.value === value)\n\n    select.value = hasValue ? value : ''\n  }\n\n  /**\n   * Связывает действия панели с обработчиками. Меню раскрывается плавно, поэтому высота места под\n   * закреплённую панель обновляется по окончании анимации.\n   * @private\n   * @returns {void}\n   */\n  _bindPanelActions () {\n    const menu = SelectorEngine.one('.bvi-menu')\n\n    if (menu) {\n      this._panelListeners.on(menu, 'transitionend', event => {\n        const panel = SelectorEngine.one('.bvi-panel')\n\n        if (event.target === menu && panel) {\n          this._syncPanelPlaceholder(panel)\n        }\n      })\n    }\n\n    SelectorEngine.all('.bvi-link[data-bvi]').forEach(element => {\n      this._onClick(element, element => {\n        const action = Manipulator.getData(element)\n\n        if (action === 'close') {\n          this._setSetting('panelActive', 'false')\n          this._init()\n        }\n\n        if (action === 'menu') {\n          this._toggleMenu(element)\n        }\n\n        if (action === 'modal') {\n          this._showModal()\n        }\n\n        if (action === 'modal-close') {\n          this._hideModal()\n        }\n\n        if (action === 'panel-hide') {\n          this._hidePanel()\n        }\n\n        if (action === 'panel-show') {\n          this._showPanel()\n        }\n      })\n    })\n  }\n\n  /**\n   * Раскрывает или сворачивает группы настроек на узких экранах.\n   * @private\n   * @param {HTMLElement} toggle - Кнопка меню.\n   * @returns {void}\n   */\n  _toggleMenu (toggle) {\n    const panel = SelectorEngine.one('.bvi-panel')\n\n    if (!panel) {\n      return\n    }\n\n    const open = !Manipulator.hasClass(panel, 'bvi-menu-open')\n\n    Manipulator.toggleClass(panel, 'bvi-menu-open', open)\n    Manipulator.setAttr(toggle, 'aria-expanded', String(open))\n  }\n\n  /**\n   * Закрывает модальное окно при клике по подложке.\n   * @private\n   * @returns {void}\n   */\n  _bindModalOverlay () {\n    const modal = SelectorEngine.one('.bvi-modal')\n\n    this._onClick(modal, (element, event) => {\n      if (event.target === modal) {\n        this._hideModal()\n      }\n    })\n  }\n\n  /**\n   * Изменяет размер шрифта в допустимом диапазоне.\n   * @private\n   * @param {number} delta - Шаг изменения.\n   * @param {HTMLElement} activeElement - Нажатая кнопка.\n   * @param {string} speechKey - Ключ голосовой подсказки.\n   * @returns {void}\n   */\n  _changeFontSize (delta, activeElement, speechKey) {\n    const size = parseFloat(getCookie('fontSize') || '') + delta\n\n    if (size <= 0 || size >= 40) {\n      return\n    }\n\n    this._setSetting('fontSize', size)\n    this._speech.speak(this._i18n.voice(speechKey))\n    this._activateSiblingLink(activeElement)\n  }\n\n  /**\n   * Сохраняет настройку в cookie и атрибуте контейнера.\n   * @private\n   * @param {string} name - Имя настройки.\n   * @param {string|number|boolean} value - Новое значение.\n   * @returns {void}\n   */\n  _setSetting (name, value) {\n    this._setAttrDataBviBody(name, value)\n    setCookie(name, value)\n  }\n\n  /**\n   * Обновляет визуальное и ARIA-состояние контролов.\n   * @private\n   * @returns {void}\n   */\n  _setActiveControls () {\n    SelectorEngine.all('.bvi-link').forEach(link => {\n      Manipulator.removeClass(link, 'active')\n      this._setPressed(link, false)\n    })\n\n    getObject(DATA_CONTROLS, settingName => {\n      const value = String(getCookie(settingName))\n      const control = DATA_CONTROLS[settingName][value]\n\n      if (!control) {\n        return\n      }\n\n      const element = SelectorEngine.one(control[0])\n\n      if (element) {\n        Manipulator.addClass(element, 'active')\n        this._setPressed(element, true)\n      }\n    })\n  }\n\n  /**\n   * Устанавливает `aria-pressed` на элементе управления.\n   * @private\n   * @param {HTMLElement} element - Элемент управления.\n   * @param {boolean} pressed - Состояние кнопки.\n   * @returns {void}\n   */\n  _setPressed (element, pressed) {\n    if (Manipulator.hasAttr(element, 'aria-pressed')) {\n      Manipulator.setAttr(element, 'aria-pressed', pressed)\n    }\n  }\n\n  /**\n   * Активирует элемент и деактивирует соседние кнопки.\n   * @private\n   * @param {HTMLElement|null} element - Активируемая кнопка.\n   * @returns {void}\n   */\n  _activateSiblingLink (element) {\n    if (!element || !element.parentElement) {\n      return\n    }\n\n    getArray(SelectorEngine.children(element.parentElement, '.bvi-link'), sibling => {\n      Manipulator.removeClass(sibling, 'active')\n      this._setPressed(sibling, false)\n    })\n\n    Manipulator.addClass(element, 'active')\n    this._setPressed(element, true)\n  }\n\n  /**\n   * Добавляет панель и кнопку её показа в DOM.\n   * @private\n   * @returns {void}\n   */\n  _renderPanel () {\n    const bviBody = SelectorEngine.one('.bvi-body')\n\n    if (!bviBody || SelectorEngine.one('.bvi-panel')) {\n      return\n    }\n\n    const panelHidden = stringToBoolean(getCookie('panelHide'))\n\n    insert(bviBody, 'beforebegin', getPanelTemplate(this._i18n, panelHidden, this._config.copyright))\n    insert(bviBody, 'afterbegin', getPanelShowLinkTemplate(this._i18n, panelHidden))\n    this._handlePanelScroll()\n  }\n\n  /**\n   * Закрепляет панель при прокрутке.\n   * @private\n   * @returns {void}\n   */\n  _handlePanelScroll () {\n    const panel = SelectorEngine.one('.bvi-panel')\n\n    if (!panel || !stringToBoolean(getCookie('panelFixed'))) {\n      return\n    }\n\n    const scrollTop = window.pageYOffset !== undefined\n      ? window.pageYOffset\n      : (document.documentElement || document.body.parentNode || document.body).scrollTop\n\n    const fixed = scrollTop > 200\n\n    if (fixed !== Manipulator.hasClass(panel, 'bvi-fixed-top')) {\n      if (fixed) {\n        insert(panel, 'beforebegin', '<div class=\"bvi-panel-placeholder\" aria-hidden=\"true\"></div>')\n      } else {\n        this._removePanelPlaceholder()\n      }\n\n      Manipulator.toggleClass(panel, 'bvi-fixed-top', fixed)\n    }\n\n    this._syncPanelPlaceholder(panel)\n  }\n\n  /**\n   * Синхронизирует высоту заполнителя закреплённой панели и отступ прокрутки страницы (`--bvi-panel-offset`),\n   * чтобы элемент в фокусе и якорь не оказывались под закреплённой панелью.\n   * @private\n   * @param {HTMLElement} panel - Панель для измерения.\n   * @returns {void}\n   */\n  _syncPanelPlaceholder (panel) {\n    const fixed = Manipulator.hasClass(panel, 'bvi-fixed-top') && panel.offsetHeight > 0\n\n    Manipulator.setStyle(document.documentElement, '--bvi-panel-offset', fixed ? `${panel.offsetHeight}px` : '')\n\n    const placeholder = SelectorEngine.one('.bvi-panel-placeholder')\n\n    if (!placeholder) {\n      return\n    }\n\n    const margin = parseFloat(getComputedStyle(panel).marginBottom) || 0\n\n    Manipulator.setStyle(placeholder, 'height', panel.offsetHeight ? `${panel.offsetHeight + margin}px` : '0')\n  }\n\n  /**\n   * Удаляет заполнитель места панели.\n   * @private\n   * @returns {void}\n   */\n  _removePanelPlaceholder () {\n    const placeholder = SelectorEngine.one('.bvi-panel-placeholder')\n\n    if (placeholder) {\n      removeElement(placeholder)\n    }\n  }\n\n  /**\n   * Создаёт контейнер режима и применяет сохранённые настройки.\n   * @private\n   * @returns {void}\n   */\n  _set () {\n    if (!SelectorEngine.one('.bvi-body')) {\n      Manipulator.addClass(document.documentElement, 'bvi-active')\n      Manipulator.addClass(document.body, 'bvi-active')\n      wrapInner(document.body, 'div', 'bvi-body')\n    }\n\n    getObject(this._config, key => this._setAttrDataBviBody(key, getCookie(key)))\n    getArray(this._elements, element => {\n      Manipulator.setStyle(element, 'display', 'none')\n    })\n\n    this._clearImageClasses()\n  }\n\n  /**\n   * Полностью убирает плагин со страницы и снимает обработчики; сохранённые настройки не трогает.\n   * Нужен при размонтировании компонента (React, Vue и т. п.). Публичный API: внутри пакета не вызывается.\n   * @public\n   * @noinspection JSUnusedGlobalSymbols\n   * @returns {void}\n   */\n  destroy () {\n    this._listeners.clear()\n    this._teardown()\n    this._speech.destroy()\n  }\n\n  /**\n   * Возвращает DOM к состоянию до включения режима.\n   * @private\n   * @returns {void}\n   */\n  _teardown () {\n    const bviPanel = SelectorEngine.one('.bvi-panel')\n    const bviBody = SelectorEngine.one('.bvi-body')\n    const bviLinkFixedTop = SelectorEngine.one('.bvi-link-fixed-top')\n\n    this._removePanelPlaceholder()\n    Manipulator.setStyle(document.documentElement, '--bvi-panel-offset', '')\n    this._speech.stopStatusTimer()\n    this._panelListeners.clear()\n    this._stopModalKeydown()\n\n    if (bviPanel) {\n      removeElement(bviPanel)\n    }\n\n    this._clearImageClasses()\n\n    if (bviBody) {\n      unwrap(bviBody)\n    }\n\n    if (bviLinkFixedTop) {\n      removeElement(bviLinkFixedTop)\n    }\n\n    Manipulator.removeClass(document.documentElement, 'bvi-active')\n    Manipulator.removeClass(document.body, 'bvi-active', 'bvi-noscroll')\n    Manipulator.setStyle(document.body, 'overflow', '')\n\n    getArray(this._elements, element => {\n      Manipulator.setStyle(element, 'display', '')\n    })\n\n    this._speech.destroyControls()\n  }\n\n  /**\n   * Отключает режим и очищает его cookie.\n   * @private\n   * @returns {void}\n   */\n  _remove () {\n    this._teardown()\n    this._speech.speak(this._i18n.voice('panelOff'))\n\n    if (stringToBoolean(getCookie('reload'))) {\n      document.location.reload()\n    }\n\n    getObject(this._config, key => removeCookie(key))\n    removeCookie('panelActive')\n  }\n\n  /**\n   * Маркирует изображения для применения специальных стилей.\n   * @private\n   * @returns {void}\n   */\n  _images () {\n    SelectorEngine.all('img').forEach(element => {\n      if (!Manipulator.hasClass(element, 'bvi-no-style')) {\n        Manipulator.addClass(element, 'bvi-img')\n      }\n    })\n\n    this._renderImageCaptions()\n\n    SelectorEngine.all('.bvi-body *').forEach(element => {\n      const style = getComputedStyle(element)\n      const hasBackgroundImage = style.backgroundImage !== 'none' && style.background !== 'none'\n\n      if (hasBackgroundImage && !Manipulator.hasClass(element, 'bvi-no-style')) {\n        Manipulator.addClass(element, 'bvi-background-image')\n      }\n    })\n  }\n\n  /**\n   * Добавляет подписи к содержательным изображениям. Декоративные (`alt=\"\"`) остаются без подписи.\n   * @private\n   * @returns {void}\n   */\n  _renderImageCaptions () {\n    SelectorEngine.all('.bvi-body img.bvi-img').forEach(image => {\n      const alt = Manipulator.getAttr(image, 'alt')\n\n      if (alt !== null && !alt.trim()) {\n        return\n      }\n\n      const caption = createElement('span', 'bvi-img-caption')\n\n      Manipulator.setData(caption, 'caption', alt === null\n        ? this._i18n.text('imageWithoutDescription')\n        : `${this._i18n.text('imageCaption')}: ${alt.trim()}`)\n      insert(image, 'afterend', caption)\n    })\n  }\n\n  /**\n   * Удаляет добавленные классы и подписи изображений.\n   * @private\n   * @returns {void}\n   */\n  _clearImageClasses () {\n    SelectorEngine.all('.bvi-img-caption').forEach(element => {\n      removeElement(element)\n    })\n\n    SelectorEngine.all('img.bvi-img').forEach(element => {\n      Manipulator.removeClass(element, 'bvi-img')\n    })\n\n    SelectorEngine.all('.bvi-background-image').forEach(element => {\n      Manipulator.removeClass(element, 'bvi-background-image')\n    })\n  }\n\n  /**\n   * Открывает окно настроек и переносит в него фокус.\n   * @private\n   * @returns {void}\n   */\n  _showModal () {\n    const modal = SelectorEngine.one('.bvi-modal')\n\n    Manipulator.setStyle(document.body, 'overflow', 'hidden')\n    Manipulator.addClass(document.body, 'bvi-noscroll')\n\n    if (modal) {\n      if (!Manipulator.hasClass(modal, 'show')) {\n        this._modalOpener = /** @type {HTMLElement|null} */ (document.activeElement)\n      }\n\n      Manipulator.addClass(modal, 'show')\n\n      if (!this._offModalKeydown) {\n        this._offModalKeydown = EventHandler.on(document, 'keydown', this._onModalKeydown)\n      }\n\n      const close = SelectorEngine.one('.bvi-modal-close', modal)\n\n      if (close) {\n        close.focus()\n      }\n    }\n  }\n\n  /**\n   * Закрывает окно настроек и возвращает исходный фокус.\n   * @private\n   * @returns {void}\n   */\n  _hideModal () {\n    const modal = SelectorEngine.one('.bvi-modal')\n\n    Manipulator.removeClass(document.body, 'bvi-noscroll')\n    Manipulator.setStyle(document.body, 'overflow', '')\n    this._stopModalKeydown()\n\n    if (modal) {\n      Manipulator.removeClass(modal, 'show')\n    }\n\n    if (this._modalOpener && document.contains(this._modalOpener)) {\n      this._modalOpener.focus()\n    }\n\n    this._modalOpener = null\n  }\n\n  /**\n   * Перемещает фокус между кнопками группы стрелками, `Home` и `End`: группа — верхняя панель,\n   * окно настроек или блок озвучки. `Tab` работает как обычно.\n   * @private\n   * @param {KeyboardEvent} event - Событие клавиатуры.\n   * @returns {void}\n   */\n  _handleArrowKeys (event) {\n    const step = ARROW_STEPS[event.key]\n    const edge = event.key === 'Home' || event.key === 'End'\n\n    if ((step === undefined && !edge) || event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n      return\n    }\n\n    const current = /** @type {HTMLElement} */ (event.target)\n\n    if (!SelectorEngine.is(current, '.bvi-link')) {\n      return\n    }\n\n    const group = SelectorEngine.ancestor(current, '.bvi-modal-content, .bvi-speech-link, .bvi-panel')\n\n    if (!group) {\n      return\n    }\n\n    const buttons = SelectorEngine.focusable(group, '.bvi-link')\n    const index = buttons.indexOf(current)\n\n    if (index === -1) {\n      return\n    }\n\n    let target = event.key === 'Home' ? 0 : buttons.length - 1\n\n    if (step !== undefined) {\n      target = (index + step + buttons.length) % buttons.length\n    }\n\n    event.preventDefault()\n    buttons[target].focus()\n  }\n\n  /**\n   * Снимает обработчик клавиатуры модального окна.\n   * @private\n   * @returns {void}\n   */\n  _stopModalKeydown () {\n    if (this._offModalKeydown) {\n      this._offModalKeydown()\n      this._offModalKeydown = null\n    }\n  }\n\n  /**\n   * Обрабатывает Escape и удерживает Tab-фокус в модальном окне.\n   * @private\n   * @param {KeyboardEvent} event - Событие клавиатуры.\n   * @returns {void}\n   */\n  _handleModalKeydown (event) {\n    const modal = SelectorEngine.one('.bvi-modal')\n\n    if (!modal || !Manipulator.hasClass(modal, 'show')) {\n      return\n    }\n\n    if (event.key === 'Escape') {\n      event.preventDefault()\n      this._hideModal()\n      return\n    }\n\n    if (event.key !== 'Tab') {\n      return\n    }\n\n    const focusable = SelectorEngine.focusable(modal)\n\n    if (!focusable.length) {\n      return\n    }\n\n    const first = focusable[0]\n    const last = focusable[focusable.length - 1]\n\n    if (event.shiftKey && document.activeElement === first) {\n      event.preventDefault()\n      last.focus()\n    } else if (!event.shiftKey && document.activeElement === last) {\n      event.preventDefault()\n      first.focus()\n    }\n  }\n\n  /**\n   * Скрывает панель и показывает кнопку её возврата.\n   * @private\n   * @returns {void}\n   */\n  _hidePanel () {\n    const panel = SelectorEngine.one('.bvi-panel')\n    const link = SelectorEngine.one('.bvi-link-fixed-top')\n\n    if (panel) {\n      Manipulator.addClass(panel, 'bvi-panel-hide')\n      this._syncPanelPlaceholder(panel)\n    }\n\n    if (link) {\n      Manipulator.removeClass(link, 'bvi-hide')\n      Manipulator.addClass(link, 'bvi-show')\n    }\n\n    setCookie('panelHide', 'true')\n    this._speech.speak(this._i18n.voice('panelHide'))\n  }\n\n  /**\n   * Показывает панель и скрывает кнопку её возврата.\n   * @private\n   * @returns {void}\n   */\n  _showPanel () {\n    const panel = SelectorEngine.one('.bvi-panel')\n    const link = SelectorEngine.one('.bvi-link-fixed-top')\n\n    if (link) {\n      Manipulator.removeClass(link, 'bvi-show')\n      Manipulator.addClass(link, 'bvi-hide')\n    }\n\n    if (panel) {\n      Manipulator.removeClass(panel, 'bvi-panel-hide')\n      this._syncPanelPlaceholder(panel)\n    }\n\n    setCookie('panelHide', 'false')\n    this._speech.speak(this._i18n.voice('panelShow'))\n  }\n\n  /**\n   * Сохраняет исходные значения конфигурации.\n   * @private\n   * @returns {void}\n   */\n  _saveDefaultSettings () {\n    const config = /** @type {Record<string, string|number|boolean>} */ (this._config)\n\n    getObject(config, key => setCookie(key, config[key]))\n  }\n\n  /**\n   * Отключает автозапуск при неполном наборе настроек.\n   * @private\n   * @returns {void}\n   */\n  _disablePanelIfSettingsAreMissing () {\n    getObject(this._config, key => {\n      if (typeof getCookie(key) === 'undefined') {\n        removeCookie('panelActive')\n      }\n    })\n  }\n\n  /**\n   * Объединяет и проверяет настройки плагина.\n   * @private\n   * @param {BviOptions} [config={}] - Пользовательские параметры.\n   * @returns {Required<BviOptions>} Проверенная конфигурация: все параметры заполнены значениями по умолчанию.\n   */\n  _getConfig (config) {\n    /** @type {Record<string, any>} */\n    const options = { ...Default, ...config }\n    /** @type {Record<string, any>} */\n    const extended = {}\n\n    for (const keyDefault in Default) {\n      extended[keyDefault] = options[keyDefault]\n    }\n\n    checkConfig(extended, DefaultType, DefaultOptions)\n\n    return /** @type {Required<BviOptions>} */ (extended)\n  }\n\n  /**\n   * Устанавливает атрибут `data-bvi-*` на контейнере режима.\n   * @private\n   * @param {string} [name=''] - Имя настройки.\n   * @param {string|number|boolean} [value=''] - Значение настройки.\n   * @returns {void}\n   */\n  _setAttrDataBviBody (name = '', value = '') {\n    const bviBody = SelectorEngine.one('.bvi-body')\n\n    if (bviBody) {\n      Manipulator.setData(bviBody, name, value)\n    }\n  }\n\n  /**\n   * Регистрирует обработчик клика на элементе панели.\n   * @private\n   * @param {string|Element|null} selectorOrElement - CSS-селектор или элемент.\n   * @param {(element: HTMLElement, event: Event) => void} callback - Обработчик клика; получает элемент, на котором он зарегистрирован, и событие.\n   * @returns {void}\n   */\n  _onClick (selectorOrElement, callback) {\n    const element = getElement(selectorOrElement)\n\n    if (!element) {\n      return\n    }\n\n    this._panelListeners.on(element, 'click', event => {\n      event.preventDefault()\n      callback(/** @type {HTMLElement} */ (element), event)\n    })\n  }\n\n}\n\nexport { Bvi }\nexport default Bvi\n","/**\n * ESM-точка входа библиотеки: экспорты предназначены пользователям пакета (`import Bvi from 'bvi'`),\n * внутри проекта их никто не импортирует.\n * @module bvi/esm\n * @noinspection JSUnusedGlobalSymbols\n */\nimport Bvi from './bvi'\nimport Speech from './speech'\n\nexport {\n  Bvi,\n  Speech,\n}\nexport default Bvi\n"],"names":["locales","ruRU","enUS","esES","deDE","frFR","ptBR","itIT","trTR","plPL","zhCN","jaJP","LANGUAGES","Object","keys","Default","target","fontSize","theme","images","letterSpacing","lineHeight","speech","speechVoice","fontFamily","builtElements","panelFixed","panelHide","reload","lang","copyright","DefaultType","DefaultOptions","join","DEFAULT_LANG","I18n","constructor","options","_config","_get","type","key","messages","text","voice","getSpeechControlsTemplate","i18n","control","name","disabled","label","state","attribute","FOCUSABLE","isVisible","element","checkVisibility","visibilityProperty","getClientRects","length","SelectorEngine","all","selector","root","document","querySelectorAll","one","querySelector","children","filter","child","matches","ancestor","parentElement","closest","sibling","direction","step","node","is","Element","focusable","tabIndex","isElement","object","nodeType","getElement","createElement","tag","className","insert","position","content","insertAdjacentHTML","insertAdjacentElement","removeElement","remove","wrapInner","parent","wrapper","appendChild","firstChild","unwrap","parentNode","docFrag","createDocumentFragment","removeChild","replaceChild","toType","obj","undefined","toString","call","match","toLowerCase","checkConfig","config","configTypes","configOptions","forEach","expectedTypes","value","valueType","RegExp","test","TypeError","expectedOptions","getObject","callback","getArray","array","Array","from","stringToBoolean","string","EventHandler","on","handler","listener","addEventListener","removeEventListener","scope","cleanups","push","add","cleanup","clear","splice","DATA","dataName","String","Manipulator","getAttr","getAttribute","setAttr","setAttribute","hasAttr","hasAttribute","removeAttr","removeAttribute","addClass","classNames","classList","removeClass","toggleClass","force","toggle","hasClass","contains","setStyle","property","style","startsWith","setProperty","getData","setData","removeData","synth","window","speechSynthesis","normalizeLang","code","replace","findVoice","voices","wanted","baseOf","split","find","setCookie","expires","Date","now","cookie","encodeURIComponent","toUTCString","getCookie","cookieName","cookies","i","trim","indexOf","decodeURIComponent","substring","removeCookie","Speech","_lang","_i18n","_statusTimer","_playback","_listeners","mount","destroyControls","isEnabled","speechBlock","index","id","_bindControls","destroy","stopStatusTimer","isSupported","_cancelSpeech","cancel","paused","resume","_restoreAllHighlightedText","startStatusTimer","setInterval","pending","speaking","disableButtons","clearInterval","speak","echo","_startPlayback","startPosition","sourceText","_prepareHighlighting","chunks","_splitText","slice","playback","pauseFallback","chunk","utter","_createUtterance","_addHighlighting","start","error","_setDisabled","button","_onClickAll","_playBlock","_pauseBlock","_resumeBlock","_stopBlock","_getControls","controls","hadFocus","activeElement","textContent","_setControlsState","pause","_pauseWithFallback","_getResumePosition","_restoreHighlightedText","play","stop","playing","stopped","focus","_needsCancelForPause","setTimeout","navigator","userAgent","Number","nextSpace","search","Math","min","startOffset","chunkLength","patternRegex","floor","SpeechSynthesisUtterance","getVoices","selectedVoice","volume","rate","pitch","configuredVoice","_isSelectedVoice","langVoice","voiceURI","innerHTML","fragment","tokens","offset","token","createTextNode","word","isLast","hasBoundary","fallbackTimer","isStale","onboundary","event","clearTimeout","_setPlaybackPosition","charIndex","_highlightWordAt","onend","active","item","end","original","preventDefault","DATA_CONTROLS","white","black","blue","brown","green","true","false","grayscale","normal","average","big","arial","times","getPanelTemplate","panelHidden","getPanelShowLinkTemplate","linkHide","ARROW_STEPS","ArrowRight","ArrowDown","ArrowLeft","ArrowUp","Bvi","_getConfig","_elements","_speech","_onPanelScroll","_handlePanelScroll","bind","_onPanelResize","_handlePanelResize","_onVoicesChanged","_renderSpeechVoices","_onModalKeydown","_handleModalKeydown","_onArrowKeys","_handleArrowKeys","_modalOpener","_offModalKeydown","_panelListeners","_addOpenListeners","_init","console","log","version","_disablePanelIfSettingsAreMissing","_remove","_set","_renderPanel","_addPanelListeners","_images","_saveDefaultSettings","_setActiveControls","_bindFontSizeControls","_bindDataControls","_bindResetControl","_bindSpeechVoiceControl","_bindPanelActions","_bindModalOverlay","_observePanelSize","panel","ResizeObserver","observer","_syncPanelPlaceholder","observe","disconnect","_onClick","_changeFontSize","settingName","settingValue","speechKey","_setSetting","_activateSiblingLink","select","_bindVoicesChanged","onvoiceschanged","selectedValue","_getSpeechVoices","currentOptions","JSON","stringify","map","option","nextOptions","_getSpeechVoiceValue","_setSpeechVoiceSelectValue","langPrefix","values","voiceLang","isSelected","isCurrentLang","hasValue","some","menu","action","_toggleMenu","_showModal","_hideModal","_hidePanel","_showPanel","open","modal","delta","size","parseFloat","_setAttrDataBviBody","link","_setPressed","pressed","bviBody","scrollTop","pageYOffset","documentElement","body","fixed","_removePanelPlaceholder","offsetHeight","placeholder","margin","getComputedStyle","marginBottom","_clearImageClasses","_teardown","bviPanel","bviLinkFixedTop","_stopModalKeydown","location","_renderImageCaptions","hasBackgroundImage","backgroundImage","background","image","alt","caption","close","edge","altKey","ctrlKey","metaKey","shiftKey","current","group","buttons","first","last","extended","keyDefault","selectorOrElement"],"mappings":"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"}