1/** 2 * ÐаÑÑа в ÑÑÑеÑе â Ð¯Ð½Ð´ÐµÐºÑ ÐаÑÑÑ, JS API 3.0. 3 * 4 * ÐниÑиализаÑÐ¸Ñ Ð»ÐµÐ½Ð¸Ð²Ð°Ñ: каÑÑа ÑÑÑоиÑÑÑ, когда ÑÑÑÐµÑ Ð¿Ð¾Ð´Ñ Ð¾Ð´Ð¸Ñ Ðº вÑÑпоÑÑÑ 5 * (IntersectionObserver Ñ Ð·Ð°Ð¿Ð°Ñом 600px). Ðо ÑÑого ни SDK ЯндекÑа, ни CSS 6 * конÑÑолов Ñ jsdelivr не запÑаÑиваÑÑÑÑ. Так и должно бÑÑÑ: ÑанÑÑе вÑÑ ÑÑо 7 * гÑÑзилоÑÑ Ñ Ð¿ÐµÑвÑм ÑендеÑом ÑÑÑеÑа, Ñо еÑÑÑ Ð½Ð° каждой ÑÑÑаниÑе, и ÑÑнÑло 8 * Ñ Ð²Ð¾ÑÑ ÐºÑиÑиÑеÑкого пÑÑи пÑимеÑно на 6 ÑекÑнд. 9 * 10 * ÐолÑзоваÑÐµÐ»Ñ Ð¿Ð¾-пÑÐµÐ¶Ð½ÐµÐ¼Ñ Ð²Ð¸Ð´Ð¸Ñ Ð³Ð¾ÑовÑÑ ÐºÐ°ÑÑÑ â к моменÑÑ, когда ÑÑÑÐµÑ 11 * Ð¿Ð¾Ð¿Ð°Ð´Ð°ÐµÑ Ð½Ð° ÑкÑан, она Ñже оÑÑиÑована. ÐобоÑнÑй плÑÑ: Ñ Ð¿Ð¾ÑеÑиÑелей, 12 * не доÑкÑоллевÑÐ¸Ñ Ð´Ð¾ ÑÑÑеÑа, ÑÑоÑÐ¾Ð½Ð½Ð¸Ñ Ð·Ð°Ð¿ÑоÑов к ЯндекÑÑ Ð½Ðµ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÐµÑ 13 * вовÑе. ÐолноÑеннÑм ÑеÑением по кÑкам ÑÑо не ÑÑиÑаÑÑ â пÑи доÑкÑолле 14 * запÑÐ¾Ñ ÑÑ Ð¾Ð´Ð¸Ñ Ð½ÐµÐ·Ð°Ð²Ð¸Ñимо Ð¾Ñ ÑоглаÑиÑ, вопÑÐ¾Ñ ÐºÐ¾Ð¼Ð¿Ð»Ð°ÐµÐ½Ñа оÑкÑÑÑ. 15 * 16 * ÐÑоÑмление подложки â JSON из «РедакÑоÑа ÑÑилей каÑÑ» (js/map-style.json), 17 * маÑÑÑÑÑ â Ð¿Ð¾Ð»Ð¸Ð»Ð¸Ð½Ð¸Ñ Ð¿Ð¾ заданнÑм ÑоÑкам, меÑки â Ñвои. 18 * 19 * ÐÐÐÐÐ (ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð±ÐµÑплаÑного иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ API, п. 3): копиÑайÑÑ, логоÑип 20 * ЯндекÑа и кнопка «ÐÑкÑÑÑÑ Ð² ÐаÑÑÐ°Ñ Â» Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¾ÑÑаваÑÑÑÑ Ð²Ð¸Ð´Ð¸Ð¼Ñми. ÐÑ Ð½ÐµÐ»ÑÐ·Ñ 21 * пеÑекÑÑваÑÑ Ð¸Ð»Ð¸ оÑклÑÑаÑÑ â ÑÑо ÑÑебование дейÑÑвÑÐµÑ Ð¸ в плаÑной лиÑензии. 22 */ 23(function () { 24 'use strict'; 25 26 var cfg = window.jbMap || {}; 27 var root = document.querySelector('[data-jb-map]'); 28 29 if (!root || !cfg.key) { 30 return; 31 } 32 33 var started = false; 34 35 /** 36 * ÐиагноÑÑика. ÐÑкÑÑваÑÑ URL загÑÑзÑика в оÑделÑной вкладке ÐÐСÐÐÐÐÐÐÐ: 37 * Ñ JS API 3.0 пÑовеÑка Referer ÑÑÑогаÑ, а в адÑеÑной ÑÑÑоке заголовка Ð½ÐµÑ â 38 * клÑÑ Ð¾ÑобÑÑÑÑÑ Â«Invalid api key» даже когда он полноÑÑÑÑ Ð¸ÑпÑавен. 39 * ÐдинÑÑвеннÑй валиднÑй ÑеÑÑ â загÑÑзка Ñо ÑÑÑаниÑÑ ÑайÑа. 40 */ 41 /** 42 * ÐлÑÑ Ð´Ð»Ñ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ñ ÐºÐ°Ð±Ð¸Ð½ÐµÑом: наÑало и Ñ Ð²Ð¾ÑÑ. Целиком он и Ñак Ð»ÐµÐ¶Ð¸Ñ 43 * в иÑÑ Ð¾Ð´Ð½Ð¸ÐºÐµ ÑÑÑаниÑÑ, но в логе доÑÑаÑоÑно опознаваÑелÑнÑÑ Ð·Ð½Ð°ÐºÐ¾Ð². 44 */ 45 function maskKey(k) { 46 if (!k) { 47 return '(пÑÑÑо)'; 48 } 49 return k.length > 14 50 ? k.slice(0, 8) + 'â¦' + k.slice(-4) + ' (' + k.length + ' Ñимв.)' 51 : k + ' (' + k.length + ' Ñимв.)'; 52 } 53 54 /** ÐолиÑика ÑеÑеÑеÑа докÑменÑа â еÑли она `no-referrer`, клÑÑ Ð¾ÑобÑÑÑÑÑ Ð²Ñегда. */ 55 function referrerPolicy() { 56 try { 57 return new Request(location.href).referrerPolicy || '(по ÑмолÑÐ°Ð½Ð¸Ñ Ð±ÑаÑзеÑа)'; 58 } catch (e) { 59 return '(не ÑдалоÑÑ Ð¾Ð¿ÑеделиÑÑ)'; 60 } 61 } 62 63 function explainSdkError() { 64 if (!window.console) { 65 return; 66 } 67 console.warn( 68 '[jb-map] SDK Ð¯Ð½Ð´ÐµÐºÑ ÐаÑÑ Ð½Ðµ загÑÑзилÑÑ â 403 по клÑÑÑ.\n' + 69 'ÐÑовеÑÑÑÑ ÐÐ ÑеÑез оÑкÑÑÑие URL в новой вкладке: Ñам Ð½ÐµÑ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ° Referer,\n' + 70 'и клÑÑ Ñ Ð¾Ð³ÑаниÑениÑми вÑегда веÑнÑÑ Â«Invalid api key». ТеÑÑ ÑолÑко Ñо ÑÑÑаниÑÑ.\n' + 71 '\n' + 72 'ÐÑаÑÐ·ÐµÑ Ð¾ÑпÑавил ЯндекÑÑ Ñакой Referer:\n' + 73 ' origin: ' + location.origin + '\n' + 74 ' домен Ð´Ð»Ñ ÐºÐ°Ð±Ð¸Ð½ÐµÑа ' + location.hostname + '\n' + 75 ' полиÑика ÑеÑеÑеÑа: ' + referrerPolicy() + '\n' + 76 ' клÑÑ Ð½Ð° ÑÑÑаниÑе: ' + maskKey(cfg.key) + '\n' + 77 'СÑÑока «домен Ð´Ð»Ñ ÐºÐ°Ð±Ð¸Ð½ÐµÑа» должна СÐÐÐÐÐÐТЬ Ñ Ð·Ð°Ð¿Ð¸ÑÑÑ Ð² поле\n' + 78 '«ÐгÑаниÑение по HTTP Referer» Ñимвол в Ñимвол (или бÑÑÑ ÐµÑ Ð¿Ð¾Ð´Ð´Ð¾Ð¼ÐµÐ½Ð¾Ð¼).\n' + 79 '\n' + 80 'ЧÑо пÑовеÑиÑÑ Ð² кабинеÑе (yandex.ru/maps-api/console):\n' + 81 '1. ÐлÑÑ Ñоздан под пÑодÑÐºÑ Â«JavaScript API и HTTP ÐеокодеÑ»,\n' + 82 ' а не Static API / ÐеоÑаджеÑÑ / MapKit. СвеÑÑ ÑÑÑÐ¾ÐºÑ Â«ÐºÐ»ÑÑ Ð½Ð° ÑÑÑаниÑе»\n' + 83 ' Ñ ÐºÐ»ÑÑом в кабинеÑе: поле ymaps_key могло оÑÑаÑÑÑÑ Ð¾Ñ Ð¿Ñежнего клÑÑа.\n' + 84 '2. Ðоле «ÐгÑаниÑение по HTTP Referer» ÐÐÐÐÐÐÐÐ
84Ð: JS API 3.0 не ÑабоÑаеÑ\n' + 85 ' Ñ ÐºÐ»ÑÑами без него. ÐÑиÑаÑÑ ÑпиÑок нелÑзÑ.\n' + 86 '3. Ðомен запиÑан без ÑÑ ÐµÐ¼Ñ, поÑÑа и паÑамеÑÑов.\n' + 87 ' ÐÐ¾Ð´Ð´Ð¾Ð¼ÐµÐ½Ñ Ð¯Ð½Ð´ÐµÐºÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÑÐµÑ Ñам.\n' + 88 '4. С моменÑа поÑледнего ÑÐ¾Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ ÑоÑÐ¼Ñ Ð¿ÑоÑло 15 минÑÑ â оÑÑÑÑÑ\n' + 89 ' пеÑезапÑÑкаеÑÑÑ Ð¿Ñи каждой пÑавке.\n' + 90 '5. ÐлÑÑ Ð°ÐºÑивиÑован (в ÑпиÑке ÑÑаÑÑÑ Â«ÐкÑивен», а не «ÐжидаеÑ»).' 91 ); 92 } 93 94 /** ÐодклÑÑÐ°ÐµÑ SDK один Ñаз и оÑдаÑÑ Ð¿ÑÐ¾Ð¼Ð¸Ñ Ð³Ð¾ÑовноÑÑи. */ 95 function loadSdk() { 96 if (window.ymaps3) { 97 return window.ymaps3.ready; 98 } 99 var url = 'https://api-maps.yandex.ru/v3/?apikey=' + encodeURIComponent(cfg.key) + '&lang=ru_RU'; 100 return new Promise(function (resolve, reject) { 101 var s = document.createElement('script'); 102 // Referer обÑзаÑелен: клÑÑ JS API 3.0 живÑÑ ÑолÑко Ñ Ð¾Ð³ÑаниÑением по
103 // доменÑ. ÐолиÑика Ñамого докÑменÑа могла Ð±Ñ ÐµÐ³Ð¾ ÑÑезаÑÑ (`no-referrer` 104 // из плагина безопаÑноÑÑи или CDN) â на Ñеге она пеÑеопÑеделÑеÑÑÑ, 105 // поÑÑÐ¾Ð¼Ñ origin ÑйдÑÑ Ð²Ñегда. 106 s.referrerPolicy = 'origin'; 107 s.src = url; 108 s.onload = function () { 109 if (!window.ymaps3) { 110 reject(new Error('SDK загÑÑзилÑÑ, но ymaps3 не поÑвилÑÑ')); 111 return; 112 } 113 window.ymaps3.ready.then(resolve, reject); 114 }; 115 s.onerror = function () { 116 explainSdkError(); 117 reject(new Error('SDK Ð¯Ð½Ð´ÐµÐºÑ ÐаÑÑ Ð½Ðµ загÑÑзилÑÑ â подÑобноÑÑи вÑÑе.')); 118 }; 119 document.head.appendChild(s); 120 }); 121 } 122 123 /** ÐеÑка: подпиÑÑ Ð½Ð° плаÑке, оÑоÑмление â Ñокенами ÑемÑ. */ 124 function markerEl(text, modifier) { 125 var el = document.createElement('div'); 126 el.className = 'jb-map__pin' + (modifier ? ' jb-map__pin--' + modifier : ''); 127 el.textContent = text; 128 return el; 129 } 130 131 /** 132 * ÐлеменÑÑ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð·Ñмом (+/-) â оÑделÑнÑй Ð¿Ð°ÐºÐµÑ JS API 133 * (@yandex/ymaps3-default-ui-theme), в оÑновной SDK не Ð²Ñ Ð¾Ð´Ð¸Ñ. 134 * ÐодклÑÑаеÑÑÑ ÑеÑез CDN по инÑÑÑÑкÑии из докÑменÑаÑии: 135 * yandex.ru/maps-api/docs/js-api/reference-guide/packages.html. 136 * ÐÑли Ð¿Ð°ÐºÐµÑ Ð½Ðµ загÑÑзилÑÑ (ÑеÑÑ, CDN недоÑÑÑпен) â каÑÑа ÑабоÑÐ°ÐµÑ Ð¸ без 137 * конÑÑолов, ÑÑо не кÑиÑиÑÐ½Ð°Ñ Ð¾Ñибка. 138 */ 139 var controlsCssHref = 'https://cdn.jsdelivr.net/npm/@yandex/ymaps3-default-ui-theme/dist/esm/index.css'; 140 function loadControlsPackage() { 141 if (!window.ymaps3 || !window.ymaps3.import) { 142 return Promise.resolve(null); 143 } 144 try { 145 window.ymaps3.import.registerCdn('https://cdn.jsdelivr.net/npm/{package}', [ 146 '@yandex/[email protected]' 147 ]); 148 } catch (e) { 149 // registerCdn Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ и Ñого же пакеÑа вÑоÑой Ñаз Ð¼Ð¾Ð¶ÐµÑ Ð±ÑоÑиÑÑ â 150 // не кÑиÑиÑно, Ð¿Ð°ÐºÐµÑ Ñже заÑегиÑÑÑиÑован. 151 } 152 if (!document.querySelector('link[data-jb-map-controls-css]')) { 153 var link = document.createElement('link'); 154 link.rel = 'stylesheet'; 155 link.href = controlsCssHref; 156 link.setAttribute('data-jb-map-controls-css', ''); 157 document.head.appendChild(link); 158 } 159 return window.ymaps3.import('@yandex/ymaps3-default-ui-theme').catch(function (e) { 160 if (window.console) { 161 console.warn('[jb-map] ÐонÑÑол зÑма не загÑÑзилÑÑ:', (e && e.message) ? e.message : e); 162 } 163 return null; 164 }); 165 } 166 167 /** 168 * ÐоÑÑÑпнÑе имена внÑÑÑи каÑÑÑ. ÐÑÑ, ÑÑо ÑиÑÑÐµÑ SDK и Ð¿Ð°ÐºÐµÑ 169 * @yandex/ymaps3-default-ui-theme, пÑÐ¸Ñ Ð¾Ð´Ð¸Ñ Ð±ÐµÐ· ÑекÑÑа â ÑолÑко SVG, 170 * ни подпиÑи, ни aria-label. ÐÑÑÑда пÑÐ¾Ð²Ð°Ð»Ñ axe/Lighthouse 171 * «Buttons must have discernible text» (кнопки зÑма) и 172 * «Links must have discernible text» (логоÑип в копиÑайÑÐ°Ñ ), 173 * а ÑкÑинÑÐ¸Ð´ÐµÑ Ð¸ ÐÐ-Ð°Ð³ÐµÐ½Ñ ÑиÑаÑÑ Ð¸Ñ ÐºÐ°Ðº безÑмÑннÑе ÑлеменÑÑ. 174 * ÐпÑий Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñи ни SDK, ни Ð¿Ð°ÐºÐµÑ Ð½Ðµ даÑÑ, поÑÑÐ¾Ð¼Ñ Ð²ÐµÑаем Ñами. 175 * 176 * Ðидимое ниÑего не менÑеÑÑÑ: п. 3 ÑÑловий беÑплаÑного иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ API 177 * ÑÑебÑеÑ, ÑÑÐ¾Ð±Ñ ÐºÐ¾Ð¿Ð¸ÑайÑÑ, логоÑип и «ÐÑкÑÑÑÑ Ð² ÐаÑÑÐ°Ñ Â» оÑÑавалиÑÑ 178 * видимÑми, и aria-label ÑÑого не каÑаеÑÑÑ. 179 * 180 * ÐапÑавление зÑма опÑеделÑем по веÑÑикалÑной позиÑии, а не по поÑÑÐ´ÐºÑ 181 * в DOM: веÑÑ Ð½ÑÑ ÐºÐ½Ð¾Ð¿ÐºÐ° â «+». 182 * 183 * @return bool true, когда подпиÑÐ°Ð½Ñ Ð¸ кнопки, и логоÑип. 184 */ 185 function labelMapA11y(scope) { 186 var buttons = scope.querySelectorAll('.ymaps3--zoom-control button'); 187 var zoomDone = buttons.length > 1; 188 189 if (zoomDone) { 190 var labels = ['ÐÑиблизиÑÑ ÐºÐ°ÑÑÑ', 'ÐÑдалиÑÑ ÐºÐ°ÑÑÑ']; 191 Array.prototype.slice.call(buttons).sort(function (a, b) { 192 return a.getBoundingClientRect().top - b.getBoundingClientRect().top; 193 }
193).forEach(function (btn, i) { 194 if (!btn.getAttribute('aria-label')) { 195 btn.setAttribute('aria-label', labels[i] || labels[labels.length - 1]); 196 } 197 }); 198 } 199 200 var logo = scope.querySelector('.ymaps3--map-copyrights__logo'); 201 if (logo && !logo.getAttribute('aria-label')) { 202 logo.setAttribute('aria-label', 'Ð¯Ð½Ð´ÐµÐºÑ ÐаÑÑÑ'); 203 } 204 205 // Ð¢Ð°Ð¹Ð»Ñ Ð¿Ð¾Ð´Ð»Ð¾Ð¶ÐºÐ¸ â <img> без alt, оÑÑÑда «Image elements do not have 206 // [alt] attributes» в Lighthouse. ÐÑоÑÑавлÑÑÑ alt ÐºÐ°Ð¶Ð´Ð¾Ð¼Ñ Ð±ÐµÑполезно: 207 // SDK доÑоздаÑÑ ÑÐ°Ð¹Ð»Ñ Ð¿Ñи лÑбом зÑме и пеÑеÑаÑкивании, а наблÑдаÑÐµÐ»Ñ 208 // к ÑÐ¾Ð¼Ñ Ð¼Ð¾Ð¼ÐµÐ½ÑÑ Ñже оÑклÑÑÑн. ÐоÑÑÐ¾Ð¼Ñ ÑкÑÑваем Ð¾Ñ AT веÑÑ Ñлой 209 // Ñайлов â aria-hidden наÑледÑеÑÑÑ, и бÑдÑÑие ÑÐ°Ð¹Ð»Ñ Ñоже под ним. 210 // СмÑÑл не ÑеÑÑеÑÑÑ: оÑделÑнÑй квадÑÐ°Ñ Ð¿Ð¾Ð´Ð»Ð¾Ð¶ÐºÐ¸ ниÑего не ÑообÑаеÑ, 211 // а адÑÐµÑ Ð¸ маÑÑÑÑÑ Ð¿ÑодÑблиÑÐ¾Ð²Ð°Ð½Ñ ÑекÑÑом в ÑÑÑеÑе. ÐопиÑайÑÑ, 212 // логоÑип, кнопки зÑма и меÑки Ð»ÐµÐ¶Ð°Ñ Ð²Ð½Ðµ ÑÐ»Ð¾Ñ Ð¸ оÑÑаÑÑÑÑ Ð´Ð¾ÑÑÑпнÑ. 213 var tiles = scope.querySelectorAll('.ymaps3--tile-layer__container'); 214 Array.prototype.forEach.call(tiles, function (layer) { 215 if (!layer.getAttribute('aria-hidden')) { 216 layer.setAttribute('aria-hidden', 'true'); 217 } 218 // СÑÑÐ°Ñ Ð¾Ð²ÐºÐ° Ð´Ð»Ñ Ñже оÑÑиÑованнÑÑ Ñайлов, еÑли пÑовеÑка ÑмоÑÑÐ¸Ñ 219 // на Ñам <img> и не ÑÑиÑÑÐ²Ð°ÐµÑ ÑкÑÑÑого ÑодиÑелÑ. 220 Array.prototype.forEach.call(layer.querySelectorAll('img:not([alt])'), function (img) { 221 img.setAttribute('alt', ''); 222 }); 223 }); 224 225 return zoomDone && !!logo && tiles.length > 0; 226 } 227 228 /** 229 * ÐонÑÑÐ¾Ð»Ñ Ð¸ копиÑайÑÑ ÑендеÑÑÑÑÑ Ð°ÑÐ¸Ð½Ñ Ñонно, Ñже поÑле addChild, поÑÑÐ¾Ð¼Ñ 230 * ждÑм Ð¸Ñ Ð¿Ð¾ÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð½Ð°Ð±Ð»ÑдаÑелем. ÐаблÑдаÑÐµÐ»Ñ Ð¾ÑклÑÑаеÑÑÑ ÑÑÐ°Ð·Ñ Ð¿Ð¾Ñле 231 * подпиÑи и ÑÑÑÐ°Ñ Ð¾Ð²Ð¾Ñно по ÑаймаÑÑÑ â еÑли Ð¿Ð°ÐºÐµÑ Ñак и не оÑÑиÑовалÑÑ. 232 */ 233 function watchMapA11y(scope) { 234 if (labelMapA11y(scope) || typeof MutationObserver !== 'function') { 235 return; 236 } 237 var observer = new MutationObserver(function () { 238 if (labelMapA11y(scope)) { 239 observer.disconnect(); 240 } 241 }); 242 observer.observe(scope, { childList: true, subtree: true }); 243 setTimeout(function () { 244 observer.disconnect(); 245 }, 10000); 246 } 247 248 function init() { 249 if (started) { 250 return; 251 } 252 started = true; 253 root.classList.add('is-loading'); 254 255 loadSdk().then(function () { 256 return Promise.all([ 257 fetch(cfg.style).then(function (r) { return r.json(); }), 258 loadControlsPackage() 259 ]); 260 }).then(function (res) { 261 var customization = res[0]; 262 var controlsPkg = res[1]; 263 264 var YMap = ymaps3.YMap; 265 var YMapDefaultSchemeLayer = ymaps3.YMapDefaultSchemeLayer; 266 var YMapDefaultFeaturesLayer = ymaps3.YMapDefaultFeaturesLayer; 267 var YMapFeature = ymaps3.YMapFeature; 268 var YMapMarker = ymaps3.YMapMarker; 269 var YMapControls = ymaps3.YMapControls; 270 271 var holder = document.createElement('div'); 272 holder.className = 'jb-map__canvas'; 273 root.appendChild(holder); 274 275 // ÐÑедпоÑиÑаем гÑаниÑÑ: каÑÑа Ñама подбеÑÑÑ Ð¼Ð°ÑÑÑаб под маÑÑÑÑÑ, 276 // и вид не поедеÑ, еÑли ÑоÑки позже поменÑÑÑÑÑ. center/zoom â 277 // запаÑной ваÑианÑ, еÑли гÑаниÑÑ Ð½Ðµ заданÑ. 278 var location = cfg.bounds 279 ? { bounds: cfg.bounds } 280 : { center: cfg.center, zoom: cfg.zoom }; 281 282 var map = new YMap(holder, { 283 location: location, 284 // каÑÑа в ÑÑÑеÑе â декоÑаÑивнаÑ, ÑÑÑаниÑÑ ÑкÑоллиÑÑ Ð½Ðµ меÑаем 285 behaviors: ['drag', 'pinchZoom', 'dblClick'] 286 }); 287 288 map.addChild(new YMapDefaultSchemeLayer({ 289 theme: 'dark', 290 customization: customization 291 })); 292 map.addChild(new YMapDefaultFeaturesLayer({})); 293 294 // ÐаÑÑÑÑÑ Ð¾Ñ Ð¼ÐµÑÑо до оÑиÑа â полилиÐ
294½Ð¸Ñ по ÑоÑкам из наÑÑÑоек. 295 if (cfg.route && cfg.route.length > 1) { 296 map.addChild(new YMapFeature({ 297 geometry: { type: 'LineString', coordinates: cfg.route }, 298 style: { 299 stroke: [{ color: cfg.routeColor, width: 4 }] 300 } 301 })); 302 } 303 304 if (cfg.office) { 305 map.addChild(new YMapMarker( 306 { coordinates: cfg.office, draggable: false }, 307 markerEl(cfg.officeLabel, 'office') 308 )); 309 } 310 311 if (cfg.metro) { 312 map.addChild(new YMapMarker( 313 { coordinates: cfg.metro, draggable: false }, 314 markerEl(cfg.metroLabel, 'metro') 315 )); 316 } 317 318 // ÐонÑÑÐ¾Ð»Ñ Ð½Ð°Ñ Ð¾Ð´ÑÑÑÑ Ñлева: ÑпÑава ÑазмеÑÐµÐ½Ñ ÑикÑиÑованнÑе кнопки 319 // ÑаÑа и «ÐавеÑÑ Â», коÑоÑÑе инаÑе пеÑеÑекаÑÑÑÑ Ñ ÐºÐ°ÑÑой. 320 if (controlsPkg && controlsPkg.YMapZoomControl && YMapControls) { 321 map.addChild( 322 new YMapControls({ position: 'left' }).addChild(new controlsPkg.YMapZoomControl({})) 323 ); 324 } 325 326 // ÐодпиÑи нÑÐ¶Ð½Ñ Ð¸ без пакеÑа конÑÑолов: логоÑип в копиÑайÑÐ°Ñ 327 // ÑиÑÑÐµÑ Ñам SDK, и он Ñоже пÑÐ¸Ñ Ð¾Ð´Ð¸Ñ Ð±ÐµÐ· доÑÑÑпного имени. 328 watchMapA11y(holder); 329 330 root.classList.remove('is-loading'); 331 root.classList.add('is-ready'); 332 }).catch(function (e) { 333 root.classList.remove('is-loading'); 334 root.classList.add('is-failed'); 335 started = false; 336 if (window.console) { 337 console.warn('[jb-map]', (e && e.message) ? e.message : e); 338 } 339 }); 340 } 341 342 /** 343 * СÑаÑÑ Ð¿Ð¾ пÑÐ¸Ð±Ð»Ð¸Ð¶ÐµÐ½Ð¸Ñ ÑÑÑеÑа. ÐÐ°Ð¿Ð°Ñ 600px беÑÑм Ñ ÑеÑÑÑÑÑ ÑÑоÑон, ÑÑÐ¾Ð±Ñ 344 * каÑÑа ÑÑпела поÑÑÑоиÑÑÑÑ Ð´Ð¾ Ñого, как попадÑÑ Ð² кадÑ. ÐаблÑдаÑÐµÐ»Ñ 345 * оÑклÑÑаеÑÑÑ Ð¿Ð¾Ñле пеÑвого ÑÑабаÑÑваниÑ: init() и Ñам заÑиÑÑн Ñлагом 346 * `started`, но деÑжаÑÑ Ð¶Ð¸Ð²ÑÑ Ð¿Ð¾Ð´Ð¿Ð¸ÑÐºÑ Ð½ÐµÐ·Ð°Ñем. 347 * 348 * Ðез IntersectionObserver (ÑÑаÑÑе бÑаÑзеÑÑ) поведение пÑежнее â 349 * иниÑиализаÑÐ¸Ñ ÑÑазÑ. 350 */ 351 if (typeof IntersectionObserver !== 'function') { 352 init(); 353 } else { 354 var observer = new IntersectionObserver(function (entries) { 355 for (var i = 0; i < entries.length; i++) { 356 if (entries[i].isIntersecting) { 357 observer.disconnect(); 358 init(); 359 return; 360 } 361 } 362 }, { rootMargin: '600px' }); 363 364 observer.observe(root); 365 } 366})();
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.