{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./js/lib.js","webpack:///./js/carousel.js","webpack:///./js/quiz.js","webpack:///./js/form.js","webpack:///./js/popup.js","webpack:///./index.js"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","0","exports","module","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","window","oldJsonpFunction","slice","getNode","selector","document","querySelector","getNodes","querySelectorAll","handleNodesClick","cb","forEach","addEventListener","e","viewPort","lib","embla","EmblaCarousel","loop","align","on","eventName","classList","remove","selectedScrollSnap","add","quiz","step","product","integration","delivery","takeaway","loyalty","ordersNumber","venuesNumber","price","prevStep","target","id","split","pop","option","btnDisabled","disabled","contains","showStep","scrollIntoView","behavior","dots","endButtons","style","display","includes","hidden","appPrice","sitePrice","loyaltyPrice","venues","Math","floor","venuesPrice","k","innerText","toLocaleString","nextStep","platform","validPhone","validEmail","phoneInput","val","preventDefault","masked","replace","mask","maskPhone","condition","setAttribute","validateForm","emailInput","str","test","formBtn","form","successMsg","errorMsg","xhr","password","XMLHttpRequest","open","setRequestHeader","obj","encodeURIComponent","join","serialize","email","phone","format","onreadystatechange","readyState","success","JSON","parse","responseText","send","popup","showPopup","overflowY","hidePopup","stopPropagation","popupContent","innerHTML","overlay","toggleMenu","menu","burger","close","node","top","getBoundingClientRect","pageYOffset","offset","navigator","userAgent","setTimeout","scrollTo","selectedAdvantage","selectedProduct","selectAdvantage","number","advantage","handleTab","opposite","left","opacity","activeNodes","innerWidth","lineLength","offsetWidth","round","ceil","reviewContainer","timer","setInterval","clearInterval","ext","timer2","changeTab","selectedProject","selectProject","offsetHeight","adv","oldY","keys","37","38","39","40","preventDefaultForScrollKeys","keyCode","supportsPassive","wheelOpt","passive","wheelEvent","createElement","disableScroll","enableScroll","removeEventListener","Stickyfill","matchMedia","matches","newY","bottom","clearTimeout","projectsTimer","projectsSection","carousel","scrollNext","scrollPrev","resizeLegalBlock","marginDeltaFirst","mainBlockParams","getElementsByTagName","mainBlockMargin","legalBlock","getElementById","legalBlockParams","marginDelta","width","calcMargin","err","console","log","legalMarginDelta","customResize"],"mappings":"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","file":"main.1009642b1d8ef6e09ef3.index.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t0: 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/landing-test/\";\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([123,1]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","const getNode = (selector) => document.querySelector(selector);\r\n\r\nconst getNodes = (selector) => document.querySelectorAll(selector);\r\n\r\nconst toggleVisibility = (node) => node.hidden = !node.hidden;\r\n\r\nconst handleNodesClick = (selector, cb) => {\r\n getNodes(selector).forEach(n => {\r\n n.addEventListener('click', e => {\r\n cb(e);\r\n });\r\n });\r\n}\r\n\r\nconst isMobile = () => /Mobile|webOS|BlackBerry|IEMobile|MeeGo|mini|Fennec|Windows Phone|Android|iP(ad|od|hone)/i.test(navigator.userAgent);\r\n\r\nexport {getNode, getNodes, toggleVisibility, handleNodesClick, isMobile}","import EmblaCarousel from 'embla-carousel'\r\nimport * as lib from './lib'\r\n\r\nconst wrap = lib.getNode('.embla')\r\nconst viewPort = wrap.querySelector(\".embla__viewport\");\r\nconst options = { loop: true, align: \"start\" }\r\n\r\nconst embla = EmblaCarousel(viewPort, options)\r\n\r\nembla.on('select', (eventName) => {\r\n lib.getNodes('.slide').forEach(n => {\r\n n.classList.remove('slide-active');\r\n });\r\n lib.getNode(`#slide_${embla.selectedScrollSnap() + 1}`).classList.add('slide-active');\r\n});\r\n\r\nexport {embla}","import * as lib from './lib'\r\n\r\nlet quiz = {\r\n step: 1,\r\n product: '',\r\n integration: 'iiko',\r\n delivery: true,\r\n takeaway: true,\r\n loyalty: false,\r\n ordersNumber: 0,\r\n venuesNumber: 0\r\n};\r\nlet price = 0;\r\n\r\nlib.handleNodesClick('.quiz-heading', e => {\r\n prevStep();\r\n});\r\n\r\nlib.handleNodesClick('#quiz-step-1 .btn', e => {\r\n quiz.product = e.target.id.split('-').pop();\r\n});\r\nlib.handleNodesClick('.quiz-radio', e => {\r\n quiz.integration = e.target.value;\r\n});\r\nlib.handleNodesClick('#quiz-step-3 .quiz-checkbox', e => {\r\n const option = e.target.id.split('-').pop();\r\n quiz[option] = !quiz[option];\r\n let btnDisabled = !quiz.delivery && !quiz.takeaway && !quiz.loyalty;\r\n if (quiz.product === 'all' && quiz.integration === 'iiko' && quiz.loyalty && !quiz.delivery && !quiz.takeaway) {\r\n btnDisabled = true;\r\n }\r\n lib.getNode(`#quiz-step-3 .quiz-forward`).disabled = btnDisabled;\r\n});\r\nlib.getNode('#orders-number').addEventListener('input', e => {\r\n quiz.ordersNumber = +e.target.value;\r\n lib.getNode(`#quiz-step-4 .quiz-forward`).disabled = !quiz.ordersNumber || !quiz.venuesNumber;\r\n if (quiz.ordersNumber) {\r\n if (!lib.getNode(`#quiz-dot-5`).classList.contains('quiz-dots-dot-active')) {\r\n lib.getNode(`#quiz-dot-5`).classList.add('quiz-dots-dot-active');\r\n lib.getNode(`#quiz-dot-line-5`).classList.add('quiz-dots-line-active');\r\n }\r\n } else {\r\n lib.getNode(`#quiz-dot-5`).classList.remove('quiz-dots-dot-active');\r\n lib.getNode(`#quiz-dot-line-5`).classList.remove('quiz-dots-line-active');\r\n }\r\n});\r\nlib.getNode('#venues-number').addEventListener('input', e => {\r\n quiz.venuesNumber = +e.target.value;\r\n lib.getNode(`#quiz-step-4 .quiz-forward`).disabled = !quiz.ordersNumber || !quiz.venuesNumber;\r\n});\r\nlib.handleNodesClick('.quiz-restart', e => {\r\n quiz.step = 1;\r\n lib.getNodes(`.quiz-dots-dot`).forEach(d => {\r\n if (d.id !== 'quiz-dot-1') {\r\n d.classList.remove('quiz-dots-dot-active');\r\n }\r\n });\r\n lib.getNodes(`.quiz-dots-line`).forEach(d => {\r\n d.classList.remove('quiz-dots-line-active');\r\n });\r\n showStep();\r\n});\r\nlib.handleNodesClick('.quiz-submit', e => {\r\n lib.getNode('#form').scrollIntoView({behavior: \"smooth\"});\r\n});\r\n\r\nconst showStep = () => {\r\n lib.getNodes('.quiz-step').forEach(n => n.classList.remove('quiz-step-active'));\r\n lib.getNode(`#quiz-step-${quiz.step}`).classList.add('quiz-step-active');\r\n const dots = lib.getNode('.quiz-dots');\r\n const endButtons = lib.getNode('.quiz-end-buttons');\r\n if (quiz.step === 3) {\r\n lib.getNode('#quiz-loyalty + label')\r\n .style.display = !['app', 'all'].includes(quiz.product) || quiz.integration !== 'iiko' ? 'none' : 'flex';\r\n }\r\n if (quiz.step === 5) {\r\n lib.getNode('#quiz-payment-bank').style.display = 'flex';\r\n dots.style.display = 'none';\r\n endButtons.hidden = false;\r\n let appPrice = 0;\r\n let sitePrice = 0;\r\n if (quiz.product === 'app' || quiz.product === 'all') {\r\n lib.getNode('#quiz-payment-appstore').style.display = 'flex';\r\n if (quiz.integration === 'iiko') {\r\n lib.getNode('#quiz-payment-app').style.display = 'flex';\r\n\r\n let loyaltyPrice = 0;\r\n if (quiz.loyalty) {\r\n\r\n if (quiz.product === 'app' && !quiz.delivery && !quiz.takeaway) {\r\n lib.getNode('#quiz-payment-bank').style.display = 'none';\r\n }\r\n\r\n loyaltyPrice = 2990;\r\n let venues = quiz.venuesNumber - 1;\r\n loyaltyPrice += Math.floor(venues / 10) * 7990;\r\n venues = venues % 10;\r\n if (venues > 2) {\r\n loyaltyPrice += Math.floor(venues / 3) * 2790;\r\n venues = venues % 3;\r\n }\r\n if (venues > 0) {\r\n loyaltyPrice += venues * 990;\r\n }\r\n }\r\n\r\n let venuesPrice = 0;\r\n if (quiz.delivery || quiz.takeaway) {\r\n venuesPrice = 9990;\r\n let venues = quiz.venuesNumber - 3;\r\n if (venues > 2) {\r\n venuesPrice += Math.floor(venues / 3) * 7990;\r\n venues = venues % 3;\r\n }\r\n if (venues > 0) {\r\n venuesPrice += venues * 2990;\r\n }\r\n }\r\n\r\n appPrice = loyaltyPrice + venuesPrice;\r\n } else {\r\n lib.getNode('#quiz-payment-app').style.display = 'none';\r\n if (quiz.integration === 'poster') {\r\n appPrice = 6990;\r\n let venues = quiz.venuesNumber - 2;\r\n if (venues > 0) {\r\n appPrice += venues * 3000;\r\n }\r\n } else {\r\n const k = quiz.delivery ? 8 : 2;\r\n appPrice = quiz.ordersNumber * 30 * k;\r\n }\r\n }\r\n } else {\r\n lib.getNode('#quiz-payment-appstore').style.display = 'none';\r\n lib.getNode('#quiz-payment-app').style.display = 'none';\r\n }\r\n\r\n if (['app', 'all'].includes(quiz.product) && !['iiko', 'poster'].includes(quiz.integration)) {\r\n lib.getNode('#quiz-payment-monthly').style.display = 'flex';\r\n } else {\r\n lib.getNode('#quiz-payment-monthly').style.display = 'none';\r\n }\r\n\r\n if (quiz.product === 'site' || quiz.product === 'all') {\r\n lib.getNode('#quiz-payment-site').style.display = 'flex';\r\n lib.getNode('#quiz-payment-domain').style.display = 'flex';\r\n const k = quiz.delivery ? 32 : 8;\r\n sitePrice += quiz.ordersNumber * 30 * 0.8 * k;\r\n } else {\r\n lib.getNode('#quiz-payment-site').style.display = 'none';\r\n lib.getNode('#quiz-payment-domain').style.display = 'none';\r\n }\r\n\r\n price = appPrice + sitePrice;\r\n if (price > 50000 && !['iiko', 'poster'].includes(quiz.integration)) {\r\n lib.getNode('.quiz-negotiate').style.display = 'block';\r\n } else {\r\n lib.getNode('.quiz-negotiate').style.display = 'none';\r\n }\r\n } else {\r\n lib.getNode('.quiz-negotiate').style.display = 'none';\r\n lib.getNode(`#quiz-dot-5`).classList.remove('quiz-dots-dot-active');\r\n lib.getNode(`#quiz-dot-line-5`).classList.remove('quiz-dots-line-active');\r\n dots.style.display = 'flex';\r\n endButtons.hidden = true;\r\n }\r\n const headings = [\r\n 'Что запускаем?',\r\n 'Какую кассовую систему используем?',\r\n 'Что включаем?',\r\n 'Сколько заказов в день?'\r\n ]\r\n const headingNode = lib.getNode('.quiz-heading');\r\n headingNode.innerText = quiz.step === 5 ? `~ ${price.toLocaleString()} ₽/месяц` : headings[quiz.step - 1];\r\n}\r\n\r\nconst nextStep = () => {\r\n quiz.step++;\r\n showStep();\r\n if (quiz.step === 2) {\r\n lib.getNode('.quiz-heading').classList.add('quiz-heading-with-arrow');\r\n }\r\n let step = quiz.step === 5 ? 6 : quiz.step;\r\n lib.getNode(`#quiz-dot-${step}`).classList.add('quiz-dots-dot-active');\r\n if (quiz.step < 2) return;\r\n lib.getNode(`#quiz-dot-line-${step}`).classList.add('quiz-dots-line-active');\r\n}\r\n\r\nconst prevStep = () => {\r\n lib.getNode(`#quiz-dot-${quiz.step}`).classList.remove('quiz-dots-dot-active');\r\n lib.getNode(`#quiz-dot-line-${quiz.step}`).classList.remove('quiz-dots-line-active');\r\n if (quiz.step === 5) {\r\n lib.getNode(`#quiz-dot-6`).classList.remove('quiz-dots-dot-active');\r\n lib.getNode(`#quiz-dot-line-6`).classList.remove('quiz-dots-line-active');\r\n }\r\n quiz.step--;\r\n showStep();\r\n if (quiz.step === 1) {\r\n lib.getNode('.quiz-heading').classList.remove('quiz-heading-with-arrow');\r\n }\r\n}\r\n\r\nlib.handleNodesClick('#quiz-step-1 .btn', e => {\r\n quiz.platform = e.target.id.split('-').pop();\r\n nextStep();\r\n});\r\n\r\nlib.handleNodesClick('.quiz-forward', e => {\r\n nextStep();\r\n});","import * as lib from './lib'\r\n\r\nlet validPhone = false;\r\nlet validEmail = true;\r\n\r\nconst phoneInput = lib.getNode('#phone-input');\r\nphoneInput.addEventListener('input', e => {\r\n const val = e.target.value;\r\n if (val.length < 4 || (val.length === 5 && ['7', '8'].includes(e.target.value.slice(-1)))) {\r\n e.preventDefault();\r\n e.target.value = '+7 ('\r\n } else {\r\n e.target.value = maskPhone(val);\r\n }\r\n lib.getNode('.form-phone-bg').innerText = e.target.value + '+7 (___) ___-__-__'.slice(e.target.value.length);\r\n});\r\n\r\nfunction maskPhone(val) {\r\n let masked = '';\r\n if (val.length === 1) {\r\n if (!['+', '7', '8'].includes(val[0])) {\r\n masked = `+7 (${val}`;\r\n } else if (['7', '8'].includes(val[0])) {\r\n masked = `+7 (${val.slice(1)}`;\r\n } else if (val[0] === '+') {\r\n masked = '+';\r\n }\r\n } else {\r\n masked = val.replace(/\\D/g, '');\r\n const mask = '+7 (###) ###-##-##';\r\n for (let i in mask) {\r\n i = +i;\r\n if (masked.length >= i && mask[i] !== masked[i] && mask[i] !== '#') {\r\n masked = masked.slice(0, i) + mask[i] + masked.slice(i);\r\n }\r\n }\r\n if (masked[masked.length - 1] === '-') {\r\n masked = masked.slice(0, -1);\r\n } else if (masked[masked.length - 1] === ' ') {\r\n masked = masked.slice(0, -2);\r\n }\r\n }\r\n return masked;\r\n}\r\n\r\nphoneInput.addEventListener('blur', e => {\r\n const condition = e.target.value.length === 18;\r\n lib.getNode('#phone-error').style.display = condition ? 'none' : 'block';\r\n phoneInput.setAttribute('valid', condition);\r\n validPhone = condition;\r\n validateForm();\r\n});\r\n\r\nconst emailInput = lib.getNode('#email-input');\r\nemailInput.addEventListener('blur', e => {\r\n const str = e.target.value;\r\n const condition = !str || /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,4}$/.test(str);\r\n lib.getNode('#email-error').style.display = condition ? 'none' : 'block';\r\n emailInput.setAttribute('valid', condition);\r\n validEmail = condition;\r\n validateForm();\r\n});\r\n\r\nconst formBtn = lib.getNode('#form-btn');\r\nfunction validateForm() {\r\n formBtn.disabled = !(validPhone && validEmail);\r\n}\r\nconst form = lib.getNode('.form');\r\nconst successMsg = lib.getNode('.form-success');\r\nconst errorMsg = lib.getNode('.form-error');\r\nlet xhr = null;\r\n\r\nfunction serialize(obj) {\r\n let str = [];\r\n for (let p in obj) if (obj.hasOwnProperty(p)) {\r\n str.push(encodeURIComponent(p) + \"=\" + encodeURIComponent(obj[p]));\r\n }\r\n return str.join(\"&\");\r\n}\r\n\r\nlib.handleNodesClick('#form-btn', e => {\r\n e.preventDefault();\r\n\r\n // antispam, password is actually honeypot\r\n if (xhr || form.password.value) {\r\n return;\r\n }\r\n\r\n xhr = new XMLHttpRequest();\r\n xhr.open(\"POST\", \"https://rbcn.mobi/iiko_biz_submit?short_response=1\");\r\n xhr.setRequestHeader(\"Content-Type\", \"application/x-www-form-urlencoded;charset=utf-8\");\r\n let data = serialize({\r\n \"email\": form.email.value,\r\n \"phone\": form.phone.value,\r\n \"name\": form.name.value,\r\n \"format\": form.format.value\r\n });\r\n\r\n xhr.onreadystatechange = function () {\r\n if (xhr.readyState == 4) {\r\n const success = JSON.parse(xhr.responseText);\r\n form.style.display = 'none';\r\n if (success) {\r\n successMsg.style.display = 'block';\r\n } else {\r\n errorMsg.style.display = 'block';\r\n }\r\n xhr = null;\r\n }\r\n };\r\n xhr.send(data);\r\n});\r\n\r\nlib.handleNodesClick('#form-return', () => {\r\n form.style.display = 'block';\r\n errorMsg.style.display = 'none';\r\n});","import * as lib from './lib'\r\n\r\nconst popup = lib.getNode('.popup');\r\nfunction showPopup() {\r\n popup.style.display = 'flex';\r\n const body = lib.getNode('body');\r\n body.style.overflowY = 'hidden';\r\n}\r\nfunction hidePopup() {\r\n popup.style.display = 'none';\r\n const body = lib.getNode('body');\r\n body.style.overflowY = 'scroll';\r\n}\r\nlib.handleNodesClick('.popup-close-btn', () => {\r\n hidePopup();\r\n});\r\nlib.handleNodesClick('.popup-container', e => {\r\n e.stopPropagation();\r\n});\r\nlib.handleNodesClick('.popup', () => {\r\n hidePopup();\r\n});\r\nconst popupContent = lib.getNode('.popup-content');\r\n\r\nlib.handleNodesClick('#footer-docs', () => {\r\n popupContent.innerHTML = `\r\n

Документация

\r\n \r\n
\r\n

\r\n Руководство пользователя ПО Rubeacon\r\n Просмотреть\r\n

\r\n

\r\n Жизненный цикл ПО Rubeacon\r\n Просмотреть\r\n

\r\n

\r\n Документация, содержащая описание технических средств хранения исходного текста и объектного кода программного обеспечения, а также технических средств компиляции исходного текста в объектный код программного обеспечения\r\n Просмотреть\r\n

\r\n

\r\n Описание технической архитектуры ПО Rubeacon\r\n Просмотреть\r\n

\r\n

\r\n Описание функциональных характеристик ПО Rubeacon\r\n Просмотреть\r\n

\r\n \r\n
\r\n `;\r\n showPopup();\r\n});\r\n\r\nlib.handleNodesClick('#consent', () => {\r\n popupContent.innerHTML = `\r\n

Согласие на обработку персональных данных

\r\n \r\n
\r\n

\r\n Я даю свое Согласие Обществу с ограниченной ответственностью «РуБикон» (ИНН/КПП: 7728881950/771001001, ОГРН\r\n 1147746697075) и организациям, привлекаемым ООО «РуБикон» на договорной основе (далее по тексту – ООО «РуБикон», на\r\n обработку своих персональных данных в сервисе обратной связи и технической поддержки Pyrus, куда заявки попадают\r\n посредством отправки письма по email на адрес help@ru-beacon.ru в соответствии с Федеральным законом от 27.02.2006 №\r\n 152-ФЗ «О персональных данных» (далее по тексту – Согласие на обработку ПД). Мое Согласие на обработку ПД включает в\r\n том числе возможность автоматизированной обработки ООО «РуБикон» моих персональных данных.\r\n

\r\n \r\n

\r\n Я ознакомлен(а), что под обработкой персональных данных в указанном законе понимаются действия (операции) с\r\n персональными данными, включая сбор, запись, систематизацию, накопление, хранение, уточнение (обновление,\r\n изменение), извлечение, использование, передачу (распространение, предоставление, доступ), обезличивание,\r\n блокирование, удаление, уничтожение персональных данных.\r\n

\r\n \r\n

\r\n Разрешаю обработку моих персональных данных ООО «РуБикон» в целях:\r\n
\r\n 1. оказания консультаций по программному обеспечению созданного ООО «РуБикон» мобильного приложения и партнерского\r\n программного обеспечения, а также оказания иных услуг, выполнения работ по направляемому мной обращению;\r\n
\r\n 2. возможного информировании меня о продуктах и услугах, предложения мне продуктов и услуг ООО «РуБикон»;\r\n
\r\n 3. в целях участия в опросах/анкетировании, проводимых ООО «РуБикон» для изучения и исследования мнения клиентов о\r\n качестве обслуживания и услугах/работах ООО «РуБикон».\r\n

\r\n \r\n

\r\n Гарантирую, что представленная мной информация является полной, точной и достоверной в запрашиваемых ООО «РуБикон»\r\n пределах, а также, что при представлении информации не нарушаются действующее законодательство Российской Федерации,\r\n законные права и интересы третьих лиц. Вся представленная информация заполнена мною в отношении себя лично.\r\n

\r\n \r\n

\r\n Настоящее согласие действует в течение всего периода хранения персональных данных, если иное не предусмотрено\r\n законодательством Российской Федерации.\r\n

\r\n
\r\n `;\r\n showPopup();\r\n});\r\n\r\nlib.handleNodesClick('#privacy', () => {\r\n popupContent.innerHTML = `\r\n

Политика конфиденциальности персональной информации пользователей

\r\n \r\n
\r\n
\r\n

\r\n Политика конфиденциальности персональной информации (далее — Политика) действует в отношении любой информации,\r\n которую Общество с ограниченной ответственностью «РуБикон» (ИНН/КПП: 7728881950/771001001, ОГРН 1147746697075,\r\n расположенное по адресу 123056, Россия, г. Москва, ул. 2-я Брестская, д. 19/18с5) и/или его\r\n контрагенты\r\n в рамках договорных отношений с ООО «РуБикон» (далее по тексту – RuBeacon) может получить во время правомерного\r\n использования Пользователем Приложений, программного обеспечения и компьютерных информационных сервисов RuBeacon\r\n (далее по тексту - ПО RuBeacon), а так же в ходе исполнения RuBeacon любых соглашений, договоров, контрактов с\r\n Пользователем.\r\n

\r\n

\r\n Правила настоящей «Политики конфиденциальности персональной информации пользователей» (далее по тексту –\r\n Политика\r\n конфиденциальности или Политика) применяются в отношении любого программного обеспечения, приложений,\r\n публикуемых и\r\n выпускаемых под товарным знаком «RuBeacon», а также любые иные компьютерные сервисы и интернет-сайты, владельцем\r\n которых является ООО «РуБикон».\r\n

\r\n

\r\n Согласие Пользователя с настоящей Политикой конфиденциальности, выраженное им в рамках отношений с ООО\r\n «РуБикон»,\r\n распространяется на всех его контрагентов в рамках договорных отношений с ООО «РуБикон», правомерно использующих\r\n Приложения, программное обеспечение и информационные сервисы RuBeacon.\r\n

\r\n

\r\n Использование ПО RuBeacon означает безоговорочное согласие Пользователя с настоящей Политикой и указанными в ней\r\n условиями и порядком обработки его персональной информации.\r\n

\r\n

\r\n В случае несогласия с этими условиями Пользователь должен отказаться от использования ПО RuBeacon.\r\n

\r\n
\r\n \r\n
\r\n \r\n 1. Персональная информация Пользователей, которую обрабатывает или может обрабатывать RuBeacon.

\r\n 1.1. В рамках настоящей Политики под «персональной информацией Пользователя» понимаются:

\r\n \r\n 1.1.1. Персональная информация, которую Пользователь предоставляет о себе самостоятельно при создании учётной записи\r\n (регистрации) или в процессе использования ПО RuBeacon, в том числе персональные данные Пользователя. Обязательная для\r\n предоставления ПО RuBeacon информация имеет специальную отметку. Прочая информация предоставляется Пользователем на\r\n усмотрение Пользователя.

\r\n \r\n 1.1.2. Данные, которые автоматически передаются ПО RuBeacon в процессе их использования с помощью установленного на\r\n устройстве Пользователя программного обеспечения, в том числе:

\r\n \r\n 1) IP-адрес (если применимо);

\r\n \r\n 2) данные файлов cookie (если применимо);

\r\n \r\n 3) информация о браузере Пользователя или иной программе, с помощью которой осуществляется доступ к ПО RuBeacon (если\r\n применимо);

\r\n \r\n 4) технические характеристики оборудования и программного обеспечения, используемых Пользователем (если применимо);

\r\n \r\n 5) дата и время доступа к ПО RuBeacon (если применимо);

\r\n \r\n 6) адреса запрашиваемых страниц (если применимо);

\r\n \r\n 7) территориальное местонахождение Пользователя в определённом месте в определенное время суток (если применимо);

\r\n \r\n 8) Скриншоты экрана Пользователя при возникновении ошибок могут автоматически отправляться RuBeacon для последующего\r\n устранения ошибок ПО RuBeacon и/или в статистических целях (если применимо);

\r\n \r\n 9) и иная информация, необходимая для полноценного функционирования, соответствующего ПО RuBeacon;

\r\n \r\n 1.1.3. Иная информация о Пользователе, обработка которой предусмотрена условиями использования ПО RuBeacon.

\r\n \r\n 1.2. Настоящая Политика применима только к информации, обрабатываемой в ходе использования ПО RuBeacon. RuBeacon не\r\n контролирует и не несет ответственность за обработку информации программным обеспечением и информационными сервисами\r\n третьих лиц.

\r\n \r\n 1.3. RuBeacon исходит из того, что Пользователь при использовании ПО RuBeacon предоставляет достоверную и достаточную\r\n персональную информацию и поддерживает такую информацию в актуальном состоянии. В случае предоставления Пользователем\r\n недостоверной или недостаточной информации вся ответственность за неработоспособность ПО RuBeacon или иные технические\r\n или юридические риски несет Пользователь.

\r\n \r\n
\r\n \r\n 2. Цели обработки персональной информации Пользователей.

\r\n \r\n 2.1. RuBeacon собирает и хранит только ту персональную информацию, которая необходима для использования ПО RuBeacon или\r\n исполнения соглашений, договоров, контрактов с Пользователем, за исключением случаев, когда применимым законодательством\r\n предусмотрено обязательное хранение персональной информации в течение определенного законодательством срока.

\r\n \r\n 2.2. Персональную информацию Пользователя RuBeacon обрабатывает в следующих целях:

\r\n \r\n 2.2.1. Идентификация пользователя в рамках использования ПО RuBeacon, а так же в рамках соглашений, договоров,\r\n контрактов с RuBeacon (если применимо);

\r\n \r\n 2.2.2. Предоставление Пользователю возможности использовать ПО RuBeacon персонализировано, а также исполнение\r\n соглашений, договоров, контрактов с RuBeacon (если применимо);

\r\n \r\n 2.2.3. Связь с Пользователем, в том числе направление уведомлений, запросов и информации, касающихся использования ПО\r\n RuBeacon и при исполнения соглашений, договоров, контрактов с RuBeacon (если применимо), а также обработка заявок,\r\n запросов, обращений от Пользователя (если применимо);

\r\n \r\n 2.2.4. Улучшение качества ПО RuBeacon, удобства его использования, разработка нового ПО RuBeacon;

\r\n \r\n 2.2.5. Таргетирование рекламной информации (если применимо);

\r\n \r\n 2.2.6. Проведение статистических и иных исследований, на основе обезличенных персональных данных (если применимо).

\r\n \r\n
\r\n \r\n \r\n 3. Условия обработки персональной информации Пользователей и её передача третьим лицам.

\r\n \r\n 3.1. RuBeacon хранит персональную информацию Пользователей в соответствии с полученным от Пользователя соответствующим\r\n согласием на обработку персональной информации для конкретного ПО RuBeacon.

\r\n \r\n 3.2. В отношении персональной информации Пользователя сохраняется конфиденциальность такой персональной информации,\r\n кроме случаев, когда Пользователь добровольно предоставил такую информацию о себе для общего доступа неограниченному\r\n кругу лиц. В таком случае, при использовании некоторых сервисов и функций ПО RuBeacon, Пользователь соглашается с тем,\r\n что определённая часть его персональной информации становится общедоступной.

\r\n \r\n 3.3. Пользователь соглашается с тем, что RuBeacon вправе передать персональную информацию Пользователя третьим лицам в\r\n следующих случаях:

\r\n \r\n 3.3.1. Пользователь выразил согласие на такие действия;

\r\n \r\n 3.3.2. Передача необходима для использования Пользователем определенного Сервиса либо функции ПО RuBeacon, либо для\r\n исполнения определенного соглашения, договора, контракта с Пользователем;

\r\n \r\n 3.3.8. Передача предусмотрена российским или иным применимым законодательством в рамках установленной соответствующим\r\n законодательством процедуры;

\r\n \r\n 3.3.9. Такая передача происходит в рамках продажи или иной передачи бизнеса (полностью или частично), при этом к\r\n приобретателю переходят все обязательства по соблюдению условий настоящей Политики применительно к полученной им\r\n персональной информации;

\r\n \r\n 3.3.10. В целях обеспечения возможности защиты прав и законных интересов RuBeacon или третьих лиц в случаях, когда\r\n Пользователь нарушает Пользовательское соглашение соответствующего ПО RuBeacon, настоящую Политику, либо иные документы,\r\n содержащие условия использования конкретного ПО RuBeacon (если применимо).

\r\n \r\n 3.3.11. В результате обработки персональной информации Пользователя путем ее обезличивания получены обезличенные\r\n статистические данные, которые передаются третьему лицу для проведения исследований, выполнения работ или оказания услуг\r\n по поручению RuBeacon.

\r\n \r\n 3.4. При обработке персональных данных Пользователей RuBeacon руководствуется Федеральным законом РФ «О персональных\r\n данных» и иным применимым законодательством.

\r\n \r\n
\r\n \r\n 4. Изменение и удаление персональной информации. Обязательное хранение данных.

\r\n \r\n 4.1. Пользователь может по своему усмотрению в любой момент изменить (обновить, дополнить) предоставленную им\r\n персональную информацию или её часть, воспользовавшись функцией редактирования персональных данных в соответствующем\r\n разделе ПО RuBeacon.

\r\n \r\n 4.2. Пользователь также может удалить предоставленную им персональную информацию в рамках использования соответствующего\r\n ПО RuBeacon, отправив соответствующее уведомление на почту help@ru-beacon.ru. При этом удаление аккаунта/личного\r\n кабинета может повлечь невозможность использования ПО RuBeacon.

\r\n \r\n 4.3. Права, предусмотренные пп. 4.1. и 4.2. настоящей Политики могут быть ограничены в соответствии с требованиями\r\n применимого законодательства. В частности, такие ограничения могут предусматривать обязанность RuBeacon сохранить\r\n измененную или удаленную Пользователем информацию на срок, установленный законодательством, и передать такую информацию\r\n в соответствии с законодательно установленной процедурой государственному органу.

\r\n \r\n
\r\n \r\n \r\n 5. Обработка персональной информации при помощи файлов Cookie и счетчиков (если применимо).

\r\n \r\n 5.1. Файлы cookie, передаваемые ПО RuBeacon оборудованию Пользователя и оборудованием Пользователя в RuBeacon, могут\r\n использоваться RuBeacon для предоставления Пользователю персонализированных Сервисов и функций ПО RuBeacon, для\r\n персонализации рекламы, которая может показываться Пользователю, в статистических и исследовательских целях, а также для\r\n улучшения cервисов и функций ПО RuBeacon.

\r\n \r\n 5.2. Пользователь осознает, что оборудование и программное обеспечение, используемые им для использования ПО RuBeacon\r\n могут обладать функцией запрещения операций с файлами cookie (для любых сайтов или для определенных сайтов), а также\r\n удаления ранее полученных файлов cookie.

\r\n \r\n 5.3. RuBeacon вправе определить, что предоставление определенного сервиса или функции возможно лишь при условии, что\r\n прием и получение файлов cookie разрешены Пользователем.

\r\n \r\n 5.4. Содержание, структура, технические параметры файла cookie определяются RuBeacon по своему усмотрению и могут\r\n изменяться без предварительного уведомления Пользователя в любое время.

\r\n \r\n 5.5. (Если применимо) Счетчики, размещенные RuBeacon в ПО RuBeacon, могут использоваться для анализа файлов cookie\r\n Пользователя, для сбора, обработки и передачи RuBeacon статистической информации об использовании ПО RuBeacon, а также\r\n для обеспечения работоспособности Сервисов в целом или их отдельных функций в частности. Технические параметры работы\r\n счетчиков определяются RuBeacon и могут изменяться RuBeacon по своему усмотрению в любое время без предварительного\r\n уведомления Пользователя.

\r\n \r\n
\r\n \r\n 6. Меры, применяемые для защиты персональной информации Пользователя.

\r\n \r\n 6.1. RuBeacon принимает все необходимые технические и организационные меры для защиты персональной информации\r\n Пользователя от неправомерного или случайного доступа, уничтожения, изменения, блокирования, копирования,\r\n распространения, а также от иных неправомерных действий с ней третьих лиц.

\r\n \r\n
\r\n \r\n 7. Изменение Политики конфиденциальности. Применимое законодательство.

\r\n \r\n 7.1. RuBeacon имеет право вносить изменения в настоящую Политику конфиденциальности в любое время по своему усмотрению\r\n согласно требованиям применимого законодательства. При внесении изменений в актуальной редакции указывается дата\r\n последнего обновления. Новая редакция Политики вступает в силу с момента ее публикации на сайте RuBeacon\r\n (http://rbcn.mobi/), если иное не предусмотрено новой редакцией Политики.

\r\n \r\n 7.2. К настоящей Политике и отношениям между Пользователем и RuBeacon, возникающим в связи с применением Политики\r\n конфиденциальности, подлежит применению право Российской Федерации.

\r\n \r\n
\r\n \r\n 8. Обратная связь. Вопросы и предложения.

\r\n \r\n 8.1. Все предложения или вопросы по поводу настоящей Политики Пользователь вправе направлять в Службу поддержки\r\n пользователей RuBeacon по email на адрес help@ru-beacon.ru.

\r\n
\r\n `;\r\n showPopup();\r\n});\r\n\r\nlib.handleNodesClick('#payment-rules', () => {\r\n popupContent.innerHTML = `\r\n

Оплата с помощью банковской карты через «Альфа-Банк».

\r\n \r\n
\r\n

\r\n Оплата предоставляется без комиссии. Платежи осуществляются перечислением денежных средств с\r\n банковских карт VISA и MASTERCARD при наличии возможности совершения интернет-платежей,\r\n предоставленных Вашим банком, выпустившим банковскую карту. О наличии возможности совершения\r\n интернет-платежей с использованием банковской карты, Вы можете узнать, обратившись в ваш банк.\r\n Ввод данных банковской карты осуществляется на защищенной платежной странице банка-партнера,\r\n предоставляющего услугу. Банком-партнером ООО «РуБикон» является ОАО «Альфа-Банк».\r\n

\r\n \r\n

Конфиденциальность

\r\n

\r\n 1) Услуга оплаты через интернет осуществляется в соответствии с Правилами международных\r\n платежных систем на принципах соблюдения конфиденциальности и безопасности совершения платежа,\r\n для чего используются самые современные методы проверки, шифрования и передачи данных по\r\n закрытым каналам связи.\r\n

\r\n

\r\n 2) Ввод данных банковской карты осуществляется на защищенной платежной странице банка-партнера,\r\n предоставляющего Услугу.\r\n

\r\n \r\n

Случаи отказа в совершении платежа:

\r\n

\r\n • банковская карта не предназначена для совершения платежей через интернет, о чем можно узнать,\r\n осведомившись в Вашем Банке;\r\n

\r\n

\r\n • данные банковской карты введены неверно;\r\n

\r\n

\r\n истек срок действия банковской карты. Срок действия карты, как правило, указан на лицевой\r\n стороне карты (это месяц и год, до которого действительна карта). Подробнее о сроке действия\r\n карты Вы можете узнать, обратившись в банк, выпустивший банковскую карту;\r\n

\r\n

\r\n • недостаточно средств для оплаты на банковской карте. Подробнее о наличии средств на\r\n банковской карте Вы можете узнать, обратившись в банк, выпустивший банковскую карту;\r\n

\r\n

\r\n • превышен установленный лимит операций за день. Сумма ежедневного лимита для всех операций\r\n определяется банком-партнером.\r\n

\r\n \r\n

\r\n Для корректного ввода необходимо внимательно и точно, соблюдая последовательность цифр и\r\n букв, ввести данные так, как они указаны на Вашей карте:\r\n

\r\n

\r\n владелец карты (как правило, указан на лицевой стороне банковской карты на английском языке\r\n заглавными буквами. Например, IVANOV IVAN);\r\n

\r\n

\r\n 2. номер карты (как правило, указан на лицевой стороне банковской карты и состоит из 16-и\r\n цифр. Например: 0123 4567 8901 2345);\r\n

\r\n

\r\n 3. срок действия карты (как правило, указан на лицевой стороне банковской карты - месяц и\r\n год, до которого действительна карта. Срок действия карты вводится цифрами. Например, 12\r\n (вводится в поле месяца) и 13 (вводится в поле года), что означает, что карта действительна\r\n до декабря 2013 года);\r\n

\r\n

\r\n 4. CVV2 или CVC2 код карты (как правило, указан на обратной стороне банковской карты и\r\n состоит из 3-х цифр. Например, 123).\r\n

\r\n
\r\n `;\r\n showPopup();\r\n});\r\n\r\n\r\nlib.handleNodesClick('#legal-information-footer, #legal-information-header, #legal-information-header-tablet', () => {\r\n popupContent.innerHTML = `\r\n

Правовая информация

\r\n \r\n
\r\n

ООО “Рубикон” - российская ИТ-компания, работающая с 2014 года. Мы разрабатываем ПО для заведений общественного питания и служб доставки, состоим в списке непрерывно действующих организаций и осуществляем техническую ИТ-поддержку организаций общественного питания, обеспечивающих население продуктами питания и товарами первой необходимости.

\r\n

Реализуем экземпляры программного продукта, разработанные ООО “Рубикон”, и предоставляем права на использование, в том числе путем предоставления удаленного доступа к программам и базам данных, включая их обновление и дополнительные функциональные возможности через информационно-телекоммуникационную сеть \"Интернет\".

\r\n

Выполняем работы по разработке, адаптации и модификации, а также работы по установке, тестированию и сопровождению программного продукта.

\r\n \r\n

О компании:

\r\n

Общество с ограниченной ответственностью «РуБикон»\r\nОГРН 1147746697075 \r\nИНН 7728881950\r\nКПП 771001001\r\nГенеральный директор: Парфенов И.С.

\r\n

ООО “Рубикон” внесен в список аккредитованных ИТ-компаний № 11012 от 26.12.2019 г.

\r\n

Основной вид деятельности:\r\nОКВЭД: 63.11.1 Деятельность по созданию и использованию баз данных и информационных ресурсов

\r\n

Дополнительные виды деятельности:\r\n62.01 Разработка компьютерного программного обеспечения\r\n62.09 Деятельность, связанная с использованием вычислительной техники и информационных технологий, прочая\r\n63.11 Деятельность по обработке данных, предоставление услуг по размещению информации и связанная с этим деятельность

\r\n
\r\n `;\r\n showPopup();\r\n});","import './styles/index.scss';\r\nimport * as lib from './js/lib'\r\nimport * as carousel from './js/carousel'\r\nimport './js/quiz'\r\nimport './js/form'\r\nimport './js/popup'\r\nimport * as Stickyfill from \"stickyfilljs\";\r\n\r\nconst overlay = lib.getNode('.overlay');\r\nconst toggleMenu = () => {\r\n const menu = lib.getNode('.menu');\r\n const burger = lib.getNode('.menu-burger');\r\n const close = lib.getNode('.menu-close');\r\n [overlay, menu, burger, close].forEach(n => {\r\n lib.toggleVisibility(n)\r\n });\r\n const body = lib.getNode('body');\r\n body.style.overflowY = !overlay.hidden ? 'hidden' : 'scroll';\r\n}\r\nconst menuTrigger = lib.getNode('.menu-trigger');\r\nmenuTrigger.addEventListener('click', toggleMenu);\r\noverlay.addEventListener('click', toggleMenu);\r\nlib.handleNodesClick('.menu-link', e => {\r\n if (!overlay.hidden) toggleMenu();\r\n const id = e.target.id.split('-')[0];\r\n const top = lib.getNode(`#${id}`).getBoundingClientRect().top + window.pageYOffset;\r\n const offset = lib.isMobile() ? 100 : 20;\r\n setTimeout(() => {\r\n window.scrollTo({top: top - offset, behavior: \"smooth\"});\r\n }, 200);\r\n});\r\nlib.handleNodesClick('.menu-btn', e => {\r\n if (!overlay.hidden) toggleMenu();\r\n const top = lib.getNode(`#form`).getBoundingClientRect().top + window.pageYOffset;\r\n setTimeout(() => {\r\n window.scrollTo({top: top - 100, behavior: \"smooth\"});\r\n }, 200);\r\n});\r\nlib.handleNodesClick('.navbar-logo', e => {\r\n window.scrollTo({top: 0, behavior: \"smooth\"});\r\n});\r\n\r\nlet selectedAdvantage = 1;\r\nlet selectedProduct = 'app';\r\nconst selectAdvantage = (product, number) => {\r\n selectedAdvantage = number;\r\n selectedProduct = product;\r\n lib.getNodes('.advantage-active').forEach(n => {\r\n n.classList.remove('advantage-active');\r\n });\r\n const advantage = lib.getNode(`#${product}-advantage-${number}`);\r\n if (!advantage) return;\r\n advantage.classList.add('advantage-active');\r\n lib.getNode(`#${product}-advantage-mark`).style.top = `${(number-1)*77.66666666666667}px`;\r\n if (product === 'app') {\r\n lib.getNode('#app_screen_1').innerHTML = `\r\n \r\n \r\n \"приложение\r\n `;\r\n lib.getNode('#app_screen_2').innerHTML = `\r\n \r\n \r\n \"приложение\r\n `;\r\n } else {\r\n if (+number < 6) {\r\n lib.getNode('.advantage-screens-site').innerHTML = `\r\n \r\n \r\n \r\n \"десктоп\"\r\n \r\n \r\n \r\n \r\n \"сайт\"\r\n \r\n `;\r\n } else {\r\n lib.getNode('.advantage-screens-site').innerHTML = `\r\n \r\n \r\n \r\n \"приложение\r\n \r\n \r\n \r\n \r\n \"приложение\r\n \r\n `;\r\n }\r\n }\r\n}\r\n\r\nconst handleTab = product => {\r\n const opposite = product === 'app' ? 'site' : 'app';\r\n const tab = lib.getNode(`#${product}-tab`);\r\n tab.addEventListener('click', (e) => {\r\n lib.getNode('.advantages-tab-active').classList.remove('advantages-tab-active');\r\n e.target.classList.add('advantages-tab-active');\r\n lib.getNode('.advantages-tabs-line-active').style.left = product === 'app' ? '0' : '50%';\r\n lib.getNode(`#${opposite}-advantages`).style.opacity = '0';\r\n lib.getNode(`#${product}-advantages`).style.display = 'flex';\r\n lib.getNode(`#${product}-advantage-mark`).style.top = '0';\r\n const activeNodes = lib.getNodes(`#${product}-advantages .advantage-active`);\r\n if (activeNodes.length) {\r\n activeNodes.forEach(n => {\r\n if (n.id !== `${product}-advantage-1`) {\r\n n.classList.remove('advantage-active');\r\n }\r\n })\r\n }\r\n selectAdvantage(product, 1);\r\n setTimeout(() => {\r\n lib.getNode(`#${product}-advantages`).style.opacity = '1';\r\n }, 200);\r\n setTimeout(() => {\r\n lib.getNode(`#${opposite}-advantages`).style.display = 'none';\r\n }, 300);\r\n });\r\n}\r\nhandleTab('app');\r\nhandleTab('site');\r\n\r\nif (window.innerWidth >= 1024) {\r\n lib.handleNodesClick('.advantage', e => {\r\n const [product, , number] = e.target.id.split('-');\r\n selectAdvantage(product, number);\r\n });\r\n}\r\n\r\nlib.handleNodesClick('.reviews-tab', e => {\r\n const number = e.target.id.split('-').pop();\r\n const lineLength = lib.getNode('.reviews-tabs-line').offsetWidth;\r\n lib.getNode('.reviews-tabs-line-active').style.left = Math.round((number-1)*Math.ceil((lineLength + (lineLength-108*5)/4)/5)) + 'px';\r\n\r\n const reviewContainer = lib.getNode('.review-container');\r\n let opacity = 1;\r\n const timer = setInterval(function() {\r\n if(opacity <= 0.1) {\r\n clearInterval(timer);\r\n changeTab();\r\n }\r\n reviewContainer.style.opacity = opacity;\r\n opacity -= 0.1;\r\n }, 10);\r\n\r\n function changeTab() {\r\n const ext = number > 2 ? 'png' : 'jpg';\r\n lib.getNode('.review-screen').innerHTML = `\r\n \r\n \r\n \"приложение\r\n `;\r\n const headings = [\r\n 'Батони - Москва',\r\n 'Dellos',\r\n 'Krispy Kreme',\r\n 'Sapore Italiano',\r\n 'Prime'\r\n ];\r\n lib.getNode('.review-heading').innerText = headings[number-1];\r\n const reviews = [\r\n 'Работаю с командой RuBeacon уже более 4-х лет. Отличное ведение проекта, постоянная тех. поддержка, что очень упрощает работу.\\n' +\r\n '\\n' +\r\n 'Запуск промо-акций и лояльностей для заказчиков приложения – очень удобно.\\n' +\r\n '\\n' +\r\n 'Постоянные обновления и улучшения, доработки приложения, очень много внимания уделяется пользовательскому интерфейсу.',\r\n 'От техподдержки только хорошие впечатления! Всегда получалось оперативно решать все вопросы. \\n' +\r\n '\\n' +\r\n 'Ну а самая большая похвала - это то, что в техподдержку приходится обращаться крайне редко, потому что все работает отлично)',\r\n 'Настоящим письмом компания ООО «Донатс кафе» (официальный представитель компании Krispy Kreme в России) выражает признательность команде ООО «РуБикон» за работу над проектом по разработке мобильного приложения на доставку тающих во рту пончиков Криспи Крим.\\n' +\r\n '\\n' +\r\n 'В процессе работы сотрудники ООО «РуБикон» на всех уровнях демонстрировали профессионализм, нетривиальный подход, инициативу и оперативность в решении сложных задач. \\n' +\r\n '\\n' +\r\n 'Особенно хотелось бы отметить отличный результат работы - на 100% удобное приложение с хорошим потенциалом развития.\\n' +\r\n '\\n' +\r\n 'Желаем Вам процветания и достойных новых проектов!',\r\n 'Сотрудничаем с компанией Рубикон по двум проектам и смогли попробовать и сайт, и приложение. Огромный плюс для нас — это интеграция с Iiko и скорость подключения: сделали запрос и, буквально на следующий день, - все готово.\\n' +\r\n '\\n' +\r\n 'Обратная связь по всем вопросам 24/7 с живыми людьми, что также немаловажно, так как, взаимодействуя с другими подрядчиками, очень сложно решить технический вопрос, и уходит много времени на объяснения только ситуации.\\n' +\r\n '\\n' +\r\n 'Также радует, что все идеи и необходимые доработки всегда можно обсудить и найти вместе варианты решения.',\r\n 'С компанией RuBeacon мы работаем уже несколько лет, в работе с ними в первую очередь нравится четкое и оперативное решение поставленных задач, а также наличие личного менеджера, который готов помочь в любой момент по любому вопросу. \\n' +\r\n '\\n' +\r\n 'Ну и конечно же сам продукт, современное, красивое приложение со всеми функциями, которые важны и нужны пользователям. \\n' +\r\n '\\n' +\r\n 'Ребятам желаю роста и развития в своем направлении!'\r\n ];\r\n lib.getNode('.review').innerText = reviews[number-1];\r\n const clients = [\r\n 'Борис Эксузян',\r\n 'Климов Павел',\r\n 'Майя Шевченко',\r\n 'Марина Баландина',\r\n 'Галахова Светлана'\r\n ];\r\n lib.getNode('.review-client').innerText = clients[number-1];\r\n const posts = [\r\n 'Директор доставки сети «Батони»',\r\n 'Менеджер компании ООО “Д-Деливери”',\r\n 'Руководитель департамента маркетинга',\r\n 'Директор доставки в Sapore Italiano',\r\n 'Генеральный директор'\r\n ];\r\n lib.getNode('.review-client-post').innerText = posts[number-1];\r\n\r\n const timer2 = setInterval(function() {\r\n if(opacity >= 1) {\r\n clearInterval(timer2);\r\n }\r\n reviewContainer.style.opacity = opacity;\r\n opacity += 0.05;\r\n }, 10);\r\n }\r\n});\r\n\r\nlet selectedProject = 1;\r\nconst selectProject = (number) => {\r\n selectedProject = number;\r\n lib.getNodes('.project-active').forEach(n => {\r\n n.classList.remove('project-active');\r\n });\r\n lib.getNode('.project-screen').innerHTML = `\r\n \r\n \r\n \"iphone\"\r\n `;\r\n lib.getNode(`#project-${number}`).classList.add('project-active');\r\n const lineLength = lib.getNode('.projects-line').offsetHeight;\r\n lib.getNode('.projects-line-active').style.top = Math.round((number-1)*Math.ceil((lineLength + (lineLength-80*7)/6)/7)) + 'px';\r\n}\r\n\r\nlib.handleNodesClick('.project', e => {\r\n const number = e.target.id.split('-').pop();\r\n selectProject(number);\r\n});\r\n\r\n\r\nconst adv = lib.getNode('#advantages');\r\nlet oldY = 0;\r\nlet timer = null;\r\nconst keys = {37: 1, 38: 1, 39: 1, 40: 1};\r\n\r\nfunction preventDefault(e) {\r\n e.preventDefault();\r\n}\r\n\r\nfunction preventDefaultForScrollKeys(e) {\r\n if (keys[e.keyCode]) {\r\n preventDefault(e);\r\n return false;\r\n }\r\n}\r\n\r\nlet supportsPassive = false;\r\ntry {\r\n window.addEventListener(\"test\", null, Object.defineProperty({}, 'passive', {\r\n get: function () { supportsPassive = true; }\r\n }));\r\n} catch(e) {}\r\n\r\nconst wheelOpt = supportsPassive ? { passive: false } : false;\r\nconst wheelEvent = 'onwheel' in document.createElement('div') ? 'wheel' : 'mousewheel';\r\n\r\nfunction disableScroll() {\r\n window.addEventListener('DOMMouseScroll', preventDefault, false); // older FF\r\n window.addEventListener(wheelEvent, preventDefault, wheelOpt); // modern desktop\r\n window.addEventListener('touchmove', preventDefault, wheelOpt); // mobile\r\n window.addEventListener('keydown', preventDefaultForScrollKeys, false);\r\n}\r\n\r\nfunction enableScroll() {\r\n window.removeEventListener('DOMMouseScroll', preventDefault, false);\r\n window.removeEventListener(wheelEvent, preventDefault, wheelOpt);\r\n window.removeEventListener('touchmove', preventDefault, wheelOpt);\r\n window.removeEventListener('keydown', preventDefaultForScrollKeys, false);\r\n}\r\n\r\nStickyfill.forceSticky();\r\n\r\nif (window.innerWidth >= 1024) {\r\n let offset = 20;\r\n if (window.innerWidth < 1200) {\r\n if (window.matchMedia(\"(orientation: portrait)\").matches) {\r\n offset = 300;\r\n }\r\n }\r\n\r\n window.addEventListener('scroll', (e) => {\r\n const newY = window.pageYOffset;\r\n const top = adv.getBoundingClientRect().top;\r\n const bottom = adv.getBoundingClientRect().top;\r\n if (top > 0 && (newY < oldY || top <= offset) && bottom > 0) {\r\n disableScroll();\r\n if (timer) return;\r\n let number = newY > oldY ? +selectedAdvantage + 1 : +selectedAdvantage - 1;\r\n if (number > 0 && number < 7) selectAdvantage(selectedProduct, number);\r\n oldY = newY;\r\n if (selectedAdvantage === 0 || selectedAdvantage === 6) {\r\n enableScroll();\r\n } else {\r\n timer = setTimeout(() => {\r\n clearTimeout(timer);\r\n timer = null;\r\n enableScroll();\r\n }, 300);\r\n }\r\n }\r\n });\r\n}\r\n\r\n\r\nlet projectsTimer = null;\r\nconst projectsSection = lib.getNode('#projects');\r\nlet offset = 20;\r\nif (window.innerWidth < 1200) {\r\n if (window.innerWidth < 768) {\r\n offset = 100;\r\n } else if (window.innerWidth < 1024) {\r\n offset = 200;\r\n } else {\r\n if (window.matchMedia(\"(orientation: landscape)\").matches) {\r\n offset = 20;\r\n } else {\r\n offset = 350;\r\n }\r\n }\r\n}\r\n\r\nStickyfill.add([projectsSection, adv]);\r\n\r\nwindow.addEventListener('scroll', (e) => {\r\n const newY = window.pageYOffset;\r\n const top = projectsSection.getBoundingClientRect().top;\r\n const bottom = projectsSection.getBoundingClientRect().top;\r\n\r\n if (top > 0 && (newY < oldY || top <= offset) && bottom > -200) {\r\n disableScroll();\r\n if (projectsTimer) return;\r\n let number = newY > oldY ? +selectedProject + 1 : +selectedProject - 1;\r\n if (window.innerWidth >= 1024) {\r\n if (number > 0 && number < 8) selectProject(number);\r\n oldY = newY;\r\n if (number === 0 || number === 8) {\r\n enableScroll();\r\n } else {\r\n projectsTimer = setTimeout(() => {\r\n clearTimeout(projectsTimer);\r\n projectsTimer = null;\r\n enableScroll();\r\n if (selectedAdvantage === 6) {\r\n }\r\n }, 300);\r\n }\r\n } else {\r\n if (newY > oldY) {\r\n // selectedProject++;\r\n carousel.embla.scrollNext()\r\n } else {\r\n // selectedProject--;\r\n carousel.embla.scrollPrev();\r\n }\r\n oldY = newY;\r\n projectsTimer = setTimeout(() => {\r\n clearTimeout(projectsTimer);\r\n projectsTimer = null;\r\n enableScroll();\r\n if (selectedAdvantage === 6) {\r\n }\r\n }, 800);\r\n }\r\n }\r\n});\r\n\r\nfunction customResize() {\r\n const resizeLegalBlock = (marginDeltaFirst) => {\r\n try {\r\n const mainBlock = document.getElementsByTagName('main')[0]\r\n const mainBlockParams = mainBlock.getBoundingClientRect()\r\n const mainBlockMargin = mainBlockParams.left\r\n\r\n let legalBlock = document.getElementById('company-legal-info')\r\n const legalBlockParams = legalBlock.getBoundingClientRect()\r\n\r\n const marginDelta = mainBlockParams.width - legalBlockParams.width\r\n const calcMargin = mainBlockMargin + (marginDelta > 0 ? marginDelta : marginDeltaFirst)\r\n\r\n legalBlock.style['margin-left'] = `-${calcMargin}px`\r\n legalBlock.style['margin-right'] = `-${calcMargin}px`\r\n legalBlock.style['padding-left'] = `${calcMargin}px`\r\n legalBlock.style['padding-right'] = `${calcMargin}px`\r\n // legalBlock.style.width = window.innerWidth - mainBlockMargin*2 + 'px'\r\n\r\n } catch (err) {\r\n console.log(\"An error occur while resizing legal block\")\r\n }\r\n }\r\n\r\n\r\n setTimeout(() => {\r\n const mainBlockWidth = document.getElementsByTagName('main')[0].getBoundingClientRect().width\r\n const legalBlockWidth = document.getElementById('company-legal-info').getBoundingClientRect().width\r\n const legalMarginDelta = mainBlockWidth - legalBlockWidth\r\n\r\n resizeLegalBlock(legalMarginDelta)\r\n window.addEventListener('resize', () => {\r\n resizeLegalBlock(legalMarginDelta)\r\n })\r\n }, 1)\r\n}\r\n\r\ncustomResize()"],"sourceRoot":""}