1/** 2 * ÐниÑиализаÑÐ¸Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð° «ÐеÑÑÐ¸Ñ Ð´Ð»Ñ ÑлабовидÑÑÐ¸Ñ Â» (BVI, ÐÐСТ Ð 52872-2012). 3 * 4 * ÐÑо ÐÐ ÑаÑÑÑ 4-Ñлойной аÑÑ Ð¸ÑекÑÑÑÑ Ð¿ÑоекÑа â ÑÑоÑоннÑÑ Ð²ÐµÐ½Ð´Ð¾ÑÐ½Ð°Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñека 5 * (assets/vendor/bvi/), ÑабоÑÐ°ÐµÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ð¾ на каждой ÑÑÑаниÑе ÑайÑа незавиÑимо 6 * Ð¾Ñ CMS-конÑенÑа, поÑÑÐ¾Ð¼Ñ Ð¿Ð¾Ð´ÐºÐ»ÑÑаеÑÑÑ Ð¾ÑделÑнÑм Ñлоем повеÑÑ Ð²Ñего оÑÑалÑного. 7 * 8 * ÐавиÑимоÑÑÑ: assets/vendor/bvi/js/bvi.min.js должен бÑÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑÑÑн ÐÐ ÑÑого Ñайла. 9 * 10 * ТÑиггеÑÑ â Ñже ÑÑÑеÑÑвÑÑÑие в ÑазмеÑке кнопки, ÑÐ²Ð¾Ñ Ð²ÐµÑÑÑÐºÑ Ð¿Ð»Ð°Ð³Ð¸Ð½ ÐРдобавлÑеÑ: 11 * .footer__btn--access â кнопка в подвале (одна ÑазмеÑка на Ð¼Ð¾Ð±Ð¸Ð»ÐºÑ Ð¸ деÑкÑоп, 12 * ÑазниÑа ÑолÑко в CSS, Ñм. footer.css) 13 * .menu__accessibility â кнопка в мобилÑном Ð¼ÐµÐ½Ñ 14 * .menu__desktop-access â кнопка в деÑкÑопном Ð¼ÐµÐ½Ñ 15 * ÐÑе ÑÑи обÑÐµÐ´Ð¸Ð½ÐµÐ½Ñ Ð² один ÑелекÑÐ¾Ñ target â плагин Ñам Ð±Ð¸Ð½Ð´Ð¸Ñ ÐºÐ»Ð¸Ðº на каждÑÑ. 16 * ÐÑли поÑвиÑÑÑ ÐµÑÑ Ð¾Ð´Ð½Ð° кнопка «ÐеÑÑÐ¸Ñ Ð´Ð»Ñ ÑлабовидÑÑÐ¸Ñ Â» â доÑÑаÑоÑно 17 * допиÑаÑÑ ÐµÑ ÐºÐ»Ð°ÑÑ ÑеÑез запÑÑÑÑ Ð² target ниже, HTML менÑÑÑ Ð½Ðµ нÑжно. 18 * 19 * ÐиблиоÑека Ñама ÑÑÑÐ¾Ð¸Ñ DOM панели наÑÑÑоек и плаваÑÑÑÑ Ð¸ÐºÐ¾Ð½ÐºÑ Ð²Ð¾Ð·Ð²ÑаÑа 20 * (когда полÑзоваÑÐµÐ»Ñ ÑкÑÑÐ²Ð°ÐµÑ Ð¿Ð°Ð½ÐµÐ»Ñ), Ñ ÑÐ°Ð½Ð¸Ñ Ð²ÑÐ±Ð¾Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð² cookie 21 * вида bvi_* â единÑÑвенное ÑознаÑелÑное иÑклÑÑение из пÑавила пÑоекÑа 22 * «никакого localStorage/sessionStorage», Ñ.к. наÑÑÑойки Ð´Ð¾Ð»Ð¶Ð½Ñ ÑÐ¾Ñ ÑанÑÑÑÑÑ 23 * Ð¼ÐµÐ¶Ð´Ñ Ð¿ÐµÑÐµÑ Ð¾Ð´Ð°Ð¼Ð¸ по ÑÑÑаниÑам ÑайÑа. 24 * 25 * ÐÑоÑмление панели â деÑолÑное (Ñема 'white'), без подгонки под ÑÐ¾ÐºÐµÐ½Ñ ÑеаÑÑа. 26 * ÐÑли понадобиÑÑÑ ÑиÑÐ¼ÐµÐ½Ð½Ð°Ñ Ñема â пеÑеопÑеделÑÑÑ ÐºÐ»Ð°ÑÑÑ .bvi-* в оÑделÑном 27 * Ñайле (не ÑÑÐ¾Ð³Ð°Ñ Ñам assets/vendor/bvi/css/bvi.min.css). 28 * 29 * ÐомпенÑиÑÑÑÑий Ñлой: components/accessibility/accessibility.css â ÑÐ¸Ð½Ð¸Ñ Ñо, 30 * ÑÑо плагин Ð»Ð¾Ð¼Ð°ÐµÑ Ð² вÑÑÑÑке (padding обÑÑÑки, плоÑÐºÐ°Ñ ÑипогÑаÑика, ÑÑиÑÑ). 31 * ÐодклÑÑаеÑÑÑ Ð¡Ð¢Ð ÐÐÐ ÐÐСÐÐ bvi.min.css. 32 */ 33(function () { 34 if (typeof isvek === 'undefined') { 35 console.warn('[accessibility] bvi.min.js не загÑÑжен â плагин веÑÑии Ð´Ð»Ñ ÑлабовидÑÑÐ¸Ñ Ð½Ðµ иниÑиализиÑован.'); 36 return; 37 } 38 39 new isvek.Bvi({ 40 target: '.footer__btn--access, .menu__accessibility, .menu__desktop-access', 41 lang: 'ru-RU', 42 theme: 'white', 43 44 // СÑаÑÑовÑй ÑазмеÑ. Ðа деÑкÑопе дополниÑелÑно ÑмножаеÑÑÑ 45 // коÑÑÑиÑиенÑом --bvi-scale из accessibility.css (Ñм. ÑекÑÐ¸Ñ 6), 46 // поÑÐ¾Ð¼Ñ ÑÑо вÑÑÑÑка маÑÑÑабиÑÑеÑÑÑ Ð¾Ñ Ð±Ð°Ð·Ñ 1680px. 47 fontSize: 18, 48 49 // ÐзобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð² ÑвеÑе. ÐеÑÐ¾Ð»Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð° â 'grayscale', Ñо еÑÑÑ 50 // вÑе ÑоÑо пÑÐ¸Ñ Ð¾Ð´Ð¸Ð»Ð¸ обеÑÑвеÑеннÑми. ÐнаÑение 'false' полноÑÑÑÑ 51 // ÑкÑÑÐ²Ð°ÐµÑ Ð¸Ð·Ð¾Ð±ÑÐ°Ð¶ÐµÐ½Ð¸Ñ â полÑзоваÑÐµÐ»Ñ Ð¼Ð¾Ð¶ÐµÑ Ð²ÑбÑаÑÑ ÑÑо Ñам 52 // в панели, но навÑзÑваÑÑ Ñакое по ÑмолÑÐ°Ð½Ð¸Ñ Ð½Ðµ нÑжно. 53 images: true, 54 55 speech: true, 56 panelFixed: true, 57 reload: false, 58 59 // ÐÑÑÑаиваемÑе ÑлеменÑÑ (video, iframe, ymaps) â ÐЫÐÐЮЧÐÐЫ. 60 // Ð hero ÑоÑо и видео Ð»ÐµÐ¶Ð°Ñ Ð´ÑÑг на дÑÑге: <img class="slide__image"> 61 // ÑнизÑ, <video class="slide__video"> повеÑÑ Ð½ÐµÐ³Ð¾ пÑоÑвлÑеÑÑÑ ÑеÑез 62 // 1.25Ñ. СкÑÑÐ²Ð°Ñ Ð²Ð¸Ð´ÐµÐ¾, Ð¼Ñ Ð¾ÑкÑÑваем ÑоÑо под ним â в Ñежиме 63 // ÑлабовидÑÑÐ¸Ñ Ð´Ð²Ð¸Ð¶ÑÑийÑÑ Ñон не нÑжен, а каÑÑинка нÑжна. 64 // 65 // ÐобоÑнÑй ÑÑÑÐµÐºÑ Ð²ÐµÐ½Ð´Ð¾Ñа: ÑÑÐ¾Ñ Ð¶Ðµ Ñлаг пÑÑÑÐµÑ <figure>, поÑÑÐ¾Ð¼Ñ 66 // в accessibility.css (ÑекÑÐ¸Ñ 5) figure пÑинÑдиÑелÑно возвÑаÑÑн â 67 // Ñ Ð½Ð°Ñ ÑÑо обÑÑÑка обÑÑнÑÑ Ð¸Ð·Ð¾Ð±Ñажений, а не ÑолÑко видео. 68 // 69 // ÐолÑзоваÑÐµÐ»Ñ Ð¼Ð¾Ð¶ÐµÑ Ð²ÐºÐ»ÑÑиÑÑ Ð²ÑÑÑаиваемÑе ÑлеменÑÑ Ð¾Ð±ÑаÑно 70 // в наÑÑÑÐ¾Ð¹ÐºÐ°Ñ Ð¿Ð°Ð½ÐµÐ»Ð¸. 71 builtElements: false 72 }); 73 74 /* ââ Ð ÐÐÐÐРЫ ЧÐÐ ÐÐ ÐУРââââââââââââââââââââââââââââââââââââââ 75 Ðлагин назнаÑÐ°ÐµÑ Ð°Ð±ÑолÑÑнÑй font-size ÐºÐ°Ð¶Ð´Ð¾Ð¼Ñ ÑлеменÑÑ Ð¸ Ñем 76 ÑÑиÑÐ°ÐµÑ ÑипогÑаÑÐ¸ÐºÑ ÑайÑа. ÐмеÑÑо ÑпоÑа о ÑпеÑиÑиÑноÑÑи 77 Ñнимаем аÑÑибÑÑ [data-bvi-fontsize] Ñ .bvi-body â без него 78 вендоÑнÑе пÑавила ÑазмеÑов пÑоÑÑо не ÑовпадаÑÑ, и вÑÑÑÑка 79 оÑÑаÑÑÑÑ Ð² ÑÐ²Ð¾Ð¸Ñ Ð¸ÑÑ Ð¾Ð´Ð½ÑÑ , ÑиÑабелÑнÑÑ ÑазмеÑÐ°Ñ . 80 81 ÐÑбÑанное знаÑение пÑевÑаÑаем в коÑÑÑиÑÐ¸ÐµÐ½Ñ Ð·Ñма и кладÑм 82 в CSS-пеÑеменнÑÑ --bvi-zoom (пÑименÑеÑÑÑ Ð² accessibility.css). 83 ÐÑо единÑÑвенное меÑÑо, где ÑкÑÐ¸Ð¿Ñ Ð¿Ð¸ÑÐµÑ ÑÑилÑ, и пиÑÐµÑ Ð¾Ð½ 84 не оÑоÑмление, а один вÑÑиÑленнÑй коÑÑÑиÑиенÑ. 85 86 BASE = 18 ÑÐ¾Ð²Ð¿Ð°Ð´Ð°ÐµÑ Ñ fontSize в конÑиге вÑÑе: пÑи ÑÑаÑÑовом 87 знаÑении зÑм Ñавен 1, Ñо еÑÑÑ ÑÐ°Ð¹Ñ Ð²ÑглÑÐ´Ð¸Ñ Ñовно как обÑÑно, 88 а кнопки «+/â» в панели ÑвелиÑиваÑÑ Ð¸ ÑменÑÑаÑÑ ÐµÐ³Ð¾. */ 89 var BASE = 18; 90 var MIN = 0.8; 91 var MAX = 2.5; 92 var busy = false;
93 94 function applyZoom(bviBody) { 95 if (busy) return; 96 var raw = bviBody.getAttribute('data-bvi-fontsize'); 97 if (raw === null) return; 98 99 var n = parseInt(raw, 10); 100 if (isNaN(n) || n < 1) n = BASE; 101 102 var zoom = Math.min(MAX, Math.max(MIN, n / BASE)); 103 104 busy = true; 105 bviBody.style.setProperty('--bvi-zoom', String(zoom)); 106 // аÑÑибÑÑ Ñнимаем ÐÐСÐÐ ÑÑÐµÐ½Ð¸Ñ â вендоÑнÑе пÑавила ÑазмеÑов 107 // пеÑеÑÑаÑÑ ÑовпадаÑÑ, ÑипогÑаÑика ÑайÑа не пеÑепиÑÑваеÑÑÑ 108 bviBody.removeAttribute('data-bvi-fontsize'); 109 busy = false; 110 } 111 112 /* Ðлагин пеÑеÑоздаÑÑ ÑазмеÑÐºÑ Ð¿Ñи вклÑÑении Ñежима и 113 пÑоÑÑавлÑÐµÑ Ð°ÑÑибÑÑ Ð·Ð°Ð½Ð¾Ð²Ð¾ пÑи каждом нажаÑии «+/â», 114 поÑÑÐ¾Ð¼Ñ Ñледим за поÑвлением .bvi-body и за аÑÑибÑÑом. */ 115 var observer = new MutationObserver(function () { 116 var bviBody = document.querySelector('.bvi-body'); 117 if (bviBody) applyZoom(bviBody); 118 }); 119 120 observer.observe(document.documentElement, { 121 childList: true, 122 subtree: true, 123 attributes: true, 124 attributeFilter: ['data-bvi-fontsize'] 125 }); 126 127 // на ÑлÑÑай, еÑли Ñежим Ñже бÑл вклÑÑÑн из cookie до запÑÑка 128 var existing = document.querySelector('.bvi-body'); 129 if (existing) applyZoom(existing); 130 131 /* ââ ÐÐÐРЫТÐÐ ÐÐÐЮ ÐÐ Ð ÐÐÐУСÐÐ ÐÐ ÐÐÐЮ âââââââââââââââââââââ 132 Ðнопки «ÐеÑÑÐ¸Ñ Ð´Ð»Ñ ÑлабовидÑÑÐ¸Ñ Â» еÑÑÑ Ð² ÑÑÑÑ Ð¼ÐµÑÑÐ°Ñ : подвал, 133 мобилÑное Ð¼ÐµÐ½Ñ Ð¸ деÑкÑопное менÑ. ÐÑи запÑÑке из Ð¼ÐµÐ½Ñ Ð¾Ð½Ð¾ 134 должно закÑÑваÑÑÑÑ â инаÑе Ð¿Ð°Ð½ÐµÐ»Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð° оÑкÑÑваеÑÑÑ Ð¿Ð¾Ð·Ð°Ð´Ð¸ 135 ÑазвÑÑнÑÑого менÑ, и полÑзоваÑÐµÐ»Ñ ÐµÑ Ð½Ðµ видиÑ. 136 137 ÐÐµÐ½Ñ Ð½Ðµ оÑдаÑÑ Ñвой ÑкземплÑÑ Ð½Ð°ÑÑжÑ, поÑÑÐ¾Ð¼Ñ Ð²ÑзваÑÑ 138 menuInstance.close() напÑÑмÑÑ Ð½ÐµÐ»ÑзÑ. ÐаÑо menu.js веÑÐ°ÐµÑ 139 обÑабоÑÑик на вÑе кнопки Ñ ÐºÐ»Ð°ÑÑом .menu__close (мобилÑнаÑ, 140 деÑкÑÐ¾Ð¿Ð½Ð°Ñ Ð¸ кнопка вÑоÑого ÑÑовнÑ) â кликаем по видимой, 141 и оÑÑабаÑÑÐ²Ð°ÐµÑ ÑÑаÑное закÑÑÑие Ñеликом: ÑнÑÑие блокиÑовки 142 ÑкÑолла, возвÑÐ°Ñ ÑокÑÑа, закÑÑÑие подменÑ. 143 144 Так Ð¼Ñ Ð½Ðµ дÑблиÑÑем Ð»Ð¾Ð³Ð¸ÐºÑ Ð¸ не ÑÑогаем menu.js â 145 пÑи его изменении здеÑÑ Ð½Ð¸Ñего ÑиниÑÑ Ð½Ðµ пÑидÑÑÑÑ. */ 146 var menuTriggers = document.querySelectorAll('.menu__accessibility, .menu__desktop-access'); 147 148 Array.prototype.forEach.call(menuTriggers, function (trigger) { 149 trigger.addEventListener('click', function () { 150 var menu = document.getElementById('mainMenu'); 151 if (!menu || !menu.classList.contains('is-open')) return; 152 153 // беÑÑм ÐºÐ½Ð¾Ð¿ÐºÑ Ð·Ð°ÐºÑÑÑиÑ, видимÑÑ Ð½Ð° ÑекÑÑем бÑейкпоинÑе 154 var buttons = menu.querySelectorAll('.menu__close'); 155 for (var i = 0; i < buttons.length; i++) { 156 if (buttons[i].offsetParent !== null) { 157 buttons[i].click(); 158 return; 159 } 160 } 161 162 // запаÑной ваÑианÑ, еÑли ни одна кнопка не оÑÑиÑована 163 if (buttons.length) buttons[0].click(); 164 }); 165 }); 166 167 /* ââ СÐÐÐÐ ÐÐÐÐÐÐÐÐ ÐÐÐЫХ СÐÐÐÐ ÐÐÐ ÐÐÐÐÐЬ ââââââââââââââââââ 168 ÐÐ°Ð½ÐµÐ»Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð° â position:fixed; top:0; z-index:999999, Ñо еÑÑÑ 169 вÑÑе лÑбого наÑего ÑÐ»Ð¾Ñ (Ñ Ð¼ÐµÐ½Ñ --z-modal, ÑÑо 200). ÐÐµÐ½Ñ 170 оÑкÑÑваеÑÑÑ Ð²Ð¾ веÑÑ ÑкÑан Ð¾Ñ top:0 и ÑÐµÐ·Ð¶Ð°ÐµÑ Ð¿Ð¾Ð´ Ð¿Ð°Ð½ÐµÐ»Ñ 171 вмеÑÑе Ñ ÐºÐ½Ð¾Ð¿ÐºÐ¾Ð¹ закÑÑÑÐ¸Ñ â вÑйÑи из Ð¼ÐµÐ½Ñ ÑÑановиÑÑÑ Ð½ÐµÑем. 172 173 ÐоднимаÑÑ Ð¼ÐµÐ½Ñ Ð²ÑÑе панели нелÑзÑ: Ñогда недоÑÑÑпной ÑÑÐ°Ð½ÐµÑ 174 Ñама панелÑ. ÐоÑÑÐ¾Ð¼Ñ Ð¸Ð·Ð¼ÐµÑÑем ÐµÑ Ð²ÑÑоÑÑ Ð¸ Ñдвигаем на Ð½ÐµÑ 175 полноÑкÑаннÑе Ñлои (менÑ, деÑкÑопнÑй поиÑк) â оба оÑÑаÑÑÑÑ 176 полноÑÑÑÑ ÑабоÑими. 177 178 ÐÑÑоÑа панели завиÑÐ¸Ñ Ð¾Ñ ÑиÑÐ¸Ð½Ñ ÑкÑана и Ð¾Ñ Ñого, ÑвеÑнÑл ли 179 ÐµÑ Ð¿Ð¾Ð»ÑзоваÑелÑ, поÑÑÐ¾Ð¼Ñ Ð¿ÐµÑеÑÑиÑÑваем на resize и пÑи лÑбÑÑ 180 изменениÑÑ Ð²Ð½ÑÑÑи Ñамой панели. */ 181 function updatePanelOffset() { 182 var panel = document.querySelector('.bvi-panel'); 183 var visible = panel && !panel.classList.contains('bvi-panel-hide'); 184 185 /* Сдвиг нÑжен, ÑолÑко когда Ð¿Ð°Ð½ÐµÐ»Ñ ÐÐÐÐÐЮЩÐЯ (position:fixed): 186 именно Ñогда она ложиÑÑÑ Ð¿Ð¾Ð²ÐµÑÑ ÑодеÑжимого. ÐÑли Ð¿Ð°Ð½ÐµÐ»Ñ 187 не закÑеплена, она ÑÑÐ¾Ð¸Ñ Ð² поÑоке и Ñама ÑÐ°Ð·Ð´Ð²Ð¸Ð³Ð°ÐµÑ ÑÑÑаниÑÑ â 188 дополниÑелÑнÑй Ñдвиг Ñогда лиÑÑ Ñоздал Ð±Ñ Ð¿ÑÑÑÑÑ Ð¿Ð¾Ð»Ð¾ÑÑ ÑвеÑÑ Ñ. */ 189 var floating = false;
190 if (visible) { 191 floating = window.getComputedStyle(panel).position === 'fixed'; 192 } 193 194 var height = floating ? panel.getBoundingClientRect().height : 0; 195 196 document.documentElement.style.setProperty('--bvi-panel-h', Math.round(height) + 'px'); 197 } 198 199 /* ÐÐ°Ð½ÐµÐ»Ñ Ð·Ð°ÐºÑеплÑеÑÑÑ ÐÐ ÑÑазÑ: плагин веÑÐ°ÐµÑ .bvi-fixed-top 200 ÑолÑко поÑле пÑокÑÑÑки ÑÑÑаниÑÑ Ð½Ð° 200px, до ÑÑого Ð¿Ð°Ð½ÐµÐ»Ñ 201 ÑÑÐ¾Ð¸Ñ Ð² поÑоке. ÐоÑÑÐ¾Ð¼Ñ ÑлÑÑаем ÑкÑолл â именно он менÑÐµÑ 202 Ñежим â и пеÑеÑÑиÑÑваем Ñдвиг. 203 204 СкÑолл ÑÑоÑÑлим ÑеÑез requestAnimationFrame, как пÑинÑÑо 205 в пÑоекÑе: Ð·Ð°Ð¼ÐµÑ Ð²ÑзÑÐ²Ð°ÐµÑ getComputedStyle и getBoundingClientRect, 206 на каждÑй пикÑÐµÐ»Ñ Ð¿ÑокÑÑÑки ÑÑо доÑого. */ 207 var ticking = false; 208 209 function requestUpdate() { 210 if (ticking) return; 211 ticking = true; 212 requestAnimationFrame(function () { 213 updatePanelOffset(); 214 ticking = false; 215 }); 216 } 217 218 window.addEventListener('scroll', requestUpdate, { passive: true }); 219 220 var resizeTimer = null; 221 window.addEventListener('resize', function () { 222 clearTimeout(resizeTimer); 223 resizeTimer = setTimeout(function () { 224 updatePanelOffset(); 225 adjustCloseLabel(); 226 }, 150); 227 }); 228 229 /* ÐÐ°Ð½ÐµÐ»Ñ ÑоздаÑÑÑÑ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð¾Ð¼ не ÑÑазÑ. ÐдÑм ÐµÑ Ð¿Ð¾ÑвлениÑ, поÑле 230 Ñего наблÑдаем ТÐÐЬÐРза ней, а не за вÑем докÑменÑом: 231 обÑий наблÑдаÑÐµÐ»Ñ ÑÑабаÑÑвал Ð±Ñ Ð½Ð° каждое пеÑеклÑÑение 232 is-active/is-open на ÑайÑе и зÑÑ Ð´ÑÑгал Ð±Ñ Ð¿ÐµÑеÑÑÑÑ. */ 233 /* Ðнопки ÑвоÑаÑÐ¸Ð²Ð°Ð½Ð¸Ñ Ð¸ возвÑаÑа панели ÑоÑÑоÑÑ Ð¸Ð· одной 234 иконки, без ÑекÑÑа â пÑогÑÐ°Ð¼Ð¼Ñ ÑÑÐµÐ½Ð¸Ñ Ñ ÑкÑана обÑÑвлÑÑÑ 235 Ð¸Ñ Ð¿ÑоÑÑо «ÑÑÑлка». ÐÑоÑÑавлÑем доÑÑÑпнÑе имена. 236 237 ÐодпиÑÑ Â«Ð¡ÐºÑÑÑÑ Ð¿Ð°Ð½ÐµÐ»Ñ» на мобилÑнÑÑ ÑиÑÑеÑÑÑ ÑеÑез ::after 238 в CSS; ÑгенеÑиÑованнÑй конÑÐµÐ½Ñ ÑиÑаÑÑ Ð½Ðµ вÑе пÑогÑаммÑ, 239 поÑÑÐ¾Ð¼Ñ aria-label здеÑÑ Ð½Ðµ дÑблиÑование, а оÑнова. */ 240 /* Ðа ÑÐ·ÐºÐ¸Ñ ÑкÑÐ°Ð½Ð°Ñ Â«ÐбÑÑÐ½Ð°Ñ Ð²ÐµÑÑÐ¸Ñ ÑайÑа» Ð·Ð°Ð½Ð¸Ð¼Ð°ÐµÑ Ð¿Ð¾ÑÑи вÑÑ 241 ÑÑÑокÑ. СокÑаÑаем до «ÐбÑÑÐ½Ð°Ñ Ð²ÐµÑÑиÑ». 242 243 ТекÑÑ Ð¿ÑÐ¸Ñ Ð¾Ð´Ð¸Ñ Ð¸Ð· локализаÑии плагина, поÑÑÐ¾Ð¼Ñ Ð¼ÐµÐ½Ñем его 244 ÑкÑипÑом, а не CSS: подмена ÑеÑез ::after Ñломала Ð±Ñ 245 доÑÑÑпное Ð¸Ð¼Ñ ÑÑÑлки. ÐÑигинал ÑÐ¾Ñ ÑанÑем в data-аÑÑибÑÑе 246 и возвÑаÑаем на деÑкÑопе. */ 247 var MOBILE_QUERY = '(max-width: 1023.98px)'; 248 249 function adjustCloseLabel() { 250 var link = document.querySelector('.bvi-panel a[data-bvi="close"]'); 251 if (!link) return; 252 253 if (!link.getAttribute('data-taganka-full-label')) { 254 link.setAttribute('data-taganka-full-label', link.textContent.trim()); 255 } 256 257 var full = link.getAttribute('data-taganka-full-label'); 258 var isMobile = window.matchMedia(MOBILE_QUERY).matches; 259 var next = isMobile ? 'ÐбÑÑÐ½Ð°Ñ Ð²ÐµÑÑиÑ' : full; 260 261 if (link.textContent.trim() !== next) { 262 link.textContent = next; 263 } 264 } 265 266 function labelIconButtons() { 267 var hide = document.querySelector('.bvi-panel a[data-bvi="panel-hide"]'); 268 var show = document.querySelector('.bvi-link-fixed-top'); 269 270 if (hide && !hide.getAttribute('aria-label')) { 271 hide.setAttribute('aria-label', 'СкÑÑÑÑ Ð¿Ð°Ð½ÐµÐ»Ñ Ð½Ð°ÑÑÑоек'); 272 } 273 274 /* ÐодпиÑÑ Â«Ð¡ÐºÑÑÑÑ Ð¿Ð°Ð½ÐµÐ»Ñ» ÑÑдом Ñ ÐºÑÑжком. 275 276 ÐÑÑавлÑем ÑеалÑнÑй <span>, а не ÑиÑÑем ÑеÑез CSS ::after: 277 пÑевдоÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð²Ñл ÑÐµÐ±Ñ Ð½ÐµÐ¿ÑедÑказÑемо в ÑаÑкладке панели, 278 а наÑÑоÑÑий ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð·Ð°Ð½Ð¸Ð¼Ð°ÐµÑ ÑÐ²Ð¾Ñ Ð¼ÐµÑÑо в поÑоке. ÐидимоÑÑÑ 279 по бÑейкпоинÑам ÑпÑавлÑеÑÑÑ ÐºÐ»Ð°ÑÑом в accessibility.css â 280 на деÑкÑопе подпиÑÑ ÑкÑÑÑа, Ñам кнопка кÑÑглаÑ. */ 281 if (hide && !hide.querySelector('.taganka-hide-label')) { 282 var label = document.createElement('span'); 283 label.className = 'taganka-hide-label'; 284 label.textContent = 'СкÑÑÑÑ Ð¿Ð°Ð½ÐµÐ»Ñ'; 285 hide.appendChild(label); 286 } 287 288 if (show && !show.getAttribute('aria-label')) { 289 show.setAttribute('aria-label', 'ÐоказаÑÑ Ð¿Ð°Ð½ÐµÐ»Ñ Ð½Ð°ÑÑÑоек'); 290 } 291 } 292 293 var appearObserver = new MutationObserver(function () { 294 var panel = document.querySelector('.bvi-panel'); 295 if (!panel) return; 296 297 appearObserver.disconnect(); 298 updatePanelOffset(); 299 labelIconButtons(); 300 adjustCloseLabel(); 301 302 new MutationObserver(requestUpdate).observe(panel, { 303 attributes: true, 304 attributeFilter: ['class'] 305 }); 306 }); 307 308 appearObserver.observe(document.body, { childList: true, subtree: true }); 309 310 updatePanelOffset(); 311})();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.