1var styleSheet = document.createElement("style"); 2styleSheet.type = "text/css"; 3styleSheet.innerText = ":root{--smartbtn-window-bg:#9932CC;--smartbtn-headerfont-color:#fff;--smartbtn-chatfont-color:#727b82;--smartbtn-chatfont-color-operator:#727b82;--smartbtn-message-bg:#f8f8fa;--smartbtn-message-bg-operator:#f8f8fa;--smartbtn-headerright-bg:#f9429d;--smartbtn-headerleft-bg:#ae3a6e;--smartbtn-btnwidget-bg:#FAFAFC;}@font-face { font-family: Gilroy; font-weight: 400; font-style: normal; src: url(https:\/\/smartbtn.ru\/assets\/smartbtn\/fonts\/GilroyRegular\/GilroyRegular.eot); src: url((https:\/\/smartbtn.ru\/assets\/smartbtn\/fonts\/GilroyRegular\/GilroyRegular.eot?#iefix) format(\"embedded-opentype\"), url((https:\/\/smartbtn.ru\/assets\/smartbtn\/fonts\/GilroyRegular\/GilroyRegular.woff) format(\"woff\"), url((https:\/\/smartbtn.ru\/assets\/smartbtn\/fonts\/GilroyRegular\/GilroyRegular.ttf) format(\"truetype\")}@font-face { font-family: Gilroy; font-weight: 700; font-style: normal; src: url((https:\/\/smartbtn.ru\/assets\/smartbtn\/fonts\/GilroyBold\/GilroyBold.eot); src: url((https:\/\/smartbtn.ru\/assets\/smartbtn\/fonts\/GilroyBold\/GilroyBold.eot?#iefix) format(\"embedded-opentype\"), url((https:\/\/smartbtn.ru\/assets\/smartbtn\/fonts\/GilroyBold\/GilroyBold.woff) format(\"woff\"), url((https:\/\/smartbtn.ru\/assets\/smartbtn\/fonts\/GilroyBold\/GilroyBold.ttf) format(\"truetype\")}@font-face { font-family: SFPro; font-weight: 400; font-style: normal; src: url((https:\/\/smartbtn.ru\/assets\/smartbtn\/fonts\/SFProRegular\/SFProRegular.eot); src: url((https:\/\/smartbtn.ru\/assets\/smartbtn\/fonts\/SFProRegular\/SFProRegular.eot?#iefix) format(\"embedded-opentype\"), url((https:\/\/smartbtn.ru\/assets\/smartbtn\/fonts\/SFProRegular\/SFProRegular.woff) format(\"woff\"), url((https:\/\/smartbtn.ru\/assets\/smartbtn\/fonts\/SFProRegular\/SFProRegular.ttf) format(\"truetype\")}@font-face { font-family: SFPro; font-weight: 700; font-style: normal; src: url((https:\/\/smartbtn.ru\/assets\/smartbtn\/fonts\/SFProBold\/SFProBold.eot); src: url((https:\/\/smartbtn.ru\/assets\/smartbtn\/fonts\/SFProBold\/SFProBold.eot?#iefix) format(\"embedded-opentype\"), url((https:\/\/smartbtn.ru\/assets\/smartbtn\/fonts\/SFProBold\/SFProBold.woff) format(\"woff\"), url((https:\/\/smartbtn.ru\/assets\/smartbtn\/fonts\/SFProBold\/SFProBold.ttf) format(\"truetype\")}@import url(\"https:\/\/fonts.googleapis.com\/css2?family=Roboto:wght@400;500;700;900&display=swap\");:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view), :where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) * { margin: 0; padding: 0; -webkit-box-sizing: border-box; box-sizing: border-box}.new_smartbtn_widget_view * { font-family: \"Roboto\", sans-serif;}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .img-responsive, .img-responsive:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { display: block; max-width: 100%; height: auto}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .img-responsive.img-width, .img-responsive.img-width:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { width: 100%}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .text-center, .text-center:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { text-align: center}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) b, b:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view), :where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) strong, strong:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { font-weight: 700}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .app, .app:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { font-size: 16px; min-width: 320px; position: relative; line-height: 1.65; font-family: FSPro, sans-serif; overflow-x: hidden; color: #333; background-color: #e5ebf1}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .iphone-btn, .iphone-btn:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; -webkit-box-align: center; -ms-flex-align: center; align-items: center; width: 60px; height: 100px; border: 5px solid #e3e0f6; border-radius: 15px; -webkit-transition: .4s; -o-transition: .4s; transition: .4s; background-image: -o-linear-gradient(315deg, #6b96f3, #dd52c4); background-image: linear-gradient(135deg, #6b96f3, #dd52c4)}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .iphone-btn.vibrated, .iphone-btn.vibrated:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { -webkit-animation: vebration .5s linear infinite; animation: vebration .5s linear infinite}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .iphone-btn.btn-hide, .iphone-btn.btn-hide:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { -webkit-transform: scale(0); -ms-transform: scale(0); transform: scale(0)}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .iphone-btn::after, .iphone-btn:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view)::after { content: \"\"; position: absolute; width: 30px; height: 5px; border-bottom-right-radius: 10px; border-bottom-left-radius: 10px; background-color: #e3e0f6; top: 0; left: 50%; -webkit-transform: translateX(-50%); -ms-transform: translateX(-50%); transform: translateX(-50%)}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .iphone-btn--fixed, .iphone-btn--fixed:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { position: fixed; right: 20px; bottom: 20px; z-index: 9}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .iphone-btn .icon, .iphone-btn:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .icon { fill: #e3e0f6; width: 25px; height: 25px}@-webkit-keyframes vebration { 0% { -webkit-transform: translateY(0); transform: translateY(0) } 25% { -webkit-transform: translateY(-15px); transform: translateY(-15px) } 50% { -webkit-transform: translateY(0); transform: translateY(0) } 75% { -webkit-transform: translateY(-15px); transform: translateY(-15px) } 100% { -webkit-transform: translateY(0); transform: translateY(0) }}@keyframes vebration { 0% { -webkit-transform: translateY(0); transform: translateY(0) } 25% { -webkit-transform: translateY(-15px); transform: translateY(-15px) } 50% { -webkit-transform: translateY(0); transform: translateY(0) } 75% { -webkit-transform: translateY(-15px); transform: translateY(-15px) } 100% { -webkit-transform: translateY(0); transform: translateY(0) }}.smartbtn_widget_view { position: fixed; bottom: 500%; width:450px; left: 0; right: 0; z-index: 2000; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-orient: vertical; -webkit-box-direction: normal; -ms-flex-direction: column; flex-direction: column; opacity: 0; -webkit-transition: .2s; -o-transition: .2s; transition: .2s; max-width:450px;}.smartbtn_widget_view__header { background-color: var(--smartbtn-btnwidget-bg); display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; align-items: center; -webkit-box-pack: justify; -ms-flex-pack: justify; justify-content: space-between; padding-top: 15px; padding-bottom: 15px; padding-right: 20px; padding-left: 20px; width:100%; height:60px; border-top-left-radius: 5px; border-top-right-radius: 5px; border: 1px solid rgb(245, 53, 149); z-index:2000;}.smartbtn_widget_view__content { display: -webkit-box; display: -ms-flexbox; display:flex; background-color: var(--smartbtn-window-bg); height: 535px; width:100%;}.smartbtn_widget_view__btns-group { display: -webkit-box; display: -ms-flexbox; display:flex; -webkit-box-align: center; -ms-flex-align: center; align-items: center; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; margin-left:15px; margin-right:5px;}.smartbtn_widget_view__btns-group .tool--phone { margin-right: 10px}\/*.tool__icon { -webkit-transition: .2s; -o-transition: .2s; transition: .2s; width: 40px; height: 40px; padding: 10px; -webkit-border-radius: 50%; border-radius: 50%}*\/:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .tool--phone .tool__icon, .tool--phone:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .tool__icon { width: 40px; height: 40px; background-image: -o-linear-gradient(bottom, #3ba59e, #205a56); background-image: -webkit-gradient(linear, left bottom, left top, from(#3ba59e), to(#205a56)); background-image: linear-gradient(to top, #3ba59e, #205a56); -webkit-box-shadow: 0 5px 15px rgba(18, 95, 129, .4); box-shadow: 0 5px 15px rgba(18, 95, 129, .4); fill: #fff}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .tool--map .tool__text, .tool--map:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .tool__text { font-size: .5em}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .tool--map .tool__icon, .tool--map:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .tool__icon { fill: #fff; background-image: -o-linear-gradient(bottom, #50bcec, #158cc1); background-image: -webkit-gradient(linear, left bottom, left top, from(#50bcec), to(#158cc1)); background-image: linear-gradient(to top, #50bcec, #158cc1); -webkit-box-shadow: 0 5px 15px rgba(18, 95, 129, .4); box-shadow: 0 5px 15px rgba(18, 95, 129, .4)}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .tool__text, .tool__text:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { color: #333; letter-spacing: 2.5px; text-transform: uppercase; line-height: 14px; font-size: .563em; font-size: Gilroy, sans-serif}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .tool.active .tool__text, .tool.active:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .tool__text { display: none}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .tool.active .tool__icon, .tool.active:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .tool__icon { fill: #fff}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .tool.active.tool--map .tool__icon, .tool.active.tool--map:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .tool__icon { background-image: -o-linear-gradient(bottom, #50bcec, #158cc1); background-image: -webkit-gradient(linear, left bottom, left top, from(#50bcec), to(#158cc1)); background-image: linear-gradient(to top, #50bcec, #158cc1); -webkit-box-shadow: 0 5px 15px rgba(18, 95, 129, .4); box-shadow: 0 5px 15px rgba(18, 95, 129, .4)}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .tool .tool--phone:hover .tool__icon, .tool:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .tool--phone:hover .tool__icon { background-image: -o-linear-gradient(bottom, #3ba59e, #205a56); background-image: -webkit-gradient(linear, left bottom, left top, from(#3ba59e), to(#205a56)); background-image: linear-gradient(to top, #3ba59e, #205a56); -webkit-box-shadow: 0 5px 15px rgba(18, 95, 129, .4); box-shadow: 0 5px 15px rgba(18, 95, 129, .4)}.smartbtn_widget_view__close { display: -webkit-box; display: -ms-flexbox; display:flex; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; -webkit-box-align: center; -ms-flex-align: center; align-items: center; text-decoration: none; margin-left: auto; margin-right:0;}.smartbtn_widget_view__close .icon { fill: #f2469a;
3 width: 20px; height: 20px} .smartbtn_widget_logo { display: -webkit-box; display: -ms-flexbox; display:flex; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; -webkit-box-align: center; -ms-flex-align: center; align-items: center; margin-left: 20px; margin-right:20px;}.smartbtn_widget_route{ display: -webkit-box; display: -ms-flexbox; display:flex; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; -webkit-box-align: center; -ms-flex-align: center; align-items: center; margin-left: 30px; margin-right:30px; background:none !important; border: none !important;}.smartbtn_widget_route_button{ background:none !important; border: none !important;}.smartbtn_widget_route_button:hover{ background:none !important; border: none !important;}.smartbtn_widget_chat { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-orient: vertical; -webkit-box-direction: normal; -ms-flex-direction: column; flex-direction: column; height:100%; width:100%;}.smartbtn_widget_chat__header { padding-left: 20px; padding-right: 20px; padding-top: 15px; padding-bottom: 15px; height:75px; width:100%; display: -webkit-box; display: -ms-flexbox; display:flex; -webkit-box-pack: justify; -ms-flex-pack: justify; justify-content: space-between; -webkit-box-align: center; -ms-flex-align: center; align-items: center; background-image: -o-linear-gradient(315deg, var(--smartbtn-headerleft-bg), #f9429d, var(--smartbtn-headerright-bg)); background-image: -o-linear-gradient(315deg, var(--smartbtn-headerleft-bg), #f9429d,var(--smartbtn-headerright-bg)); background-image: linear-gradient(135deg, var(--smartbtn-headerleft-bg), #f9429d,var(--smartbtn-headerright-bg)); color:var(--smartbtn-headerfont-color);}.smartbtn_widget_chat__header .smartbtn_widget_operator-info { -webkit-box-flex: 1; -ms-flex: 1; flex: 1}.smartbtn_widget_chat__header .more-btn { margin-left: 15px; color: white;}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .more-btn, .more-btn:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { width: 40px; height: 40px; background-color: #d6498d; border-radius: 50%; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; -webkit-box-align: center; -ms-flex-align: center; align-items: center; -webkit-box-orient: vertical; -webkit-box-direction: normal; -ms-flex-direction: column; flex-direction: column}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .more-btn span, .more-btn:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) span { width: 20px; height: 3px; background-color: #fff; margin-bottom: 3px}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .more-btn span:last-child, .more-btn:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) span:last-child { margin-bottom: 0}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .rate, .rate:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { border: 1px solid #cccccc; float: left; height: 46px; padding: 0 10px;}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .rate:not(:checked) > input, .rate:not(:checked):where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) > input { position:absolute; top:-9999px;}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .rate:not(:checked) > label, .rate:not(:checked):where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) > label { float:right; width:1em; overflow:hidden; white-space:nowrap; cursor:pointer; font-size:30px; color:#ccc;}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .rate:not(:checked) > label:before, .rate:not(:checked):where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) > label:before {}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .rate > input:checked ~ label, .rate:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) > input:checked ~ label { color: #ffc700;}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .rate:not(:checked) > label:hover,.rate:not(:checked):where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) > label:hover,:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .rate:not(:checked) > label:hover ~ label,.rate:not(:checked):where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) > label:hover ~ label { color: #deb217;}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .rate > input:checked + label:hover,.rate:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) > input:checked + label:hover,:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .rate > input:checked + label:hover ~ label,.rate:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) > input:checked + label:hover ~ label,:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .rate > input:checked ~ label:hover,.rate:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) > input:checked ~ label:hover,:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .rate > input:checked ~ label:hover ~ label,.rate:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) > input:checked ~ label:hover ~ label,:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .rate > label:hover ~ input:checked ~ label,.rate:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) > label:hover ~ input:checked ~ label { color: #c59b08;}\/*-----------------*\/.smartbtn_widget_chat__body { padding: 20px; padding-bottom: 0; overflow-y: auto; -webkit-box-flex: 1; -ms-flex-positive: 1; flex-grow: 1; display: -webkit-box; display: -ms-flexbox; display:flex; -webkit-box-orient: vertical; -webkit-box-direction: normal; -ms-flex-direction: column; flex-direction: column; -webkit-box-pack: justify; -ms-flex-pack: justify; justify-content: space-between}.smartbtn_widget_chat__box { border: 2px dashed #e6e6e8; padding: 10px; background-color: var(--smartbtn-message-bg); border-radius: 10px; margin-bottom: 15px}.smartbtn_widget_chat__box .heading { font-size: 1em; color: var(--smartbtn-chatfont-color); line-height: 1.2; text-align: center; margin-bottom: 15px}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .chat__socials, .chat__socials:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; -webkit-box-align: center; -ms-flex-align: center; align-items: center}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .chat__socials .social-card, .chat__socials:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .social-card { margin-right: 10px}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .chat__socials .social-card:last-child, .chat__socials:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .social-card:last-child { margin-right: 0}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .chat__footer, .chat__footer:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { padding-left: 20px; padding-right: 20px; padding-bottom: 15px; padding-top: 15px}.smartbtn_widget_operator-info { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; align-items: center}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .operator-info__ava, .operator-info__ava:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { width: 40px; height: 40px; border-radius: 50%; overflow: hidden; margin-right: 10px}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .operator-info__heading, .operator-info__heading:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { font-weight: 700; font-size: 1em; line-height: 1.2}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .operator-info__status, .operator-info__status:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { font-size: .813em; opacity: .6}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .operator-message, .operator-message:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-orient: horizontal; -webkit-box-direction: normal; -ms-flex-direction: row; flex-direction: row; -webkit-box-align: stretch; -ms-flex-align: stretch; align-items: stretch; margin-bottom: 30px}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .operator-message__left-side, .operator-message__left-side:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { margin-right: 35px; position: relative; margin-top: 20px;}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .operator-message__typing, .operator-message__typing:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; align-items: center; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; position: absolute; right: -30px; top: 0}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .operator-message__typing span, .operator-message__typing:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) span { width: 7px; height: 7px; border-radius: 50%; background-color: #f2469a; margin-right: 4px}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .operator-message__typing span:last-child, .operator-message__typing:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) span:last-child { margin-right: 0}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .operator-message__typing span:first-child, .operator-message__typing:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) span:first-child { -webkit-transform: scale(.5); -ms-transform: scale(.5); transform: scale(.5)}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .operator-message__typing span:nth-child(2), .operator-message__typing:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) span:nth-child(2) { -webkit-transform: scale(.75); -ms-transform: scale(.75); transform: scale(.75)}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .operator-message__ava, .operator-message__ava:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { width: 40px; height: 40px; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; -webkit-box-align: center; -ms-flex-align: center; align-items: center; border-radius: 50%; overflow: hidden}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .operator-message__right-side, .operator-message__right-side:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { display: -webkit-box; display: -ms-flexbox; display: flex; width: 100%;}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .operator-message__info, .operator-message__info:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-pack: justify; -ms-flex-pack: justify; justify-content: space-between; margin-bottom: 5px}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .operator-message__name, .operator-message__name:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { font-size: .813em; line-height: 1.2; color: #cacfd3}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .operator-message__time, .operator-message__time:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { font-size: .813em; line-height: 1.2; color: #f2469a}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .operator-message__message, .operator-message__message:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { background-color: var(--smartbtn-message-bg); border: 1px solid #f5f7f9; padding: 15px; font-size: 1em; line-height: 1.4; border-radius: 10px; color: var(--smartbtn-chatfont-color); word-wrap: break-word; width:auto !important;}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .client-message, .client-message:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-orient: horizontal; -webkit-box-direction: normal; -ms-flex-direction: row; flex-direction: row; -webkit-box-align: stretch; -ms-flex-align: stretch; align-items: stretch; margin-bottom: 35px}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .client-message__right-side, .client-message__right-side:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { margin-left: 35px; position: relative; margin-top: 20px}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .client-message__typing, .client-message__typing:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; align-items: center; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; position: absolute; left: -30px; top: 0}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .client-message__typing span, .client-message__typing:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) span { width: 7px; height: 7px; border-radius: 50%; background-color: #35a9d6; margin-right: 4px}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .client-message__typing span:last-child, .client-message__typing:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) span:last-child { margin-right: 0; -webkit-transform: scale(.5); -ms-transform: scale(.5); transform: scale(.5)}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .client-message__typing span:nth-child(2), .client-message__typing:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) span:nth-child(2) { -webkit-transform: scale(.75); -ms-transform: scale(.75); transform: scale(.75)}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .client-message__ava, .client-message__ava:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { width: 40px; height: 40px; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; -webkit-box-align: center; -ms-flex-align: center; align-items: center; border-radius: 50%; overflow: hidden}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .client-message__left-side, .client-message__left-side:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { width: 100%}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .client-message__info, .client-message__info:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-pack: justify; -ms-flex-pack: justify; justify-content: space-between; margin-bottom: 5px}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .client-message__name, .client-message__name:where(.new_smartbtn_widget_iphon
3e-btn,.new_smartbtn_widget_view) { font-size: .813em; line-height: 1.2; color: #cacfd3}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .client-message__time, .client-message__time:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { font-size: .813em; line-height: 1.2; color: #f2469a}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .client-message__message, .client-message__message:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { background-color: var(--smartbtn-message-bg); border: 1px solid #f5f7f9; padding: 15px; font-size: 1em; line-height: 1.4; border-radius: 10px; color: var(--smartbtn-chatfont-color); text-align: right; word-wrap: break-word; width:100%;}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .message-area, .message-area:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { position: relative}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .message-area__textarea, .message-area__textarea:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { resize: none; width: 100%; height: 80px; padding: 15px; border: 1px solid #dbdbdb; border-radius: 5px; -webkit-transition: .2s; -o-transition: .2s; transition: .2s; padding-right: 70px}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .message-area__textarea:focus, .message-area__textarea:focus:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { border-color: #a8a8a8; outline: 0}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .message-area__textarea::-webkit-input-placeholder, .message-area__textarea:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view)::-webkit-input-placeholder { color: #d5d8df}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .message-area__textarea::-moz-placeholder, .message-area__textarea:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view)::-moz-placeholder { color: #d5d8df}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .message-area__textarea:-ms-input-placeholder, .message-area__textarea:-ms-input-placeholder:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { color: #d5d8df}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .message-area__textarea::-ms-input-placeholder, .message-area__textarea:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view)::-ms-input-placeholder { color: #d5d8df}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .message-area__textarea::placeholder, .message-area__textarea:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view)::placeholder { color: #d5d8df}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .message-area__send-btn, .message-area__send-btn:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { width: 50px; height: 50px; position: absolute; top: 15px; right: 10px; background-color: #7162ff; border: none; border-radius: 50%; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; -webkit-box-align: center; -ms-flex-align: center; align-items: center; padding-left: 5px; -webkit-transition: .2s; -o-transition: .2s; transition: .2s; background-image: -o-linear-gradient(315deg, #6573fd, #c855e4); background-image: linear-gradient(135deg, #6573fd, #c855e4)}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .message-area__send-btn .icon, .message-area__send-btn:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .icon { fill: #fff; width: 25px; height: 25px}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .message-area__send-btn:hover, .message-area__send-btn:hover:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { opacity: .9; cursor: pointer}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .message-area__other-btns, .message-area__other-btns:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { position: absolute; bottom: 15px; left: 15px; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; align-items: center}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .message-area__other-btn, .message-area__other-btn:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { border: none; background: 0 0; margin-right: 10px}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .message-area__other-btn:last-child, .message-area__other-btn:last-child:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { margin-right: 0}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .message-area__other-btn .icon, .message-area__other-btn:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .icon { width: 20p
3x; height: 20px; fill: #d5d8df; -webkit-transition: .2s; -o-transition: .2s; transition: .2s}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .message-area__other-btn:hover, .message-area__other-btn:hover:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { cursor: pointer}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .message-area__other-btn:hover .icon, .message-area__other-btn:hover:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .icon { fill: #9ba2b3}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .message-area__add-photo-btn .icon, .message-area__add-photo-btn:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .icon { width: 23px; height: 23px}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .water-sign, .water-sign:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { font-size: .813em; text-align: center; font-weight: 700; color: #d5d8df; margin-top: 10px}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .water-sign a, .water-sign:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) a { color: #6f6585; text-decoration: none}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .social-card, .social-card:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { border-radius: 5px; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-orient: horizontal; -webkit-box-direction: normal; -ms-flex-direction: row; flex-direction: row; -ms-flex-wrap: nowrap; flex-wrap: nowrap; -webkit-box-align: center; -ms-flex-align: center; align-items: center; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; color: #333; font-family: Gilroy, sans-serif; text-decoration: none; font-weight: 700; -webkit-transition: .2s; -o-transition: .2s; transition: .2s; overflow-x: hidden}.new_smartbtn_widget_chat__downloads a:before{ all: unset;}.new_smartbtn_widget_chat__downloads a:after{ all: unset;}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .social-card__icon, .social-card__icon:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { width: 40px !important; height: 40px !important; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; -webkit-box-align: center; -ms-flex-align: center; align-items: center; border-radius: 50%}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .social-card__icon .icon, .social-card__icon:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .icon { width: 25px !important; height: 25px !important; fill: #fff}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .social-card .vk-icon, .social-card:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .vk-icon { background-color: #2e77a4}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .social-card .tg-icon, .social-card:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .tg-icon { background-color: #00a8dd}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .social-card .fb-icon, .social-card:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .fb-icon { background-color: #23599b}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .social-card .ok-icon, .social-card:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .ok-icon { background-color: #ff9500}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .social-card .wa-icon, .social-card:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .wa-icon { background-color: #4ab632}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .social-card .vb-icon, .social-card:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .vb-icon { background-color: #7d3dae}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .destination-box, .destination-box:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { background-color: #fff; border-radius: 10px; padding: 15px; position: relative; -webkit-box-shadow: 0 5px 30px rgba(0, 0, 0, .4); box-shadow: 0 5px 30px rgba(0, 0, 0, .4)}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .destination-box__top, .destination-box__top:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-orient: horizontal; -webkit-box-direction: normal; -ms-flex-direction: row; flex-direction: row; -webkit-box-align: center; -ms-flex-align: center; align-items: center; color: #2a8cb7; line-height: 20px; font-size: .938em; font-family: Gilroy, sans-serif; padding-bottom: 10px; border-bottom: 1px dashed #d6d6d6}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .destination-box__top .icon, .destination-box__top:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .icon { margin-right: 10px; padding-top: 5px}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .destination-box__bottom, .destination-box__bottom:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-orient: horizontal; -webkit-box-direction: normal; -ms-flex-direction: row; flex-direction: row; -webkit-box-align: center; -ms-flex-align: center; align-items: center; line-height: 20px; font-size: .938em; padding-top: 10px; font-family: Gilroy, sans-serif}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .destination-box__bottom .icon, .destination-box__bottom:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .icon { margin-right: 10px; padding-top: 5px}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .destination-box__btn, .destination-box__btn:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { position: absolute; top: calc(50% - 16px); right: 15px; border: none; width: 32px; height: 32px; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; align-items: center; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; border-radius: 50%; background-image: -o-linear-gradient(top, #2a8cb7 0, #46c1f6 100%); background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #2a8cb7), to(#46c1f6)); background-image: linear-gradient(180deg, #2a8cb7 0, #46c1f6 100%)}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .destination-box__btn .icon, .destination-box__btn:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .icon { width: 15px; height: 15px; fill: #fff}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .view__map,.view__map:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view){ height: 550px; background: #5f6983; display: none;}.smartbtn_widget_map{ display: block; width: 100%; height: 100%; padding: 10px 30px 10px 30px;}
3:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .view__map_container,.view__map_container:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view){ border: 1px solid rgba(0, 0, 0, 1); z-index: 2000; width: 100%; height: 150px; overflow: auto; scrollbar-width: thin; -ms-overflow-style: none; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-orient: vertical; -webkit-box-direction: normal; -ms-flex-direction: column; flex-direction: column; -webkit-box-pack: start; -ms-flex-pack: start; justify-content: flex-start; -webkit-box-align: start; -ms-flex-align: start; align-items: flex-start; margin: auto; padding: 5px 30px 5px 30px;}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .chat__footer, .chat__footer:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { padding-left: 7px; padding-right: 7px; padding-bottom: 7px; padding-top: 5px; width:auto;}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .message-area, .message-area:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { position: relative; width:100%;}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .message-area__other-btns, .message-area__other-btns:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { width:50px; display: -webkit-box; display: -ms-flexbox; display: flex; margin: 0 0 0 0; -webkit-box-align: center; -ms-flex-align: center; align-items: center}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .message-area,.message-area:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view){ position: inherit; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-orient: horizontal; -webkit-box-direction: normal; -ms-flex-direction: row; flex-direction: row; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; -webkit-box-align: center; -ms-flex-align: center; align-items: center; margin:0; padding:0;}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .message-area__textarea,.message-area__textarea:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view){ position: inherit; display: -webkit-box; display: -ms-flexbox; display: flex; margin: 0 0 0 0; resize: none; width: 100%; height: 50px; padding: 5px 5px 5px 15px; border: 1px solid #9c9c9c; border-radius: 5px;}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .message-area__send-btn, .message-area__send-btn:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { position: inherit; display: -webkit-box; display: -ms-flexbox; display: flex; margin:auto 0 auto 5px; padding:0; width:45px; height:45px; border: none;}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .message-area__other-btns, .message-area__other-btns:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { display: -webkit-box; display: -ms-flexbox; display: flex; position: inherit; margin: 0 0 0 0; padding: 0 4px 0 4px;}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .message-area__other-btn, .message-area__other-btn:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { display: -webkit-box; display: -ms-flexbox; display: flex; position: inherit; margin: 7px 7px 7px 7px;}.smartbtn_widget_input_file{ visibility: hidden; width:10px;}.smartbtn_widget_sender_property{ display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-orient: vertical; -webkit-box-direction: normal; -ms-flex-direction: column; flex-direction: column; font-size: 25px; color: black; margin:0 10px 0 5px; cursor: pointer; -moz-user-select: none; user-select: none; -webkit-touch-callout: none; -webkit-user-select: none;
3 -ms-user-select: none;}.smartbtn_widget_point{ display: -webkit-box; display: -ms-flexbox; display: flex; width:5px; height:5px; border-radius: 50%; background-color: black; margin: 3px 0 3px 5px;}.smartbtn_widget_sender_menu{ cursor: pointer; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-orient: vertical; -webkit-box-direction: normal; -ms-flex-direction: column; flex-direction: column; display:none; position: relative; margin:5px; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; -webkit-box-align: center; -ms-flex-align: center; align-items: center; background:rgb(255, 255, 255); color:black; font-size: 12px; -webkit-animation-name: resizeSenderMenu; animation-name: resizeSenderMenu; -webkit-animation-duration: 0.3s; animation-duration: 0.3s; border-radius: 5px;}.smartbtn_widget_sender_animation_normal{ -webkit-animation-name: resizeSenderMenu; animation-name: resizeSenderMenu; -webkit-animation-duration: 3.3s; animation-duration: 3.3s;}.smartbtn_widget_sender_animation_reverse{ -webkit-animation-name: resizeSenderMenuReverse; animation-name: resizeSenderMenuReverse; -webkit-animation-duration: 3.3s; animation-duration: 3.3s;}@-webkit-keyframes resizeSenderMenu { from { width: 0px; height:0px; -webkit-animation-timing-function: ease-out; animation-timing-function: ease-out; } to { height:65px; width:50px; -webkit-animation-timing-function: ease-out; animation-timing-function: ease-out; }}@keyframes resizeSenderMenu { from { width: 0px; height:0px; -webkit-animation-timing-function: ease-out; animation-timing-function: ease-out; } to { height:65px; width:50px; -webkit-animation-timing-function: ease-out; animation-timing-function: ease-out; }}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) #hideShow,#hideShow:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view){ display: -webkit-box; display: -ms-flexbox; display: flex; opacity:0.3; margin: 7px 7px 7px 7px;}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) #hideShow:hover,#hideShow:hover:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view){ opacity:0.7;}.smartbtn_widget_emoji{ display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-orient:horizontal; -webkit-box-direction:normal; -ms-flex-direction:row; flex-direction:row; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; -webkit-box-align: normal; -ms-flex-align: normal; align-items: normal; left:40px; top:0;}.smartbtn_widget_emo{ display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; -webkit-box-align: normal; -ms-flex-align: normal; align-items: normal; font-size:20px; margin:-7px 8px 0 0;}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .operator-message, .operator-message:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { margin-bottom: 10px}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .operator-message__left-side, .operator-message__left-side:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { display: -webkit-box; display: -ms-flexbox; display:flex;}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .message-area__send-btn:hover,.message-area__send-btn:hover:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view){ background-color: #7162ff; border: none; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; -webkit-box-align: center; -ms-flex-align: center; align-items: center;}:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) .message-area__textarea:hover, .message-area__textarea:hover:where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view) { resize: none; width: 100%; height: 80px; padding: 15px; border: 1px solid #dbdbdb; border-radius: 5px; padding-right: 70px}.new_smartbtn_widget_chat__header a{ all: unset;}.new_smartbtn_widget_chat__header a:before{ all: unset;}.new_smartbtn_widget_chat__header a:after{ all: unset;}
3html.smartbtn_widget_host_scroll_lock,body.smartbtn_widget_host_scroll_lock { overflow: hidden !important;}@media only screen and (max-width: 649px) { :where(.new_smartbtn_widget_iphone-btn,.new_smartbtn_widget_view){ \/*position: relative !important;*\/ \/*height:100%;*\/ }}@media only screen and (min-width: 650px) { \/* .new_smartbtn_widget_logo{ border-top-left-radius: 10px; } *\/ .new_smartbtn_widget_water-sign{ border-bottom-left-radius: 10px; border-bottom-right-radius: 10px; } \/* .new_smartbtn_widget_view__header { border-top-left-radius: 10px; border-top-right-radius: 10px; } *\/}.new_smartbtn_widget_view_width { width: 100%; height: 100%; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-orient: vertical; -webkit-box-direction: normal; -ms-flex-direction: column; flex-direction: column; -webkit-box-pack: justify; -ms-flex-pack: justify; justify-content: space-between;}.new_smartbtn_widget_view__header { background-color: #343434; padding: 15px 75px; position: relative; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-orient: vertical; -webkit-box-direction: normal; -ms-flex-direction: column; flex-direction: column; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; \/* background-color: var(--smartbtn-btnwidget-bg); display: flex; flex-direction: row; justify-content: center; align-items: center; padding: 15px 20px 15px 20px; width: 100%; height: 60px; z-index: 20000; flex-shrink: 0; color :black; flex-wrap: nowrap; margin: 0 0 0 0; *\/}.new_smartbtn_widget_logo { width: 100%; height: 100%; cursor: pointer; background-repeat: no-repeat; background-size: contain; background-position: center;}.new_smartbtn_widget_view__close { line-height: 12px; position: absolute; top: 20px; left: 20px; cursor: pointer;}.new_smartbtn_widget_icon { width: 15px; height: 15px; fill: white;}.new_smartbtn_widget_route { display: -webkit-box; display: -ms-flexbox; display: flex; cursor: pointer; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; -webkit-box-align: center; -ms-flex-align: center; align-items: center; width: 45px; height: 45px; -webkit-box-flex: 1; -ms-flex: 1; flex: 1; background: url(https:\/\/smartbtn.ru\/assets\/smartbtn\/img\/route.png) no-repeat;\tbackground-size: contain; background-position: center; margin-right: 20px; border-radius: 5px;}.new_smartbtn_widget_route_close{ background-color: rgba(250, 7, 7, 1);}.new_smartbtn_widget_phone{ cursor: pointer; position: absolute; bottom: 20px; right: 15px; background-color: white; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; -webkit-box-align: center; -ms-flex-align: center; align-items: center; border-radius: 100px; width: 50px; height: 50px; \/* fix\/constructor-i18n-and-widget-layout: was display:none here, revealed only <=1024px (media query further down) or, since be231df9e9 (2026-07-09), on desktop too but ONLY for a button with a non-empty phone number (chat.blade.php's @if(!empty($phone)) inline override). That left a real gap: widget_show_phone_button='1' (the owner turned the header call button ON in the constructor) with no phone number on file rendered the div (PersonalCabinet\/getButtonV2 gate it on the toggle, not on $phone) but it stayed invisible on any screen >1024px -- visible in the constructor preview, invisible on the live site, exactly the reported symptom. Visibility now follows the SAME toggle at every width, matching what already happens <=1024px unconditionally; the @media(max-width:1024px) display:flex below and chat.blade.php's phone-gated override are both now redundant (same value, harmless) and left in place rather than touched. *\/ display: -webkit-box; display: -ms-flexbox; display: flex;}.new_smartbtn_widget_view__map{ \/**\/}.new_smartbtn_widget_map { width: 100%; height: 300px; padding: 15px;}.new_smartbtn_widget_view__map_container { padding-top: 5px; padding-right: 15px; padding-left: 15px; padding-bottom: 20px;}.new_smartbtn_widget_view__map_container div { margin-top: 10px; border: 1px solid #131313; border-radius: 5px; padding: 10px 20px; position: relative;}.new_smartbtn_widget_view__map_container div div { font-size: 12px; margin-top: 0; padding: 5px 10px; background-color: #FED215; -webkit-box-shadow: inset 0 -3px 3px 1px #c2a110; box-shadow: inset 0 -3px 3px 1px #c2a110; border-radius: 5px; border: none;}.new_smartbtn_widget_view__map_container div input { width: 100%; font-size: 10px; color: #131313; outline: none; cursor: pointer; padding-bottom: 2.5px;}.new_smartbtn_widget_view__map_container div input:focus { outline: none; border-bottom: 1px solid #131313;}.new_smartbtn_widget_view__map_container div input:disabled { width: 100%; font-size: 10px; color: #131313; outline: none; cursor: default;}.new_smartbtn_widget_view__map_container div input:disabled:focus { outline: none; border-bottom: none;}.new_smartbtn_widget_chat__header { display:-webkit-box; display:-ms-flexbox; display:flex; position:relative; -webkit-box-orient: horizontal; -webkit-box-direction: normal; -ms-flex-direction: row; flex-direction: row; -webkit-box-pack: justify; -ms-flex-pack: justify; justify-content: space-between; -webkit-box-align: center; -ms-flex-align: center; align-items: center; padding: 18px 15px 16px 15px; height: 75px; width: 100%; background: -o-linear-gradient(315deg, var(--smartbtn-headerleft-bg), #f9429d,var(--smartbtn-headerright-bg)); background: linear-gradient(135deg, var(--smartbtn-headerleft-bg), #f9429d,var(--smartbtn-headerright-bg)); color: var(--smartbtn-headerfont-color); margin-top: 0; margin-bottom: 0; z-index: 20000; -ms-flex-negative: 0; flex-shrink: 0;}.new_smartbtn_widget_operator-info { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-orient: horizontal; -webkit-box-direction: normal; -ms-flex-direction: row; flex-direction: row; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; -webkit-box-align: center; -ms-flex-align: center; align-items: center;}.new_smartbtn_widget_operator-info__ava { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-orient: horizontal; -webkit-box-direction: normal; -ms-flex-direction: row; flex-direction: row; -webkit-box-align: center; -ms-flex-align: center; align-items: center; width: 40px; height: 40px; border-radius: 50%; overflow: hidden; margin-right: 10px; background: url(https:\/\/smartbtn.ru\/assets\/smartbtn\/img\/operator-ava.png) no-repeat;\tbackground-size: contain; background-position: center;}.new_smartbtn_widget_operator-info__text{ display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-orient: vertical; -webkit-box-direction: normal; -ms-flex-direction: column; flex-direction: column; -webkit-box-pack: start; -ms-flex-pack: start; justify-content: flex-start; -webkit-box-align: center; -ms-flex-align: center; align-items: center;}.new_smartbtn_widget_operator-info__heading { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-pack: start; -ms-flex-pack: start; justify-content: flex-start; width: 100%; -webkit-box-align: center; -ms-flex-align: center; align-items: center; font-weight: 700; font-size: 1em; line-height: 1.1;}.new_smartbtn_widget_operator-info__status { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-pack: start; -ms-flex-pack: start; justify-content: flex-start; width: 100%; -webkit-box-align: center; -ms-flex-align: center; align-items: center; font-size: .813em; opacity: 0.6; margin: 0; padding: 0;}.new_smartbtn_widget_chat_download{ display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; cursor: pointer; width: 30px; height: 35px; -webkit-box-align: center; -ms-flex-align: center; align-items: center; color: #fdfcfd; margin-left:15px;}.new_smartbtn_widget_more-btn { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-orient: vertical; -webkit-box-direction: normal; -ms-flex-direction: column; flex-direction: column; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; position:relative; cursor: pointer; width: 45px; -webkit-box-align: center; -ms-flex-align: center; align-items: center; margin-left: 15px; color: white; height: 45px; background-color: #d6498d; border-radius: 50%;}
3.new_smartbtn_widget_more-btn_span{ width: 20px; height: 3px; background-color: #fff; margin-bottom: 3px;}.new_smartbtn_widget_view__content { position: relative; display: -webkit-box; display: -ms-flexbox; display: flex; background-color: var(--smartbtn-window-bg); width: 100%; z-index: 20000; margin-top: 0; margin-bottom: 0; -webkit-box-flex: 1; -ms-flex-positive: 1; flex-grow: 1;}.new_smartbtn_widget_chat { position: relative; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-orient: vertical; -webkit-box-direction: normal; -ms-flex-direction: column; flex-direction: column; width: 100%; margin: 0;}.new_smartbtn_widget_chat__raiting label{ all: unset;}.new_smartbtn_widget_chat__raiting label:before{ all: unset;}.new_smartbtn_widget_chat__raiting label:after{ all: unset;}.new_smartbtn_widget_chat__raiting label:hover{ all: unset;}.new_smartbtn_widget_chat__raiting label:focus{ all: unset;}.new_smartbtn_widget_chat__raiting label:active{ all: unset;}.new_smartbtn_widget_rate { \/*border: 1px solid #cccccc;*\/ float: left; -webkit-box-align: center; -ms-flex-align: center; align-items: center; \/*height: 46px;*\/ padding: 0 10px 0 10px;}.new_smartbtn_widget_rate:not(:checked) > input { position: absolute; top: -9999px;}.new_smartbtn_widget_rate:not(:checked) > label { float: right; width: 1em; overflow: hidden; white-space: nowrap; cursor: pointer; font-size: 30px; color: #ccc;}.new_smartbtn_widget_rate:not(:checked) > label:before {}.new_smartbtn_widget_rate > input:checked ~ label { color: #ffc700;}.new_smartbtn_widget_rate:not(:checked) > label:hover,.new_smartbtn_widget_rate:not(:checked) > label:hover ~ label { color: #deb217;}.new_smartbtn_widget_rate > input:checked + label:hover,.new_smartbtn_widget_rate > input:checked + label:hover ~ label,.new_smartbtn_widget_rate > input:checked ~ label:hover,.new_smartbtn_widget_rate > input:checked ~ label:hover ~ label,.new_smartbtn_widget_rate > label:hover ~ input:checked ~ label { color: #c59b08;}.new_smartbtn_widget_chat__raiting_star { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; -webkit-box-align: center; -ms-flex-align: center; align-items: center; position: absolute; right: 0; top: -25px; border: 1px solid rgba(0, 0, 0, 1); color: white; -webkit-box-flex: 1; -ms-flex: 1; flex: 1; height: 30px; font-size: 25px;}.new_smartbtn_widget_chat__body { padding: 0; padding-bottom: 5px; padding-top: 5px; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-orient: vertical; -webkit-box-direction: normal; -ms-flex-direction: column; flex-direction: column; -webkit-box-pack: justify; -ms-flex-pack: justify; justify-content: space-between; width: 100%; margin: 0; margin-top: 0;}.new_smartbtn_widget_chat__box { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-orient: vertical; -webkit-box-direction: normal; -ms-flex-direction: column; flex-direction: column; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; -webkit-box-align: center; -ms-flex-align: center; align-items: center; border: 2px dashed #e6e6e8; padding: 10px; background-color: var(--smartbtn-message-bg); border-radius: 10px; margin-bottom: 15px; width: 100% ;}.new_smartbtn_widget_chat__box_wrapper{ display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-orient: vertical; -webkit-box-direction: normal; -ms-flex-direction: column; flex-direction: column; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; -webkit-box-align: center; -ms-flex-align: center; align-items: center; padding: 20px; width: 100% ;}.new_smartbtn_widget_heading{ display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; -webkit-box-align: center; -ms-flex-align: center; align-items: center; font-size: 1em; color: var(--smartbtn-chatfont-color); line-height: 1.2; text-align: center; width: 100%; margin-bottom: 15px;}.new_smartbtn_widget_chat__socials{ display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; -webkit-box-align: center; -ms-flex-align: center; align-items: center; margin: 0 15px 0 15px; height:auto;}.new_smartbtn_widget_chat__socials .social-card { margin-right: 10px;}.new_smartbtn_widget_chat__socials .social-card:last-child { margin-right: 0;}.new_smartbtn_widget_chat__messages { \/* width: 100% !important; height: 50px; margin: 0; overflow-y: auto !important; overflow-x: hidden !important; position: relative; flex-grow: 20; overflow: auto; height: 282px; padding-bottom: 40px; *\/}.new_smartbtn_widget_chat__messages::-webkit-scrollbar { width: 6px; height: 6px;}.new_smartbtn_widget_chat__messages::-webkit-scrollbar-button { background-color: rgba(255, 255, 255, 0); opacity: 0; width: 0; height: 0;}.new_smartbtn_widget_chat__messages::-webkit-scrollbar-track { display: none;}.new_smartbtn_widget_chat__messages::-webkit-scrollbar-track-piece { background-color: white;}.new_smartbtn_widget_chat__messages::-webkit-scrollbar-thumb { background-color: #343434;}.new_smartbtn_widget_warning-message{ width: 100%; display: flex; align-items: center; justify-content: center; padding: 15px; margin-bottom: 50px;}.new_smartbtn_widget_rating-message{ width: 100%; display: flex; align-items: center; justify-content: center; padding: 15px; margin-bottom: 50px;}.new_smartbtn_widget_warning-message__message{ width: 90%; font-size: 16px; border-radius: 25px; line-height: 24px; color: #2B3036; padding: 10px 25px; background: linear-gradient(210.55deg, #EBF2F9 19.14%, #C6D7EB 154.68%); text-align: center;}.new_smartbtn_widget_rating-message__message{ width: 90%; font-size: 16px; border-radius: 25px; line-height: 24px; color: #2B3036; padding: 10px 25px; background: linear-gradient(210.55deg, #EBF2F9 19.14%, #C6D7EB 154.68%); text-align: center; display: flex; flex-direction: column; align-items: center; justify-content: space-between;}.new_smartbtn_widget_rating-message__message p { font-weight: 600; margin-bottom: 15px; color: #deb217;}.new_smartbtn_widget_operator-message { display: -webkit-box; display: -ms-flexbox; display: flex; padding: 15px; position: relative;}.new_smartbtn_widget_operator-message:last-child { margin-bottom: 50px;}.new_smartbtn_widget_operator-message__left-side { margin-right: 10px; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-orient: vertical; -webkit-box-direction: normal; -ms-flex-direction: column; flex-direction: column; -webkit-box-align: center; -ms-flex-align: center; align-items: center; \/* display: flex; justify-content: center; flex-direction: row; align-items: center; width: 70px !important; position: relative; margin: 20px 0 0 15px; *\/}.new_smartbtn_widget_operator-message__ava { border-radius: 50px; width: 100%; height: 100%; background: url(https:\/\/smartbtn.ru\/assets\/smartbtn\/img\/operator-ava.png) no-repeat;\tbackground-size: contain; background-position: center;}.new_smartbtn_widget_operator-message__typing { width: 40px; height: 40px; border: 1px solid white; border-radius: 50px; position: relative; \/* display: flex; align-items: flex-start; height: 100%; justify-content: center; *\/}.new_smartbtn_widget_operator-message__typing_one { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: start; -ms-flex-align: start; align-items: flex-start; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; width: 5px; height: 5px; border-radius: 50%; background-color: #f2469a; margin-right: 4px; margin-top: 2px;}.new_smartbtn_widget_operator-message__typing_two { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: start; -ms-flex-align: start; align-items: flex-start; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; width: 7px; height: 7px; border-radius: 50%; background-color: #f2469a; margin-right: 4px;
3 margin-top: 1px;}.new_smartbtn_widget_operator-message__typing_three { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: start; -ms-flex-align: start; align-items: flex-start; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; width: 9px; height: 9px; border-radius: 50%; background-color: #f2469a; margin-right: 4px;}.new_smartbtn_widget_operator-message__right-side { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; align-items: center; -webkit-box-orient: vertical; -webkit-box-direction: normal; -ms-flex-direction: column; flex-direction: column; word-wrap: break-word; width: 100% !important; margin: 0 0 0 auto; padding: 0;}.new_smartbtn_widget_operator-message__info { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; align-items: center; -webkit-box-pack: justify; -ms-flex-pack: justify; justify-content: space-between; margin:0; width:100%;}.new_smartbtn_widget_operator-message__name { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; align-items: center; font-size: .813em; line-height: 1.2; color: #b7bbbe;}.new_smartbtn_widget_operator-message__time { color: #454D57; font-size: 10px; margin-top: 5px; line-height: 10px; \/* display: flex; align-items: center; font-size: .813em; font-weight: 400; font-family: Gilroy, sans-serif; line-height: 1.2; color: #f2469a; *\/}.new_smartbtn_widget_operator-message__message { \/*word-break: break-all;*\/ overflow-wrap: anywhere; word-break: break-word; border-radius: 25px; padding: 10px 25px; max-width: 92.5%; font-size: 12px; background: -o-linear-gradient(239.45deg, #EBF2F9 19.14%, #C6D7EB 154.68%); background: linear-gradient(210.55deg, #EBF2F9 19.14%, #C6D7EB 154.68%); color: black; line-height: 24px; border-top: 1px solid white; border-left: 1px solid white; margin-right: auto; \/* display: flex; align-items: center; justify-content: flex-start; background-color: var(--smartbtn-message-bg-operator); border: 1px solid #f5f7f9; padding: 5px 15px 5px 15px; font-size: 1em; line-height: 1.4; -webkit-border-radius: 10px; border-radius: 10px; color: var(--smartbtn-chatfont-color-operator); word-break: break-all; word-wrap: break-word; width: 100% !important; margin: 0; text-align: start; *\/}.new_smartbtn_widget_operator-message__heart{ cursor: pointer; position: relative; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; align-items: center; -webkit-box-pack: start; -ms-flex-pack: start; justify-content: flex-start; padding: 5px 5px 5px 5px; font-size: 35px; margin: 5px 10px 0 0; opacity: 0.2;}.new_smartbtn_widget_operator-message__heart:hover{ opacity:0.8; color: #deb217;}.new_smartbtn_widget_operator-message__emodji { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; align-items: center; position: absolute; top: -35px; right: 0; background-color: #e4d8de; border: 1px solid #8d8f91; border-radius: 10px; margin-right: -35px; -webkit-box-pack: justify; -ms-flex-pack: justify; justify-content: space-between; padding: 5px;}.new_smartbtn_widget_operator-message__emodji_1 { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; align-items: center; font-size: .813em; line-height: 1.2; margin: 0 5px 0 5px; padding: 1px; width: 20px; height: 20px; background: url(https:\/\/smartbtn.ru\/assets\/smartbtn\/img\/emodji\/heart.svg) no-repeat; fill: #fa0707; background-size: contain; opacity: 0.8; background-position: center;}.new_smartbtn_widget_operator-message__emodji_2 { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; align-items: center; font-size: .813em; line-height: 1.2; margin: 0 5px 0 5px; padding: 1px;
3 width: 20px; height: 20px; background: url(https:\/\/smartbtn.ru\/assets\/smartbtn\/img\/emodji\/sad.svg) no-repeat; fill: #fa0707; background-size: contain; opacity: 0.8; background-position: center;}.new_smartbtn_widget_operator-message__emodji_3 { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; align-items: center; font-size: .813em; line-height: 1.2; margin: 0 5px 0 5px; padding: 1px; width: 20px; height: 20px; background: url(https:\/\/smartbtn.ru\/assets\/smartbtn\/img\/emodji\/mad.svg) no-repeat; fill: #fa0707; background-size: contain; opacity: 0.8; background-position: center;}.new_smartbtn_widget_operator-message__emodji_4 { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; align-items: center; font-size: .813em; line-height: 1.2; margin: 0 5px 0 5px; padding: 1px; width: 20px; height: 20px; background: url(https:\/\/smartbtn.ru\/assets\/smartbtn\/img\/emodji\/happy.svg) no-repeat; fill: #fa0707; background-size: contain; opacity: 0.8; background-position: center;}.new_smartbtn_widget_operator-message__emodji_5 { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; align-items: center; font-size: .813em; line-height: 1.2; margin: 0 5px 0 5px; padding: 1px; widows: 20px; height: 20px; background: url(https:\/\/smartbtn.ru\/assets\/smartbtn\/img\/emodji\/suspicious.svg) no-repeat; fill: #fa0707; background-size: contain; opacity: 0.8; background-position: center;}.new_smartbtn_widget_client-message { display: -webkit-box; display: -ms-flexbox; display: flex; padding: 15px; position: relative; \/* display: flex; flex-direction: row; align-items: flex-start; margin: 0; padding: 0; margin-bottom: 30px; width: 100% !important; -webkit-box-orient: horizontal; *\/}.new_smartbtn_widget_client-message:last-child { margin-bottom: 50px;}.new_smartbtn_widget_client-message__right-side { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; -webkit-box-orient: horizontal; -webkit-box-direction: normal; -ms-flex-direction: row; flex-direction: row; -webkit-box-align: center; -ms-flex-align: center; align-items: center; width:70px !important; position: relative; margin: 20px 15px 0 0;}.new_smartbtn_widget_client-message__ava { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; -webkit-box-align: center; -ms-flex-align: center; align-items: center; width: 40px; height: 40px; border-radius: 50%; overflow: hidden; background: url(https:\/\/smartbtn.ru\/assets\/smartbtn\/img\/client-ava.png) no-repeat;\tbackground-size: contain; background-position: center;}.new_smartbtn_widget_client-message__typing { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: start; -ms-flex-align: start; align-items: flex-start; height: 100%; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center;}.new_smartbtn_widget_client-message__typing_one { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: start; -ms-flex-align: start; align-items: flex-start; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; width: 5px; height: 5px; border-radius: 50%; background-color: #1a3cac; margin-left: 4px; margin-top: 2px;}.new_smartbtn_widget_client-message__typing_two { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: start; -ms-flex-align: start; align-items: flex-start; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; width: 7px; height: 7px; border-radius: 50%; background-color: #1a3cac; margin-left: 4px;
3 margin-top: 1px;}.new_smartbtn_widget_client-message__typing_three { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: start; -ms-flex-align: start; align-items: flex-start; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; width: 9px; height: 9px; border-radius: 50%; background-color: #1a3cac; margin-left: 4px;}.new_smartbtn_widget_client-message__left-side { width: 100%; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-pack: end; -ms-flex-pack: end; justify-content: flex-end; \/* display: flex; align-items: center; flex-direction: column; word-wrap: break-word; width: 100% !important; margin: 0 auto 0 0; padding: 0; *\/}.new_smartbtn_widget_client-message__info { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; align-items: center; -webkit-box-pack: justify; -ms-flex-pack: justify; justify-content: space-between; margin: 0; margin-bottom: 5px; width:100%;}.new_smartbtn_widget_client-message__name { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; align-items: center; font-size: .813em; line-height: 1.2; color: #b7bbbe;}.new_smartbtn_widget_client-spin_loader{ border: 5px solid #f3f3f3; border-radius: 50%; border-top: 5px solid #2A8CB7; border-right: 5px solid #3BA49D; border-bottom: 5px solid #FFCF86; border-left: 5px solid #F6469D; width: 3px; height: 3px; -webkit-animation: new_smartbtn_widget_not_send_message-loading-animation 2s linear infinite; animation: new_smartbtn_widget_not_send_message-loading-animation 2s linear infinite;}@-webkit-keyframes new_smartbtn_widget_not_send_message-loading-animation { 0% { -webkit-transform: rotate(0deg); } 100% { -webkit-transform: rotate(360deg); }}@keyframes new_smartbtn_widget_not_send_message-loading-animation { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); }}.new_smartbtn_widget_client-message_file_socket_error{ width: 70px; height: 70px; background-color: inherit; display: flex; justify-content: center; align-items: center;}#new_smartbtn_widget_client_file-error-send-loading { display: inline-block; width: 50px; height: 50px; border: 5px solid rgba(255, 255, 255, 0.3); border-radius: 50%; border-top-color: whitesmoke; animation: new_smartbtn_widget_not_send_message-loading-animation 1s ease-in-out infinite; -webkit-animation: new_smartbtn_widget_not_send_message-loading-animation 1s ease-in-out infinite;}@keyframes new_smartbtn_widget_not_send_message-loading-animation { to { -webkit-transform: rotate(360deg); }}@-webkit-keyframes new_smartbtn_widget_not_send_message-loading-animation { to { -webkit-transform: rotate(360deg); }}.new_smartbtn_widget_client_file-error-send-loading__wrapper { position: relative; display: flex; align-items: center; justify-content: center; width: 60px; height: 60px; border-radius: 13px;}.new_smartbtn_widget_client_file-error-send-loading-x__button { position: absolute; cursor: pointer; color: red; font-weight: 800; font-size: 30px;}.new_smartbtn_widget_client-message__time { position: absolute; bottom: 0px; right: 15px; font-size: 10px; line-height: 10px; color: #454D57; \/* display: flex; align-items: center; font-size: .813em; line-height: 1.2; color: #f2469a; *\/}.new_smartbtn_widget_client-message__message { word-break: break-all; border-radius: 25px; padding: 10px 25px; max-width: 90%; font-size: 12px; background: -o-linear-gradient(295.53deg, #7DF6FF 0%, #45A6FF 87.01%); background: linear-gradient(154.47deg, #7DF6FF 0%, #45A6FF 87.01%); color: black; line-height: 24px; \/*margin-left: auto;*\/ width: auto; height: auto; border-top: 1px solid white; border-left: 1px solid white; \/* display: flex; align-items: center; justify-content: flex-end; background-color: var(--smartbtn-message-bg); border: 1px solid #f5f7f9; padding: 5px 15px 5px 15px; font-size: 1em; line-height: 1.4; -webkit-border-radius: 10px; border-radius: 10px; color: var(--smartbtn-chatfont-color); word-break: break-all; word-wrap: break-word; width: 100% !important; margin: 0; border: 1px solid #f5f7f9; text-align: end; *\/}.new_smartbtn_widget_client-message__message img { max-width: 100%;}.new_smartbtn_widget_chat__footer { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; align-items: center; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; -webkit-box-orient: vertical; -webkit-box-direction: normal; -ms-flex-direction: column; flex-direction: column; width: 100%; margin: 0; margin-top: 0; margin-bottom: 0; z-index: 20000; background-color: var(--smartbtn-window-bg); -ms-flex-negative: 0; flex-shrink: 0;}.new_smartbtn_widget_chat__downloads a:before{ all: unset;}.new_smartbtn_widget_chat__downloads a:after{ all: unset;}.new_smartbtn_widget_chat__downloads a:hover{ font-size:20px;}.new_smartbtn_widget_chat__downloads { display: -webkit-box; display: -ms-flexbox; display: flex; cursor: pointer; -webkit-box-align: center; -ms-flex-align: center; align-items: center; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; padding-top: 5px; width: 100%; margin-top: 0; margin-bottom: 3px; height: 20px; color: black; font-size: 14px; z-index: 20000;}\/*.new_smartbtn_widget_chat__messages::-webkit-scrollbar{ width: 6px; height: 6px; border-radius: 10px;\tbackground-color: #eaeaf3 ;}.new_smartbtn_widget_chat__messages::-webkit-scrollbar-track{\t-webkit-box-shadow: inset 0 0 6px #fcf7f9 ;\tborder-radius: 10px; background-color:white; border-left: 3px solid white; border-right: 3px solid white;}.new_smartbtn_widget_chat__messages::-webkit-scrollbar-thumb{ border-radius: 10px;\t-webkit-box-shadow: inset 0 0 px white ;\tbackground-color: #8e8d8f ;}.new_smartbtn_widget_chat__messages::-webkit-scrollbar-corner{ border-radius: 10px;\tbackground-color: white;}*\/.new_smartbtn_widget_water-sign { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; align-items: center; -webkit-box-pack:center; -ms-flex-pack:center; justify-content:center; font-size: .813em; text-align: center; font-weight: 700; color: #d5d8df; margin-top: 0px; padding-top: 10px; margin-bottom: 0; width: 100%; z-index: 20000; height: 30px; background-color: var(--smartbtn-window-bg);}.new_smartbtn_widget_message-area { width: 100% !important; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; align-items: center; margin-left: 20px;}.new_smartbtn_widget_message-area__other-btn { display: none; \/* display: flex; align-items: center; justify-content: center; margin: 7px 7px 7px 7px; cursor: pointer; width: 45px; height: 45px; background: url(https:\/\/smartbtn.ru\/assets\/smartbtn\/img\/skrepka.svg) no-repeat;\tbackground-size: contain; background-position: center; opacity: 0.3; *\/}\/*.new_smartbtn_widget_message-area__other-btn:hover { opacity: 0.5;}*\/.new_smartbtn_widget_message-area__other-btn_icon { width: 20p
3x; height: 20px; fill: #7a7d83; -webkit-transition: .2s; -o-transition: .2s; transition: .2s}.new_smartbtn_widget_message-area__other-btn_icon:hover { fill: #3b404b}.new_smartbtn_widget_message-area_wrapper__textarea { margin: 0; width: 100% !important; margin-right: 10px; margin-left: 0; overflow-y: auto; line-height: 0; height: 100%;}.new_smartbtn_widget_message-area__files_w { width: 50%; max-width: 50%; max-height: 200px; overflow: auto; position: absolute; bottom: 100%; left: 0; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-orient: vertical; -webkit-box-direction: normal; -ms-flex-direction: column; flex-direction: column; -webkit-box-align: center; -ms-flex-align: center; align-items: center; -webkit-box-pack: start; -ms-flex-pack: start; justify-content: flex-start; background-color: white; word-break: break-all;}.new_smartbtn_widget_message-area__files_w::-webkit-scrollbar { width: 6px; height: 6px;}.new_smartbtn_widget_message-area__files_w::-webkit-scrollbar-button { background-color: rgba(255, 255, 255, 0); opacity: 0; width: 0; height: 0;}.new_smartbtn_widget_message-area__files_w::-webkit-scrollbar-track { display: none;}.new_smartbtn_widget_message-area__files_w::-webkit-scrollbar-track-piece { background-color: white;}.new_smartbtn_widget_message-area__files_w::-webkit-scrollbar-thumb { background-color: #FECE03;}.new_smartbtn_widget_message-area__files { padding-left: 10px; padding-right: 10px; margin-bottom: 10px; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; align-items: center; -webkit-box-pack: justify; -ms-flex-pack: justify; justify-content: space-between; width: 100%;}.new_smartbtn_widget_message-area__files:first-child { margin-top: 10px;}.new_smartbtn_widget_message-area__files_name_w{ display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-orient: horizontal; -webkit-box-direction: normal; -ms-flex-direction: row; flex-direction: row; -webkit-box-align: center; -ms-flex-align: center; align-items: center; -webkit-box-pack: justify; -ms-flex-pack: justify; justify-content: space-between; width: 100%; margin: 0;}.new_smartbtn_widget_message-area__files_name{ line-height: 16px; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; align-items: center; margin: 0; font-family: \"Roboto\", sans-serif; font-size: 12px; color: #6E7191;}.new_smartbtn_widget_message-area__files_object{ display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; align-items: center; margin: 0; width: auto; height: auto; max-width: 50px; max-height: 50px; margin-left: 10px;}.new_smartbtn_widget_message-area__files_close{ display: -webkit-box; display: -ms-flexbox; display: flex; cursor: pointer; -webkit-box-align: center; -ms-flex-align: center; align-items: center; margin: 0; padding: 0 5px; -webkit-transition: all 0.3s; -o-transition: all 0.3s; transition: all 0.3s; display: block; color: #6E7191;}.new_smartbtn_widget_message-area__files_close:hover{ color: #F64668;}.new_smartbtn_widget_message-area__textarea { font-size: 13px; line-height: 16px; outline: none; background-color: white; border: none; color: #343434; resize: none; width: 100%; height: 100%; border-radius: 15px; padding: 5px 10px; \/* position: relative; resize: none; width: 100% !important; padding: 15px; border: 1px solid #493f3f; -webkit-border-radius: 5px; border-radius: 5px; -webkit-transition: .2s; -o-transition: .2s; transition: .2s; margin-right: 0; margin-left: 0; padding-right: 0; font-style: normal ;\tfont-weight: normal;\tfont-size: 12px;\tline-height: 14px ; outline: none ; overflow-y: auto; color: #a7aaaf; word-break: break-all; word-wrap: break-word; *\/}\/* Firefox has no ::-webkit pseudo-elements; these two properties are the whole API it offers, and they render the thumb inside the padding box already. MUST stay behind this @supports guard. Chromium also implements scrollbar-width\/scrollbar-color, and setting either one there DISABLES the ::-webkit-scrollbar pseudo-elements entirely \u2014 measured: the field's scrollbar went from occupying 6px to 0px and fell back to the default overlay, silently throwing away the inset thumb below. The guard is true only where ::-webkit-scrollbar is unsupported, i.e. Firefox. *\/@supports not selector(::-webkit-scrollbar) { .new_smartbtn_widget_message-area__textarea { scrollbar-width: thin; scrollbar-color: #FECE03 transparent; }}.new_smartbtn_widget_message-area__textarea::-webkit-scrollbar { width: 10px; height: 10px;}.new_smartbtn_widget_message-area__textarea::-webkit-scrollbar-button { background-color: rgba(255, 255, 255, 0); opacity: 0; width: 0; height: 0;}.new_smartbtn_widget_message-area__textarea::-webkit-scrollbar-track { background: transparent;}\/* Vertical only. The same declaration on the shared track selector would also apply to a horizontal bar, where a top+bottom margin inside a 10px-tall bar collapses the runway to nothing. *\/.new_smartbtn_widget_message-area__textarea::-webkit-scrollbar-track:vertical { margin: 6px 0;}.new_smartbtn_widget_message-area__textarea::-webkit-scrollbar-track-piece { background: transparent;}\/* Input scrollbar: keep it INSIDE the rounded field. The textarea is a 15px-radius white pill, but a scrollbar is laid out against the element's edge, so a full-height square thumb ran straight into the rounded corners and read as a bar sticking out of the oval \u2014 which is exactly what an owner reported on 2026-09-01 with a long message typed in. - the thumb is inset on every side by a transparent border plus background-clip, so the painted part never touches the element edge or the corner arcs -- 2px at the sides, 3px at the ends; - it is rounded to match, so it reads as part of the pill; - the track is inset 6px top and bottom, so the runway itself starts below the top curve and ends above the bottom one. Widened 6px -> 10px because an inset thumb needs the room; the visible thumb stays 6px wide, exactly as before. HOW MUCH INSET IS ACTUALLY NEEDED (why not the full 15px corner radius). The thumb is held 2px in from the right edge by its side border, so it does not have to clear the whole arc -- only the stretch where the arc is still more than 2px in from the straight edge. For radius R=15 that ends at y = R - sqrt(R^2 - (R-2)^2) = 15 - sqrt(225-169) = 7.52px from each end of the field. The 6px track margin plus the thumb's own 3px end border puts the painted thumb 9px in, clearing it by ~1.5px at both ends. AND WHY THE INSET IS SPLIT BETWEEN THE TRACK AND THE THUMB rather than all being track margin. Chromium enforces an intrinsic minimum thumb length that this field is small enough to hit, and a track shorter than it leaves the thumb with nowhere to go. Measured at an 1100px viewport (the 46px field), scrollTop 0 vs scrollTop 92 (its maximum) painted the thumb in the IDENTICAL place at a 26px track -- frozen; the first attempt at this fix used a 15px margin, so its track was 16px and it was frozen even harder, with the thumb centred and overhanging both ends. A scrollbar that cannot move is decoration, not an affordance. Keeping the track margin at 6px leaves a track long enough to move in at every breakpoint, and the last 3px of inset is bought from the thumb'
3s own border, which costs no runway at all: 1100px viewport field 46px track 34px -> ~8px of travel 520px viewport field 50px track 38px -> ~12px of travel 375px viewport field 75px track 63px -> ~37px of travel min-height is a floor for browsers whose intrinsic minimum is smaller than Chromium's; at 20px it stays well under the shortest of those tracks (34px), so it can never be the thing that freezes the thumb. *\/.new_smartbtn_widget_message-area__textarea::-webkit-scrollbar-thumb { background-color: #FECE03; border-radius: 10px; border: solid transparent; border-width: 3px 2px; background-clip: padding-box; min-height: 20px;}.new_smartbtn_widget_message-area__textarea::-webkit-scrollbar-thumb:hover { background-color: #E8BC03;}\/*.new_smartbtn_widget_message-area__textarea:focus { border-color: #949494; outline: 0; -moz-appearance: none; border: 1px solid #999; color: #18191a;}*\/.new_smartbtn_widget_message-area__textarea::-webkit-input-placeholder { \/* color: #88898a; font-size: 1.2em; font-style: italic; *\/ color: #343434;}.new_smartbtn_widget_message-area__textarea::-moz-placeholder { \/* color: #88898a; font-size: 1.2em; font-style: italic; *\/ color: #343434;}.new_smartbtn_widget_message-area__textarea:-ms-input-placeholder { \/* color: #88898a; font-size: 1.2em; font-style: italic; *\/ color: #343434;}.new_smartbtn_widget_message-area__textarea::-ms-input-placeholder { \/* color: #88898a; font-size: 1.2em; font-style: italic; *\/ color: #343434;}.new_smartbtn_widget_message-area__textarea::placeholder { \/* color: #88898a; font-size: 1.2em; font-style: italic; *\/ color: #343434;}.new_smartbtn_widget_message-area__send-btn { background: -o-linear-gradient(1.67deg, #FECE03 -7.64%, #EBBF02 145.94%); background: linear-gradient(88.33deg, #FECE03 -7.64%, #EBBF02 145.94%); outline: none; border: none; min-width: 36px; height: 36px; padding: 11px; border-radius: 100px; cursor: pointer; -webkit-transition: all 0.3s; -o-transition: all 0.3s; transition: all 0.3s; \/*\twidth: 45px;\theight: 45px;\tbackground: linear-gradient(138.87deg, #7EDAFF -4.53%, #686EFF 24.55%, #7F5AF9 53.49%, #FF4DC3 97.54%) !important;\tbox-shadow: 0px 60px 70px rgba(0, 0, 0, 0.25);\tborder-radius: 50px ;\tborder: none ;\tcursor: pointer;\tposition: absolute ;\ttop: 50% ;\tright: 35px;\tmargin-top: -23px; *\/}.new_smartbtn_widget_message-area__send-btn:after { \/* content: \"\" !important; background-image: url(https:\/\/smartbtn.ru\/assets\/smartbtn\/img\/send-btn.svg) !important;\tbackground-repeat: no-repeat ;\tbackground-position: center ;\ttop: 50%;\tleft: 50%;\twidth: 23px;\theight: 18px;\tdisplay: block;\tposition: absolute;\tmargin-left: -10px;\tmargin-top: -9px; *\/}.new_smartbtn_widget_message-area__send-btn_icon { \/* fill: #fff; width: 25px; height: 25px *\/}.new_smartbtn_widget_message-area__send-btn:hover { -webkit-box-shadow: 0 0 5px 0 #ebbf02; box-shadow: 0 0 5px 0 #ebbf02; \/* opacity: .9; cursor: pointer; *\/}.new_smartbtn_widget_no_scroll_body_0{ border-right: 0px solid rgba(245, 24, 145,0);}.new_smartbtn_widget_no_scroll_body_1{ border-right: 1px solid rgba(245, 24, 145,0);}.new_smartbtn_widget_no_scroll_body_2{ border-right: 2px solid rgba(245, 24, 145,0);}.new_smartbtn_widget_no_scroll_body_3{ border-right: 3px solid rgba(245, 24, 145,0);}.new_smartbtn_widget_no_scroll_body_4{ border-right: 4px solid rgba(245, 24, 145,0);}.new_smartbtn_widget_no_scroll_body_5{ border-right: 5px solid rgba(245, 24, 145,0);}.new_smartbtn_widget_no_scroll_body_6{ border-right: 6px solid rgba(245, 24, 145,0);}.new_smartbtn_widget_no_scroll_body_7{ border-right: 7px solid rgba(245, 24, 145,0);}.new_smartbtn_widget_no_scroll_body_8{ border-right: 8px solid rgba(245, 24, 145,0);}.new_smartbtn_widget_no_scroll_body_9{ border-right: 9px solid rgba(245, 24, 145,0);}.new_smartbtn_widget_no_scroll_body_10{ border-right: 10px solid rgba(245, 24, 145,0);}.new_smartbtn_widget_no_scroll_body_11{ border-right: 11px solid rgba(245, 24, 145,0);}.new_smartbtn_widget_no_scroll_body_12{ border-right: 12px solid rgba(245, 24, 145,0);}.new_smartbtn_widget_no_scroll_body_13{ border-right: 13px solid rgba(245, 24, 145,0);}.new_smartbtn_widget_no_scroll_body_14{ border-right: 14px solid rgba(245, 24, 145,0);}.new_smartbtn_widget_no_scroll_body_15{ border-right: 15px solid rgba(245, 24, 145,0);}.new_smartbtn_widget_no_scroll_body_16{ border-right: 16px solid rgba(245, 24, 145,0);}.new_smartbtn_widget_no_scroll_body_17{ border-right: 17px solid rgba(245, 24, 145,0);}.new_smartbtn_widget_no_scroll_body_18{ border-right: 18px solid rgba(245, 24, 145,0);}.new_smartbtn_widget_no_scroll_body_19{ border-right: 19px solid rgba(245, 24, 145,0);}.new_smartbtn_widget_no_scroll_body_20{ border-right: 20px solid rgba(245, 24, 145,0);}.new_smartbtn_widget_no_scroll_body_21{ border-right: 21px solid rgba(245, 24, 145,0);}.new_smartbtn_widget_no_scroll_body_22{ border-right: 22px solid rgba(245, 24, 145,0);}.new_smartbtn_widget_no_scroll_body_23{ border-right: 23px solid rgba(245, 24, 145,0);}.new_smartbtn_widget_no_scroll_body_24{ border-right: 24px solid rgba(245, 24, 145,0);}.new_smartbtn_widget_no_scroll_body_25{ border-right: 25px solid rgba(245, 24, 145,0);}.new_smartbtn_widget_chat__socials .new_smartbtn_widget_social-card { margin-right: 10px;}.new_smartbtn_widget_chat__socials .new_smartbtn_widget_social-card:last-child { margin-right: 0;}.new_smartbtn_widget_social-card { border-radius: 5px; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-orient: horizontal; -webkit-box-direction: normal; -ms-flex-direction: row; flex-direction: row; -ms-flex-wrap: nowrap; flex-wrap: nowrap; -webkit-box-align: center; -ms-flex-align: center; align-items: center; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; color: #333; font-family: Gilroy, sans-serif; text-decoration: none; font-weight: 700; -webkit-transition: .2s; -o-transition: .2s; transition: .2s; overflow-x: hidden; margin-right: 4px; min-width: 40px;}.new_smartbtn_widget_social-card:last-child { margin-right: 0;}.new_smartbtn_widget_social-card__icon { width: 40px !important; height: 40px !important; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; -webkit-box-align: center; -ms-flex-align: center; align-items: center; border-radius: 50%;}.new_smartbtn_widget_social-card__icon .new_smartbtn_widget_icon { width: 25px !important; height: 25px !important; fill: #fff;}.new_smartbtn_widget_social-card .new_smartbtn_widget_vk-icon { background-color: rgb(76, 108, 145);}.new_smartbtn_widget_social-card .new_smartbtn_widget_tg-icon { background-color: rgb(55, 174, 226);}.new_smartbtn_widget_social-card .new_smartbtn_widget_fb-icon { background-color: rgb(24, 119, 242);}.new_smartbtn_widget_social-card .new_smartbtn_widget_ok-icon { background-color: rgb(246, 134, 52);}.new_smartbtn_widget_social-card .new_smartbtn_widget_wa-icon { background-color: rgb(37, 211, 102);}.new_smartbtn_widget_social-card .new_smartbtn_widget_vb-icon { background-color: rgb(127, 77, 160);}\/*.new_smartbtn_widget_iphone-btn { cursor: pointer; display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; -webkit-box-pack: center;
3 -webkit-justify-content: center; -ms-flex-pack: center; justify-content: center; -webkit-box-align: center; -webkit-align-items: center; -ms-flex-align: center; align-items: center; width: 60px; height: 100px; border: 5px solid #e3e0f6; -webkit-border-radius: 15px; border-radius: 15px; -webkit-transition: .4s; -o-transition: .4s; transition: .4s; background-image: -webkit-linear-gradient(315deg, #6b96f3, #dd52c4); background-image: -o-linear-gradient(315deg, #6b96f3, #dd52c4); background-image: linear-gradient(135deg, #6b96f3, #dd52c4)}*\/.new_smartbtn_widget_vibrated { -webkit-animation: vebration .5s linear infinite; animation: vebration .5s linear infinite}.new_smartbtn_widget_btn-hide { \/**\/}.new_smartbtn_widget_iphone-btn::after { \/* content: \"\"; position: absolute; width: 30px; height: 5px; -webkit-border-bottom-right-radius: 10px; border-bottom-right-radius: 10px; -webkit-border-bottom-left-radius: 10px; border-bottom-left-radius: 10px; background-color: #e3e0f6; top: 0; left: 50%; -webkit-transform: translateX(-50%); -ms-transform: translateX(-50%); transform: translateX(-50%) *\/}\/*.new_smartbtn_widget_iphone-btn--fixed { position: fixed; right: 20px; bottom: 20px; z-index: 19999;}*\/.new_smartbtn_widget_icon_message { fill: #e3e0f6; display:-webkit-box; display:-ms-flexbox; display:flex; -ms-flex-item-align: center; align-self: center; margin: 30px auto; width: 25px; height: 25px; z-index: 20000;}@-webkit-keyframes vebration { 0% { -webkit-transform: translateY(0); transform: translateY(0); } 25% { -webkit-transform: translateY(-15px); transform: translateY(-15px); } 50% { -webkit-transform: translateY(0); transform: translateY(0); } 75% { -webkit-transform: translateY(-15px); transform: translateY(-15px); } 100% { -webkit-transform: translateY(0); transform: translateY(0); }}@keyframes vebration { 0% { -webkit-transform: translateY(0); transform: translateY(0); } 25% { -webkit-transform: translateY(-15px); transform: translateY(-15px); } 50% { -webkit-transform: translateY(0); transform: translateY(0); } 75% { -webkit-transform: translateY(-15px); transform: translateY(-15px); } 100% { -webkit-transform: translateY(0); transform: translateY(0); }}.new_smartbtn_widget_view_mobile { opacity: 0; max-height: 100vh; height: 70vh; left: 0; bottom: 300%; width: 100% !important; border: none; margin-right: 0; margin: 0;}.new_smartbtn_widget_operator-message__payment{ display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; align-items: center; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; background-color: var(--smartbtn-message-bg-operator); border: 1px solid #f5f7f9; padding: 5px 15px 5px 15px; font-size: 1.3em; line-height: 1.4; border-radius: 10px; color: var(--smartbtn-chatfont-color-operator); word-break: break-all; word-wrap: break-word; margin: auto; text-align: center; cursor: pointer;}.new_smartbtn_widget_more-btn_hide_menu{ display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-orient: horizontal; -webkit-box-direction: normal; -ms-flex-direction: row; flex-direction: row; margin: 0; width: 120px; height: 45px; -webkit-box-align: center; -ms-flex-align: center; align-items: center; -webkit-box-pack: end; -ms-flex-pack: end; justify-content: flex-end; background-color: #ced1d8; margin-left: auto;}.new_smartbtn_widget_more-btn_hide_menu_price{ display: -webkit-box; display: -ms-flexbox; display: flex; margin: 0; -webkit-box-align: center; -ms-flex-align: center; align-items: center; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; margin-left: auto;}.new_smartbtn_widget_more-btn_hide_menu_sotcet{ display: -webkit-box; display: -ms-flexbox; display: flex; margin: auto 0 auto 0; -webkit-box-align: center; -ms-flex-align: center; align-items: center; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center;}.new_smartbtn_widget_message-area__files_object_chat{ display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; align-items: center; -webkit-box-pack: start; -ms-flex-pack: start; justify-content: flex-start; background-color: var(--smartbtn-message-bg-operator); border: 1px solid #f5f7f9; padding: 5px 15px 5px 15px; font-size: 1em; line-height: 1.4; border-radius: 10px; color: var(--smartbtn-chatfont-color-operator); word-break: break-all; word-wrap: break-word; width: 100% !important; margin: 0; text-align: start;}.new_smartbtn_widget_message-area__files_object_chat_client_not{ display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; align-items: center; -webkit-box-pack: start; -ms-flex-pack: start; justify-content: flex-start; background-color: green; border: 1px solid #f5f7f9; padding: 5px 15px 5px 15px; font-size: 1em; line-height: 1.4; border-radius: 10px; color: white; word-break: break-all; word-wrap: break-word; width: 100% !important; margin: 0; text-align: start;}.new_smartbtn_widget_message-area__files_object_chat_operator_not{ display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; align-items: center; -webkit-box-pack: start; -ms-flex-pack: start; justify-content: flex-start; background-color: rgb(173, 121, 10); border: 1px solid #f5f7f9; padding: 5px 15px 5px 15px; font-size: 1em; line-height: 1.4; border-radius: 10px; color: white; word-break: break-all; word-wrap: break-word; width: 100% !important; margin: 0; text-align: start;}\/*\/start\/ styles for button call back \u0421\u0442\u0438\u043b\u0438 \u0434\u043b\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u0437\u0432\u043e\u043d\u043a\u0430*\/.new_smartbtn_widget-call-back__container { background-color: white; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-orient: vertical; -webkit-box-direction: normal; -ms-flex-direction: column; flex-direction: column; -webkit-box-align: start; -ms-flex-align: start; align-items: flex-start; margin-bottom: 5px;}.new_smartbtn_widget-call-back-btn { background-color: #f9429d; cursor: pointer; padding: 5px 10px; color: white; border-bottom-right-radius: 5px; border-top: 1px solid black;}.new_smartbtn_widget-call-back-btn__container { background-color: white; width: 100%; padding: 35px 15px 15px 15px; -webkit-box-orient: vertical; -webkit-box-direction: normal; -ms-flex-direction: column; flex-direction: column; position: relative; display: none;}.new_smartbtn_widget-call-back-btn__container_flex { display: -webkit-box; display: -ms-flexbox; display: flex;}.new_smartbtn_widget-call-back-btn__container-close { position: absolute; top: 6px; right: 10px; font-size: 34px; color: rgb(100, 100, 100); line-height: 20px; cursor: pointer; -webkit-transform: rotate(45deg); -ms-transform: rotate(45deg); transform: rotate(45deg);}.new_smartbtn_widget-call-back-btn__container__input { padding: 5px 10px; width: 100%; outline: none; border-radius: 5px; border: 1px solid #f9429d; margin-bottom: 15px; height: 32px;}
3.new_smartbtn_widget-call-back-btn__container__input::-webkit-outer-spin-button,.new_smartbtn_widget-call-back-btn__container__input::-webkit-inner-spin-button { -webkit-appearance: none;}.new_smartbtn_widget-call-back-btn__container__input-submit { cursor: pointer; background-color: #f9429d; padding: 7px 12px; color: white; border-radius: 5px; outline: none; width: 120px;}.new_smartbtn_widget-call-back-btn__container-errors { color: tomato; margin-top: 10px; display: none;}.new_smartbtn_widget-call-back-btn__container-errors-block { display: block;}\/*\/end\/ styles for button call back \u0421\u0442\u0438\u043b\u0438 \u0434\u043b\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u0437\u0432\u043e\u043d\u043a\u0430*\/.smartbtn-chat-main-animation-spiralAnim * { line-height: 0; margin: 0; padding: 0; -webkit-box-sizing: border-box; box-sizing: border-box; font-family: \"Roboto\", sans-serif;}\/*.smartbtn-chat-main__container-active { display: block;}.smartbtn-chat-main__container-head { background-color: #343434; padding: 15px 75px; position: relative; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-orient: vertical; -webkit-box-direction: normal; -ms-flex-direction: column; flex-direction: column; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center;}.smartbtn-chat-main__container-head-close { line-height: 12px; position: absolute; top: 15px; left: 30px; cursor: pointer;}.smartbtn-chat-main__container-head-close__svg { width: 15px; height: 15px;}*\/.smartbtn-chat-main__container-head__title { margin-bottom: 5px; font-weight: 700; font-size: 14px; line-height: 14px; text-align: center; max-width: 100%; overflow-wrap: anywhere; word-break: break-word; background: -o-linear-gradient(left, white 0%, #5e5e5e 100%); background: -webkit-gradient(linear, left top, right top, from(white), to(#5e5e5e)); background: linear-gradient(90deg, white 0%, #5e5e5e 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; color: white;}.smartbtn-chat-main__container-head__text { color: #EAF2FF; text-align: center; font-size: 9px; line-height: 9px; max-width: 100%; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;}.smartbtn-chat-main__container-head-operators { margin-top: 10px; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center;}.smartbtn-chat-main__container-head-operators-one-operator { width: 70px; cursor: pointer; text-align: center; margin-left: 5px; margin-right: 5px; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-orient: vertical; -webkit-box-direction: normal; -ms-flex-direction: column; flex-direction: column; -webkit-box-align: center; -ms-flex-align: center; align-items: center;}.smartbtn-chat-main__container-head-operators-one-operator-img { width: 50px; height: 50px; padding: 5px; border-radius: 100px; border: 1px solid #444444; position: relative; background-repeat: no-repeat; background-size: contain; background-position: center; transition: 300ms;}.smartbtn-chat-main__container-head-operators-one-operator-img:hover{ -webkit-box-shadow: 0 0 0 2px #99FF04; box-shadow: 0 0 0 2px #99FF04;}.smartbtn-chat-main__container-head-operators-one-operator-img--active { -webkit-box-shadow: 0 0 0 2px #42C1B8, 0 0 10px 1px rgba(66, 193, 184, 0.4); box-shadow: 0 0 0 2px #42C1B8, 0 0 10px 1px rgba(66, 193, 184, 0.4);}.smartbtn-chat-main__container-head-operators-one-operator-img.smartbtn-chat-main__container-head-operators-one-operator-img--active:hover{ -webkit-box-shadow: 0 0 0 2px #42C1B8, 0 0 12px 2px rgba(66, 193, 184, 0.55); box-shadow: 0 0 0 2px #42C1B8, 0 0 12px 2px rgba(66, 193, 184, 0.55);}.smartbtn-chat-main__container-head-operators-one-operator-name { line-height: 11px; color: #b8b8b8; font-size: 11px; margin-top: 5px; word-break: break-word;}.smartbtn-chat-main__container-head-operators-one-operator-status { position: absolute; right: 3px; bottom: 3px; width: 7px; height: 7px; background-color: #444444; border: 1px solid #444444; border-radius: 20px;}.smartbtn-chat-main__container-head-operators-one-operator-status-not-here { background-color: #FED215;}.smartbtn-chat-main__container-head-operators-one-operator-status-online { background-color: #42C1B8;}.smartbtn-chat-main__container-head-logo { position: absolute; top: 15px; right: 30px; width: 60px; height: 25px;}.smartbtn-chat-main__container-btns { padding-top: 15px; padding-left: 15px; padding-right: 15px; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-pack: justify; -ms-flex-pack: justify; justify-content: space-between; border-bottom: 1px solid #343434; background-color: white;}.smartbtn-chat-main__container-btns__btn { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; align-items: center; cursor: pointer; padding: 5px 15px 5px 5px; border-top-left-radius: 12px; border-top-right-radius: 12px; background-color: #FED215; border-top: 1px solid #343434; border-left: 1px solid #343434; border-right: 1px solid #343434; max-width: 110px; width: 110px;}.smartbtn-chat-main__container-btns__btn_padding { padding-right: 0; width: auto;}.smartbtn-chat-main__container-btns__btn-svg { background-color: #181818; min-width: 26px; width: 26px;
3 height: 26px; border-radius: 10px; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; -webkit-box-align: center; -ms-flex-align: center; align-items: center; margin-right: 5px;}.smartbtn-chat-main__container-btns__btn__text { color: #14142B; font-size: 9px; line-height: 12px; font-weight: 500;}.smartbtn-chat-main__container-btns__btn-active { background-color: white; margin-bottom: -1px;}.smartbtn-chat-main__container-btns__btn-active .smartbtn-chat-main__container-btns__btn-svg .smartbtn-chat-main__container-btns__btn-svg__svg path { stroke: #FED215;}.smartbtn-chat-main__container-chat { overflow: auto; height: 282px; display: none; background-color: white;}.smartbtn-chat-main__container-chat::-webkit-scrollbar { width: 6px; height: 6px;}.smartbtn-chat-main__container-chat::-webkit-scrollbar-button { background-color: rgba(255, 255, 255, 0); opacity: 0; width: 0; height: 0;}.smartbtn-chat-main__container-chat::-webkit-scrollbar-track { display: none;}.smartbtn-chat-main__container-chat::-webkit-scrollbar-track-piece { background-color: white;}.smartbtn-chat-main__container-chat::-webkit-scrollbar-thumb { background-color: #343434;}.smartbtn-chat-main__container-chat-message-img-status { border: 1px solid white; width: 7px; height: 7px; border-radius: 10px; position: absolute; right: 1.5px; bottom: 1.5px;}.smartbtn-chat-main__container-chat-message-img-status-no-here { background-color: #FED215;}.smartbtn-chat-main__container-socials-and-post-message { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-orient: vertical; -webkit-box-direction: normal; -ms-flex-direction: column; flex-direction: column; -webkit-box-align: center; -ms-flex-align: center; align-items: center; position: relative;}.smartbtn-chat-main__container-socials-and-post-message-socials { background: #FEFEFF; -webkit-box-shadow: -38px -17px 57px rgba(190, 202, 237, 0.26), 16px -12px 55px rgba(190, 202, 237, 0.5); box-shadow: -38px -17px 57px rgba(190, 202, 237, 0.26), 16px -12px 55px rgba(190, 202, 237, 0.5); border-top-left-radius: 12px; border-top-right-radius: 12px; width: 300px; color: #14142B; font-size: 9px; width: 100%; height: 0; position: relative;}.smartbtn-chat-main__container-socials-and-post-message-socials_flex { width: 100%; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; position: absolute; bottom: 0; left: 0; transition: all 0.3s;}.smartbtn-chat-main__container-socials-and-post-message-socials_flex-none { opacity: 0.1;}.smartbtn-chat-main__container-socials-and-post-message-socials_flex-display-none { display: none;}.smartbtn-chat-main__container-socials-and-post-message-socials__text { z-index: 1; width: 300px; line-height: 9px; font-size: 12px; position: relative; text-align: center; font-weight: 500; background-color: white; border-top-left-radius: 12px; border-top-right-radius: 12px; -webkit-box-shadow: 0 0 5px 1px #131313; box-shadow: 0 0 5px 1px #131313;}.smartbtn-chat-main__container-socials-and-post-message-socials__text-random-socials { position: absolute; left: 10px; top: 12px; display: -webkit-box; display: -ms-flexbox; display: flex; overflow: hidden; width: 36px; z-index: 1;}.smartbtn-chat-main__container-socials-and-post-message-socials__text-random-socials .new_smartbtn_widget_social-card { min-width: 15px;}.smartbtn-chat-main__container-socials-and-post-message-socials__text-random-socials .new_smartbtn_widget_social-card .new_smartbtn_widget_social-card__icon { width: 15px !important; height: 15px !important;}.smartbtn-chat-main__container-socials-and-post-message-socials__text-random-socials .new_smartbtn_widget_social-card .new_smartbtn_widget_social-card__icon .new_smartbtn_widget_icon { width: 10px !important; height: 10px !important;}.smartbtn-chat-main__container-socials-and-post-message-socials__text-for-click { position: relative; padding-top: 15px; padding-bottom: 15px; cursor: pointer; z-index: 2;}.smartbtn-chat-main__container-socials-and-post-message-socials-svg { cursor: pointer; position: absolute; right: 10px; top: 12px; width: 16px; height: 16px; background-color: #e9e6fc; border-radius: 32px; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; align-items: center; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center;}.smartbtn-chat-main__container-socials-and-post-message-socials-svg-active { -webkit-transform: rotateX(180deg); transform: rotateX(180deg);}.smartbtn-chat-main__container-socials-and-post-message-socials-l
3inks { padding-left: 20px; padding-right: 20px; margin-bottom: 10px; display: none;}.smartbtn-chat-main__container-socials-and-post-message-socials-links-active { display: -webkit-box; display: -ms-flexbox; display: flex;}.smartbtn-chat-main__container-socials-and-post-message-new-message { background-color: #343434; padding: 17px 30px 30px 30px; width: 100%; display: -webkit-box; display: -ms-flexbox; display: flex; z-index: 9; height: 100%;}.smartbtn-chat-main__container-socials-and-post-message-new-message-svg { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-orient: vertical; -webkit-box-direction: normal; -ms-flex-direction: column; flex-direction: column; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; position: relative;}.smartbtn-chat-main__container-socials-and-post-message-new-message-svg__input { display: none;}.smartbtn-chat-main__container-socials-and-post-message-new-message-svg_margin-bottom { margin-bottom: 10px; position: relative; cursor: pointer;}.smartbtn-chat-main__container-socials-and-post-message-new-message-svg_margin-bottom div { line-height: 11px;}.smartbtn-chat-main__container-socials-and-post-message-new-message-svg_margin-bottom div .smartbtn-chat-main__container-socials-and-post-message-new-message-svg-emoji__box { line-height: 24px;}.smartbtn-chat-main__container-socials-and-post-message-new-message-svg_margin-bottom__container-btn { \/**\/}.smartbtn-chat-main__container-socials-and-post-message-new-message-svg_margin-bottom__container-btn__svg { width: 18px; height: 18px;}.smartbtn-chat-main__container-socials-and-post-message-new-message-svg-label { line-height: 11px; cursor: pointer;}.smartbtn-chat-main__container-socials-and-post-message-new-message-svg-label__svg { width: 18px; height: 18px;}.smartbtn-chat-main__container-socials-and-post-message-new-message-svg-emoji { background-color: white; border-top-left-radius: 10px; padding-top: 5px; padding-left: 5px; padding-right: 5px; position: absolute; left: 20px; bottom: 30px; -webkit-box-shadow: 0 0 16px rgb(0 0 0 \/ 13%); box-shadow: 0 0 16px rgb(0 0 0 \/ 13%); -ms-flex-wrap: wrap; flex-wrap: wrap; width: 320px; max-width: 320px; height: 106px; overflow: auto; display: none;}.smartbtn-chat-main__container-socials-and-post-message-new-message-svg-emoji-active { display: -webkit-box; display: -ms-flexbox; display: flex;}.smartbtn-chat-main__container-socials-and-post-message-new-message-svg-emoji::-webkit-scrollbar { width: 6px; height: 6px;}.smartbtn-chat-main__container-socials-and-post-message-new-message-svg-emoji::-webkit-scrollbar-button { background-color: rgba(255, 255, 255, 0); opacity: 0; width: 0; height: 0;}.smartbtn-chat-main__container-socials-and-post-message-new-message-svg-emoji::-webkit-scrollbar-track { display: none;}.smartbtn-chat-main__container-socials-and-post-message-new-message-svg-emoji::-webkit-scrollbar-track-piece { background-color: white;}.smartbtn-chat-main__container-socials-and-post-message-new-message-svg-emoji::-webkit-scrollbar-thumb { background-color: #FECE03;}.smartbtn-chat-main__container-socials-and-post-message-new-message-svg-emoji__box { cursor: pointer; padding: 1.5px; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; -webkit-box-align: center; -ms-flex-align: center; align-items: center; width: 13%; font-size: 25px; margin: 8px; font-family: \"Segoe UI Emoji\" !important;}.smartbtn-chat-main__container-socials-and-post-message-new-message-svg-emoji__box:hover { background-color: #45A6FF;}.smartbtn-chat-main-animation-spiralAnim__box { display: none; width: 100%; height: 100%; overflow: hidden; background-color: white; padding: 2px; border: 1px solid #555555; border-radius: 100px;}.smartbtn-chat-main-animation-spiralAnim__img { width: 100%;}.smartbtn-chat-main-animation-spiralAnim__box-active { display: block;}\/* Continuous idle spin for the 4 \"category\" spiral presets (Communication\/ Support\/Engage\/Brand, config\/icons.php) added 2026-07-10. These presets never start the frame-cycling timer -- script.js's setInterval (~line 224) and widgetIconAnimation.blade.php's initial-load @if are both gated on data-icon-preset === 'spiral-default' -- so only frame 0 (`__box-one`\/`__box-active`) is ever visible for them: a single static image. This class spins that one image in place via a plain rotate loop. It must never be combined with `smartbtn-chat-main-animation-spiralAnim` (the rotate+shrink keyframe above, tied to the frame-cycle timer) and must never re-enable that timer. Scoped off the launcher's own `data-icon-preset` attribute (panel.blade.php line ~51) -- no Blade\/JS change needed here. `spiral-default` and every other preset are intentionally excluded from this selector list. *\/#smartbtn-chat-main-animation-spiralAnim-none[data-icon-preset=\"spiral-communication\"] .smartbtn-chat-main-animation-spiralAnim__img,#smartbtn-chat-main-animation-spiralAnim-none[data-icon-preset=\"spiral-support\"] .smartbtn-chat-main-animation-spiralAnim__img,#smartbtn-chat-main-animation-spiralAnim-none[data-icon-preset=\"spiral-engage\"] .smartbtn-chat-main-animation-spiralAnim__img,#smartbtn-chat-main-animation-spiralAnim-none[data-icon-preset=\"spiral-brand\"] .smartbtn-chat-main-animation-spiralAnim__img { -webkit-animation: smartbtn-chat-main-animation-iconSpin 3.5s linear infinite; animation: smartbtn-chat-main-animation-iconSpin 3.5s linear infinite;}@-webkit-keyframes smartbtn-chat-main-animation-iconSpin { from { -webkit-transform: rotate(0deg); transform: rotate(0deg); } to { -webkit-transform: rotate(360deg); transform: rotate(360deg); }}@keyframes smartbtn-chat-main-animation-iconSpin { from { -webkit-transform: rotate(0deg); transform: rotate(0deg); } to { -webkit-transform: rotate(360deg); transform: rotate(360deg); }}.smartbtn-chat-main-animation { width: 100px; height: 100px; z-index: 999999999; cursor: pointer; position: fixed; right: 20px; bottom: 20px; border-radius: 100px; -webkit-box-shadow: 0 0 10px 0 grey; box-shadow: 0 0 10px 0 grey;}.smartbtn-chat-main-animation-spiralAnim { -webkit-animation: smartbtn-chat-main-animation-spiralAnim 1s linear 0s 2 alternate; animation: smartbtn-chat-main-animation-spiralAnim 1s linear 0s 2 alternate;}@-webkit-keyframes smartbtn-chat-main-animation-spiralAnim { 0% { -webkit-transform: rotate(0deg) scale(1); transform: rotate(0deg) scale(1); } 50% { -webkit-transform: rotate(500deg) scale(1.2); transform: rotate(500deg) scale(1.2); } 100% { -webkit-transform: rotate(2000deg) scale(0); transform: rotate(2000deg) scale(0); }}@keyframes smartbtn-chat-main-animation-spiralAnim { 0% { -webkit-transform: rotate(0deg) scale(1); transform: rotate(0deg) scale(1); } 50% { -webkit-transform: rotate(500deg) scale(1.2); transform: rotate(500deg) scale(1.2); } 100% { -webkit-transform: rotate(2000deg) scale(0); transform: rotate(2000deg) scale(0); }}.smartbtn-chat-main-animation-spiralAnim-none { overflow: hidden;}.smartbtn-chat-main__container-active-box { display: block;}.smartbtn-chat-main__container-chat-call { padding: 15px 15px 50px 15px; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-orient: vertical; -webkit-box-direction: normal; -ms-flex-direction: column; flex-direction: column; -webkit-box-align: center; -ms-flex-align: center; align-items: center;}.smartbtn-chat-main__container-chat-call__container { width: 100%; position: relative;}.smartbtn-chat-main__container-chat-call__container-svg { position: absolute; left: 20px; top: 20px;}.smartbtn-chat-main__container-chat-call__input { line-height: 18px !important; margin-bottom: 10px !important; height: 64px !important; border: none !important; outline: none !important; border: 1px solid #D6D8E7 !important; padding: 10px 20px 10px 60px !important; border-radius: 10px !important; width: 100% !important; font-size: 16px !important; color: #14142B !important;}.smartbtn-chat-main__container-chat-call__input__textarea { resize: none !important; padding: 20px !important; height: 100px !important;}.smartbtn-chat-main__container-chat-call__input__textarea::-webkit-scrollbar { width: 6px; height: 6px;}.smartbtn-chat-main__container-chat-call__input__textarea::-webkit-scrollbar-button { background-color: rgba(255, 255, 255, 0); opacity: 0; width: 0; height: 0;}.smartbtn-chat-main__container-chat-call__input__textarea::-webkit-scrollbar-track { display: none;}.smartbtn-chat-main__container-chat-call__input__textarea::-webkit-scrollbar-track-piece { background-color: rgba(255, 255, 255, 0);}.smartbtn-chat-main__container-chat-call__input__textarea::-webkit-scrollbar-thumb { background-color: #131313;}.smartbtn-chat-main__container-chat-call__input-active { background: -o-linear-gradient(239.45deg, #EBF2F9 19.14%, #C6D7EB 154.68%); background: linear-gradient(210.55deg, #EBF2F9 19.14%, #C6D7EB 154.68%);}.smartbtn-chat-main__container-chat-call__input::-webkit-input-placeholder { color: #A0A3BD;}.smartbtn-chat-main__container-chat-call__input::-webkit-inner-spin-button { display: none;}.smartbtn-chat-main__container-chat-call__input-submit { outline: none !important; width: 100% !important; cursor: pointer !important; font-size: 16px !important; font-weight: 700 !important; color: white !important; height: 64px !important; padding: 10px 20px !important; display: -webkit-box !important; display: -ms-flexbox !important; display: flex !important; -webkit-box-pack: center !important; -ms-flex-pack: center !important; justify-content: center !important; -webkit-box-align: center !important; -ms-flex-align: center !important; align-items: center !important; text-align: center !important; background: -o-linear-gradient(left, #2A8CB7 0%, #46C1F6 100%) !important; background: -webkit-gradient(linear, left top, right top, from(#2A8CB7), to(#46C1F6)) !important; background: linear-gradient(90deg, #2A8CB7 0%, #46C1F6 100%) !important; -webkit-box-shadow: 0px 15px 30px rgb(20 102 204 \/ 16%) !important; box-shadow: 0px 15px 30px rgb(20 102 204 \/ 16%) !important; -webkit-transition: all 0.3s !important; -o-transition: all 0.3s !important; transition: all 0.3s !important; border-radius: 10px !important; -webkit-transition: all 0.3s !important; -o-transition: all 0.3s !important; transition: all 0.3s !important;}.smartbtn-chat-main__container-chat-call__input-submit:hover { -webkit-box-shadow: 0px 15px 3px rgb(20 102 204 \/ 16%) !important; box-shadow: 0px 15px 3px rgb(20 102 204 \/ 16%) !important; color: white !important;}.smartbtn-chat-main__container-chat-map { padding: 15px; width: 100%;}.smartbtn-chat-main__container-chat-map img { width: 100%;}.smartbtn-chat-main__container-chat-price { padding: 15px 15px 50px 15px; width: 100%;}.smartbtn-chat-main__container-chat-price-file { display: -webkit-box; display: -ms-flexbox; display: flex; margin-bottom: 10px;}.smartbtn-chat-main__container-chat-price-file:last-child { margin-bottom: 0;}.smartbtn-chat-main__container-chat-price-file-img { width: 64px; height: 64px; min-width: 64px; min-height: 64px; max-width: 64px; max-height: 64px; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; align-items: center; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; background-color: white; -webkit-box-shadow: 0px 14px 46px rgba(23, 104, 139, 0.11); box-shadow: 0px 14px 46px rgba(23, 104, 139, 0.11); border-radius: 10px; margin-right: 10px;}.smartbtn-chat-main__container-chat-price-file-img__img { \/**\/}.smartbtn-chat-main__container-chat-price-file__flex { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-orient: vertical; -webkit-box-direction: normal; -ms-flex-direction: column; flex-direction: column; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center;}.smartbtn-chat-main__container-chat-price-file__flex__title { font-size: 12px; line-height: 14px; font-weight: 700; color: #131313; word-break: break-all;}.smartbtn-chat-main__container-chat-price-file__flex-info { display: -webkit-box; display: -ms-flexbox; display: flex;}.smartbtn-chat-main__container-chat-price-file__flex-info-weght { margin-right: 10px; font-size: 12px; line-height: 14px; color: #131313;}.smartbtn-chat-main__container-chat-price-file__flex-info-download { text-decoration: underline; font-size: 12px; line-height: 14px; color: #ED3434; cursor: pointer;}.smartbtn-chat-main__container-chat-price-file__flex-info-download:hover { text-decoration: none;}.smartbtn-chat-main__container-head-phone-operator__container { position: absolute; bottom: 25px; right: 15px; background-color: #adff2f; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; -webkit-box-align: center; -ms-flex-align: center; align-items: center; border-radius: 15px; padding: 5px; border: 1px solid #343434; display: none;}.smartbtn-chat-main__container-head-phone-operator__container-box { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; -webkit-box-align: center; -ms-flex-align: center; align-items: center; padding-top: 5px; padding-left: 5px;}.smartbtn-chat-main__container-head-phone-operator__container-box__svg { width: 25px; height: 25px; transform: rotateY(180deg);}.smartbtn-chat-main__container-head-phone-operator__container-box__svg path { stroke: #45A6FF;}\/*-start- examples for chat*\/\/*example one*\/.smartbtn-chat-main__container-example-one { background: -o-linear-gradient(left, #984063 0%, #F6469D 100%); background: -webkit-gradient(linear, left top, right top, from(#984063), to(#F6469D)); background: linear-gradient(90deg, #984063 0%, #F6469D 100%);}.smartbtn-chat-main__container-example-one div .new_smartbtn_widget_view__header { background: -o-linear-gradient(left, #984063 0%, #F6469D 100%); background: -webkit-gradient(linear, left top, right top, from(#984063), to(#F6469D)); background: linear-gradient(90deg, #984063 0%, #F6469D 100%);}.smartbtn-chat-main__container-example-one div .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head__title { color: white; background: none; -webkit-background-clip: initial; -webkit-text-fill-color: initial;}.smartbtn-chat-main__container-example-one div .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head__text { color: white;}.smartbtn-chat-main__container-example-one div .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head-operators .smartbtn-chat-main__container-head-operators-one-operator .smartbtn-chat-main__container-head-operators-one-operator-img { border: 1px solid white;}.smartbtn-chat-main__container-example-one div .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head-operators .smartbtn-chat-main__container-head-operators-one-operator .smartbtn-chat-main__container-head-operators-one-operator-img .smartbtn-chat-main__contain
3er-head-operators-one-operator-status { background-color: #984063; border: 1px solid white;}.smartbtn-chat-main__container-example-one div .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head-operators .smartbtn-chat-main__container-head-operators-one-operator .smartbtn-chat-main__container-head-operators-one-operator-img .smartbtn-chat-main__container-head-operators-one-operator-status-not-here { background-color: #FED215;}.smartbtn-chat-main__container-example-one div .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head-operators .smartbtn-chat-main__container-head-operators-one-operator .smartbtn-chat-main__container-head-operators-one-operator-img .smartbtn-chat-main__container-head-operators-one-operator-status-online { background-color: #42C1B8;}.smartbtn-chat-main__container-example-one div .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head-operators .smartbtn-chat-main__container-head-operators-one-operator .smartbtn-chat-main__container-head-operators-one-operator-name { color: white;}\/*.smartbtn-chat-main__container-example-one div .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head-phone-operator__container { background-color: white;}*\/.smartbtn-chat-main__container-example-one div .smartbtn-chat-main__container-chat .new_smartbtn_widget_client-message .new_smartbtn_widget_client-message__left-side .new_smartbtn_widget_client-message__message { background: -o-linear-gradient(left, #F8B9A6 0%, #F68BBD 100%); background: -webkit-gradient(linear, left top, right top, from(#F8B9A6), to(#F68BBD)); background: linear-gradient(90deg, #F8B9A6 0%, #F68BBD 100%);}.smartbtn-chat-main__container-example-one div .smartbtn-chat-main__container-socials-and-post-message .smartbtn-chat-main__container-socials-and-post-message-new-message { background: -o-linear-gradient(left, #984063 0%, #F6469D 100%); background: -webkit-gradient(linear, left top, right top, from(#984063), to(#F6469D)); background: linear-gradient(90deg, #984063 0%, #F6469D 100%);}.smartbtn-chat-main__container-example-one div .smartbtn-chat-main__container-socials-and-post-message .smartbtn-chat-main__container-socials-and-post-message-new-message .smartbtn-chat-main__container-socials-and-post-message-new-message-svg .smartbtn-chat-main__container-socials-and-post-message-new-message-svg_margin-bottom div svg path { stroke: white;}.smartbtn-chat-main__container-example-one div .smartbtn-chat-main__container-socials-and-post-message .smartbtn-chat-main__container-socials-and-post-message-new-message .smartbtn-chat-main__container-socials-and-post-message-new-message-svg .smartbtn-chat-main__container-socials-and-post-message-new-message-svg-label svg path { stroke: white;}.smartbtn-chat-main__container-example-one div .smartbtn-chat-main__container-socials-and-post-message .smartbtn-chat-main__container-socials-and-post-message-new-message .new_smartbtn_widget_message-area .new_smartbtn_widget_message-area__send-btn { background: none; background-color: white;}.smartbtn-chat-main__container-example-one div .smartbtn-chat-main__container-socials-and-post-message .smartbtn-chat-main__container-socials-and-post-message-new-message .new_smartbtn_widget_message-area .new_smartbtn_widget_message-area__send-btn:hover { -webkit-box-shadow: 0 0 5px 0 white; box-shadow: 0 0 5px 0 white;}.smartbtn-chat-main__container-example-one div .smartbtn-chat-main__container-socials-and-post-message .smartbtn-chat-main__container-socials-and-post-message-new-message .new_smartbtn_widget_message-area .new_smartbtn_widget_message-area__send-btn svg path { fill: #F6469D; stroke: #F6469D;}.smartbtn-chat-main__container-example-one div .smartbtn-chat-main__container-chat .smartbtn-chat-main__container-chat-call .smartbtn-chat-main__container-chat-call__input-submit { background: -o-linear-gradient(left, #FE9677 0%, #F6469D 100%); background: -webkit-gradient(linear, left top, right top, from(#FE9677), to(#F6469D)); background: linear-gradient(90deg, #FE9677 0%, #F6469D 100%);}.smartbtn-chat-main__container-example-one div .smartbtn-chat-main__container-btns .smartbtn-chat-main__container-btns__btn { background: -o-linear-gradient(left, #FE9677 0%, #F6469D 100%); background: -webkit-gradient(linear, left top, right top, from(#FE9677), to(#F6469D)); background: linear-gradient(90deg, #FE9677 0%, #F6469D 100%);}.smartbtn-chat-main__container-example-one div .smartbtn-chat-main__container-btns .smartbtn-chat-main__container-btns__btn-active { background: none; background-color: white;}.smartbtn-chat-main__container-example-one div .smartbtn-chat-main__container-btns .smartbtn-chat-main__container-btns__btn .smartbtn-chat-main__container-btns__btn-svg { background-color: white;}.smartbtn-chat-main__container-example-one div .smartbtn-chat-main__container-btns .smartbtn-chat-main__container-btns__btn .smartbtn-chat-main__container-btns__btn-svg svg path { stroke: #131313;}.smartbtn-chat-main__container-example-one div .smartbtn-chat-main__container-btns .smartbtn-chat-main__container-btns__btn-active .smartbtn-chat-main__container-btns__btn-svg { background: none; background-color: #131313;}.smartbtn-chat-main__container-example-one div .smartbtn-chat-main__container-btns .smartbtn-chat-main__container-btns__btn-active .smartbtn-chat-main__container-btns__btn-svg svg path { stroke: white;}\/*example one*\/\/*example two*\/.smartbtn-chat-main__container-example-two { background: -o-linear-gradient(left, #42C1B8 0%, #3BA49D 100%); background: -webkit-gradient(linear, left top, right top, from(#42C1B8), to(#3BA49D)); background: linear-gradient(90deg, #42C1B8 0%, #3BA49D 100%);}.smartbtn-chat-main__container-example-two div .new_smartbtn_widget_view__header { background: -o-linear-gradient(left, #42C1B8 0%, #3BA49D 100%); background: -webkit-gradient(linear, left top, right top, from(#42C1B8), to(#3BA49D)); background: linear-gradient(90deg, #42C1B8 0%, #3BA49D 100%);}.smartbtn-chat-main__container-example-two div .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head__title { color: white; background: none; -webkit-background-clip: initial; -webkit-text-fill-color: initial;}.smartbtn-chat-main__container-example-two div .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head__text { color: white;}.smartbtn-chat-main__container-example-two div .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head-operators .smartbtn-chat-main__container-head-operators-one-operator .smartbtn-chat-main__container-head-operators-one-operator-img { border: 1px solid white;}.smartbtn-chat-main__container-example-two div .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head-operators .smartbtn-chat-main__container-head-operators-one-operator .smartbtn-chat-main__container-head-operators-one-operator-img .smartbtn-chat-main__container-head-operators-one-operator-status { background-color: grey; border: 1px solid white;}.smartbtn-chat-main__container-example-two div .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head-operators .smartbtn-chat-main__container-head-operators-one-operator .smartbtn-chat-main__container-head-operators-one-operator-img .smartbtn-chat-main__container-head-operators-one-operator-status-not-here { background-color: #FED215;}.smartbtn-chat-main__container-example-two div .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head-operators .smartbtn-chat-main__container-head-operators-one-operator .smartbtn-chat-main__container-head-operators-one-operator-img .smartbtn-chat-main__container-head-operators-one-operator-status-online { background-color: #42c14d;}.smartbtn-chat-main__container-example-two div .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head-operators .smartbtn-chat-main__container-head-operators-one-operator .smartbtn-chat-main__container-head-operators-one-operator-name { color: white;}\/*.smartbtn-chat-main__container-example-two div .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head-phone-operator__container { background-color: white;}*\/.smartbtn-chat-main__container-example-two div .smartbtn-chat-main__container-chat .new_smartbtn_widget_client-message .new_smartbtn_widget_client-message__left-side .new_smartbtn_widget_client-message__message { background: -o-linear-gradient(left, #CFFFFB 0%, #98E4DE 100%); background: -webkit-gradient(linear, left top, right top, from(#CFFFFB), to(#98E4DE)); background: linear-gradient(90deg, #CFFFFB 0%, #98E4DE 100%);}.smartbtn-chat-main__container-example-two div .smartbtn-chat-main__container-socials-and-post-message .smartbtn-chat-main__container-socials-and-post-message-new-message { background: -o-linear-gradient(left, #42C1B8 0%, #3BA49D 100%); background: -webkit-gradient(linear, left top, right top, from(#42C1B8), to(#3BA49D)); background: linear-gradient(90deg, #42C1B8 0%, #3BA49D 100%);}.smartbtn-chat-main__container-example-two div .smartbtn-chat-main__container-socials-and-post-message .smartbtn-chat-main__container-socials-and-post-message-new-message .smartbtn-chat-main__container-socials-and-post-message-new-message-svg .smartbtn-chat-main__container-socials-and-post-message-new-message-svg_margin-bottom div svg path { stroke: white;}.smartbtn-chat-main__container-example-two div .smartbtn-chat-main__container-socials-and-post-message .smartbtn-chat-main__container-socials-and-post-message-new-message .smartbtn-chat-main__container-socials-and-post-message-new-message-svg .smartbtn-chat-main__container-socials-and-post-message-new-message-svg-label svg path { stroke: white;}.smartbtn-chat-main__container-example-two div .smartbtn-chat-main__container-socials-and-post-message .smartbtn-chat-main__container-socials-and-post-message-new-message .new_smartbtn_widget_message-area .new_smartbtn_widget_message-area__send-btn { background: none; background-color: white;}.smartbtn-chat-main__container-example-two div .smartbtn-chat-main__container-socials-and-post-message .smartbtn-chat-main__container-socials-and-post-message-new-message .new_smartbtn_widget_message-area .new_smartbtn_widget_message-area__send-btn:hover { -webkit-box-shadow: 0 0 5px 0 white; box-shadow: 0 0 5px 0 white;}.smartbtn-chat-main__container-example-two div .smartbtn-chat-main__container-socials-and-post-message .smartbtn-chat-main__container-socials-and-post-message-new-message .new_smartbtn_widget_message-area .new_smartbtn_widget_message-area__send-btn svg path { fill: #42C1B8; stroke: #42C1B8;}.smartbtn-chat-main__container-example-two div .smartbtn-chat-main__container-chat .smartbtn-chat-main__container-chat-call .smartbtn-chat-main__container-chat-call__input-submit { background: -o-linear-gradient(left, #54D8CF 0%, #2EFBED 100%); background: -webkit-gradient(linear, left top, right top, from(#54D8CF), to(#2EFBED)); background: linear-gradient(90deg, #54D8CF 0%, #2EFBED 100%);}.smartbtn-chat-main__container-example-two div .smartbtn-chat-main__container-btns .smartbtn-chat-main__container-btns__btn { background: -o-linear-gradient(left, #54D8CF 0%, #2EFBED 100%); background: -webkit-gradient(linear, left top, right top, from(#54D8CF), to(#2EFBED)); background: linear-gradient(90deg, #54D8CF 0%, #2EFBED 100%);}.smartbtn-chat-main__container-example-two div .smartbtn-chat-main__container-btns .smartbtn-chat-main__container-btns__btn-active { background: none; background-color: white;}.smartbtn-chat-main__container-example-two div .smartbtn-chat-main__container-btns .smartbtn-chat-main__container-btns__btn .smartbtn-chat-main__container-btns__btn-svg { background-color: white;}.smartbtn-chat-main__container-example-two div .smartbtn-chat-main__container-btns .smartbtn-chat-main__container-btns__btn .smartbtn-chat-main__container-btns__btn-svg svg path { stroke: #131313;}.smartbtn-chat-main__container-example-two div .smartbtn-chat-main__container-btns .smartbtn-chat-main__container-btns__btn-active .smartbtn-chat-main__container-btns__btn-svg { background: none; background-color: #131313;}.smartbtn-chat-main__container-example-two div .smartbtn-chat-main__container-btns .smartbtn-chat-main__container-btns__btn-active .smartbtn-chat-main__container-btns__btn-svg svg path { stroke: white;}\/*example two*\/\/*example three*\/.smartbtn-chat-main__container-example-three { background: -o-linear-gradient(left, #2A8CB7 0%, #46C1F6 100%); background: -webkit-gradient(linear, left top, right top, from(#2A8CB7), to(#46C1F6)); background: linear-gradient(90deg, #2A8CB7 0%, #46C1F6 100%);}.smartbtn-chat-main__container-example-three div .new_smartbtn_widget_view__header { background: -o-linear-gradient(left, #2A8CB7 0%, #46C1F6 100%); background: -webkit-gradient(linear, left top, right top, from(#2A8CB7), to(#46C1F6)); background: linear-gradient(90deg, #2A8CB7 0%, #46C1F6 100%);}.smartbtn-chat-main__container-example-three div .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head__title { color: white; background: none; -webkit-background-clip: initial; -webkit-text-fill-color: initial;}.smartbtn-chat-main__container-example-three div .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head__text { color: white;}.smartbtn-chat-main__container-example-three div .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head-operators .smartbtn-chat-main__container-head-operators-one-operator .smartbtn-chat-main__container-head-operators-one-operator-img { border: 1px solid white;}.smartbtn-chat-main__container-example-three div .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head-operators .smartbtn-chat-main__container-head-operators-one-operator .smartbtn-chat-main__container-head-operators-one-operator-img .smartbtn-chat-main__container-head-operators-one-operator-status { background-color: #3199C6; border: 1px solid white;}.smartbtn-chat-main__container-example-three div .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head-operators .smartbtn-chat-main__container-head-operators-one-operator .smartbtn-chat-main__container-head-operators-one-operator-img .smartbtn-chat-main__container-head-operators-one-operator-status-not-here { background-color: #FED215;}.smartbtn-chat-main__container-example-three div .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head-operators .smartbtn-chat-main__container-head-operators-one-operator .smartbtn-chat-main__container-head-operators-one-operator-img .smartbtn-chat-main__container-head-operators-one-operator-status-online { background-color: #42C1B8;}.smartbtn-chat-main__container-example-three div .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head-operators .smartbtn-chat-main__container-head-operators-one-operator .smartbtn-chat-main__container-head-operators-one-operator-name { color: white;}\/*.smartbtn-chat-main__container-example-three div .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head-phone-operator__container { background-color: white;}*\/.smartbtn-chat-main__container-example-three div .smartbtn-chat-main__container-chat .new_smartbtn_widget_client-message .new_smartbtn_widget_client-message__left-side .new_smartbtn_widget_client-message__message { background: -o-linear-gradient(295.53deg, #BEEFFB 0%, #9BCAFB 87.01%); background: linear-gradient(154.47deg, #BEEFFB 0%, #9BCAFB 87.01%);}.smartbtn-chat-main__container-example-three div .smartbtn-chat-main__container-socials-and-post-message .smartbtn-chat-main__container-socials-and-post-message-new-message { background: -o-linear-gradient(left, #2A8CB7 0%, #46C1F6 100%); background: -webkit-gradient(linear, left top, right top, from(#2A8CB7), to(#46C1F6)); background: linear-gradient(90deg, #2A8CB7 0%, #46C1F6 100%);}.smartbtn-chat-main__container-example-three div .smartbtn-chat-main__container-socials-and-post-message .smartbtn-chat-main__container-socials-and-post-message-new-message .smartbtn-chat-main__container-socials-and-post-message-new-message-svg .smartbtn-chat-main__cont
3ainer-socials-and-post-message-new-message-svg_margin-bottom div svg path { stroke: white;}.smartbtn-chat-main__container-example-three div .smartbtn-chat-main__container-socials-and-post-message .smartbtn-chat-main__container-socials-and-post-message-new-message .smartbtn-chat-main__container-socials-and-post-message-new-message-svg .smartbtn-chat-main__container-socials-and-post-message-new-message-svg-label svg path { stroke: white;}.smartbtn-chat-main__container-example-three div .smartbtn-chat-main__container-socials-and-post-message .smartbtn-chat-main__container-socials-and-post-message-new-message .new_smartbtn_widget_message-area .new_smartbtn_widget_message-area__send-btn { background: none; background-color: white;}.smartbtn-chat-main__container-example-three div .smartbtn-chat-main__container-socials-and-post-message .smartbtn-chat-main__container-socials-and-post-message-new-message .new_smartbtn_widget_message-area .new_smartbtn_widget_message-area__send-btn:hover { -webkit-box-shadow: 0 0 5px 0 white; box-shadow: 0 0 5px 0 white;}.smartbtn-chat-main__container-example-three div .smartbtn-chat-main__container-socials-and-post-message .smartbtn-chat-main__container-socials-and-post-message-new-message .new_smartbtn_widget_message-area .new_smartbtn_widget_message-area__send-btn svg path { fill: #46C1F6; stroke: #46C1F6;}.smartbtn-chat-main__container-example-three div .smartbtn-chat-main__container-chat .smartbtn-chat-main__container-chat-call .smartbtn-chat-main__container-chat-call__input-submit { background: -o-linear-gradient(295.53deg, #7DF6FF 0%, #45A6FF 87.01%); background: linear-gradient(154.47deg, #7DF6FF 0%, #45A6FF 87.01%);}.smartbtn-chat-main__container-example-three div .smartbtn-chat-main__container-btns .smartbtn-chat-main__container-btns__btn { background: -o-linear-gradient(295.53deg, #7DF6FF 0%, #45A6FF 87.01%); background: linear-gradient(154.47deg, #7DF6FF 0%, #45A6FF 87.01%);}.smartbtn-chat-main__container-example-three div .smartbtn-chat-main__container-btns .smartbtn-chat-main__container-btns__btn-active { background: none; background-color: white;}.smartbtn-chat-main__container-example-three div .smartbtn-chat-main__container-btns .smartbtn-chat-main__container-btns__btn .smartbtn-chat-main__container-btns__btn-svg { background-color: white;}.smartbtn-chat-main__container-example-three div .smartbtn-chat-main__container-btns .smartbtn-chat-main__container-btns__btn .smartbtn-chat-main__container-btns__btn-svg svg path { stroke: #131313;}.smartbtn-chat-main__container-example-three div .smartbtn-chat-main__container-btns .smartbtn-chat-main__container-btns__btn-active .smartbtn-chat-main__container-btns__btn-svg { background: none; background-color: #131313;}.smartbtn-chat-main__container-example-three div .smartbtn-chat-main__container-btns .smartbtn-chat-main__container-btns__btn-active .smartbtn-chat-main__container-btns__btn-svg svg path { stroke: white;}\/*example three*\/\/*example four*\/.smartbtn-chat-main__container-example-four { background: -o-linear-gradient(339.06deg, #FFCB00 -10.01%, #E8BE06 105.54%); background: linear-gradient(110.94deg, #FFCB00 -10.01%, #E8BE06 105.54%);}.smartbtn-chat-main__container-example-four div .new_smartbtn_widget_view__header { background: -o-linear-gradient(339.06deg, #FFCB00 -10.01%, #E8BE06 105.54%); background: linear-gradient(110.94deg, #FFCB00 -10.01%, #E8BE06 105.54%);}.smartbtn-chat-main__container-example-four div .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head__title { color: #131313; background: none; -webkit-background-clip: initial; -webkit-text-fill-color: initial;}.smartbtn-chat-main__container-example-four div .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head__text { color: #131313;}.smartbtn-chat-main__container-example-four div .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head-operators .smartbtn-chat-main__container-head-operators-one-operator .smartbtn-chat-main__container-head-operators-one-operator-img { border: 1px solid #131313;}.smartbtn-chat-main__container-example-four div .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head-operators .smartbtn-chat-main__container-head-operators-one-operator .smartbtn-chat-main__container-head-operators-one-operator-img .smartbtn-chat-main__container-head-operators-one-operator-status { background-color: #131313; border: 1px solid #131313;}.smartbtn-chat-main__container-example-four div .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head-operators .smartbtn-chat-main__container-head-operators-one-operator .smartbtn-chat-main__container-head-operators-one-operator-img .smartbtn-chat-main__container-head-operators-one-operator-status-not-here { background-color: #FED215;}.smartbtn-chat-main__container-example-four div .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head-operators .smartbtn-chat-main__container-head-operators-one-operator .smartbtn-chat-main__container-head-operators-one-operator-img .smartbtn-chat-main__container-head-operators-one-operator-status-online { background-color: #42C1B8;}.smartbtn-chat-main__container-example-four div .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head-operators .smartbtn-chat-main__container-head-operators-one-operator .smartbtn-chat-main__container-head-operators-one-operator-name { color: #131313;}\/*.smartbtn-chat-main__container-example-four div .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head-phone-operator__container { background-color: white;}*\/.smartbtn-chat-main__container-example-four div .smartbtn-chat-main__container-chat .new_smartbtn_widget_client-message .new_smartbtn_widget_client-message__left-side .new_smartbtn_widget_client-message__message { background: -o-linear-gradient(339.06deg, #FFE28C -10.01%, #EED581 105.54%); background: linear-gradient(110.94deg, #FFE28C -10.01%, #EED581 105.54%);}.smartbtn-chat-main__container-example-four div .smartbtn-chat-main__container-socials-and-post-message .smartbtn-chat-main__container-socials-and-post-message-new-message { background: -o-linear-gradient(339.06deg, #FFCB00 -10.01%, #E8BE06 105.54%); background: linear-gradient(110.94deg, #FFCB00 -10.01%, #E8BE06 105.54%);}.smartbtn-chat-main__container-example-four div .smartbtn-chat-main__container-socials-and-post-message .smartbtn-chat-main__container-socials-and-post-message-new-message .smartbtn-chat-main__container-socials-and-post-message-new-message-svg .smartbtn-chat-main__container-socials-and-post-message-new-message-svg_margin-bottom div svg path { stroke: #131313;}.smartbtn-chat-main__container-example-four div .smartbtn-chat-main__container-socials-and-post-message .smartbtn-chat-main__container-socials-and-post-message-new-message .smartbtn-chat-main__container-socials-and-post-message-new-message-svg .smartbtn-chat-main__container-socials-and-post-message-new-message-svg-label svg path { stroke: #131313;}.smartbtn-chat-main__container-example-four div .smartbtn-chat-main__container-socials-and-post-message .smartbtn-chat-main__container-socials-and-post-message-new-message .new_smartbtn_widget_message-area .new_smartbtn_widget_message-area__send-btn { background: none; background-color: #131313;}.smartbtn-chat-main__container-example-four div .smartbtn-chat-main__container-socials-and-post-message .smartbtn-chat-main__container-socials-and-post-message-new-message .new_smartbtn_widget_message-area .new_smartbtn_widget_message-area__send-btn:hover { -webkit-box-shadow: 0 0 5px 0 #131313; box-shadow: 0 0 5px 0 #131313;}.smartbtn-chat-main__container-example-four div .smartbtn-chat-main__container-socials-and-post-message .smartbtn-chat-main__container-socials-and-post-message-new-message .new_smartbtn_widget_message-area .new_smartbtn_widget_message-area__send-btn svg path { fill: #E8BE06; stroke: #E8BE06;}.smartbtn-chat-main__container-example-four div .smartbtn-chat-main__container-chat .smartbtn-chat-main__container-chat-call .smartbtn-chat-main__container-chat-call__input-submit { background: -o-linear-gradient(339.06deg, #FFCB00 -10.01%, #E8BE06 105.54%); background: linear-gradient(110.94deg, #FFCB00 -10.01%, #E8BE06 105.54%);}.smartbtn-chat-main__container-example-four div .smartbtn-chat-main__container-btns .smartbtn-chat-main__container-btns__btn { background: -o-linear-gradient(339.06deg, #FFCB00 -10.01%, #E8BE06 105.54%); background: linear-gradient(110.94deg, #FFCB00 -10.01%, #E8BE06 105.54%);}.smartbtn-chat-main__container-example-four div .smartbtn-chat-main__container-btns .smartbtn-chat-main__container-btns__btn-active { background: none; background-color: white;}.smartbtn-chat-main__container-example-four div .smartbtn-chat-main__container-btns .smartbtn-chat-main__container-btns__btn .smartbtn-chat-main__container-btns__btn-svg { background-color: white;}.smartbtn-chat-main__container-example-four div .smartbtn-chat-main__container-btns .smartbtn-chat-main__container-btns__btn .smartbtn-chat-main__container-btns__btn-svg svg path { stroke: #131313;}.smartbtn-chat-main__container-example-four div .smartbtn-chat-main__container-btns .smartbtn-chat-main__container-btns__btn-active .smartbtn-chat-main__container-btns__btn-svg { background: none; background-color: #131313;}.smartbtn-chat-main__container-example-four div .smartbtn-chat-main__container-btns .smartbtn-chat-main__container-btns__btn-active .smartbtn-chat-main__container-btns__btn-svg svg path { stroke: #E8BE06;}\/*example four*\/\/*example five*\/.smartbtn-chat-main__container-example-five { background: -o-linear-gradient(left, #FE9677 0%, #F6469D 100%); background: -webkit-gradient(linear, left top, right top, from(#FE9677), to(#F6469D)); background: linear-gradient(90deg, #FE9677 0%, #F6469D 100%);}.smartbtn-chat-main__container-example-five div .new_smartbtn_widget_view__header { background: -o-linear-gradient(left, #FE9677 0%, #F6469D 100%); background: -webkit-gradient(linear, left top, right top, from(#FE9677), to(#F6469D)); background: linear-gradient(90deg, #FE9677 0%, #F6469D 100%);}.smartbtn-chat-main__container-example-five div .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head__title { color: white; background: none; -webkit-background-clip: initial; -webkit-text-fill-color: initial;}.smartbtn-chat-main__container-example-five div .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head__text { color: white;}.smartbtn-chat-main__container-example-five div .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head-operators .smartbtn-chat-main__container-head-operators-one-operator .smartbtn-chat-main__container-head-operators-one-operator-img { border: 1px solid white;}.smartbtn-chat-main__container-example-five div .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head-operators .smartbtn-chat-main__container-head-operators-one-operator .smartbtn-chat-main__container-head-operators-one-operator-img .smartbtn-chat-main__container-head-operators-one-operator-status { background-color: #AA3C70; border: 1px solid white;}.smartbtn-chat-main__container-example-five div .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head-operators .smartbtn-chat-main__container-head-operators-one-operator .smartbtn-chat-main__container-head-operators-one-operator-img .smartbtn-chat-main__container-head-operators-one-operator-status-not-here { background-color: #FED215;}.smartbtn-chat-main__container-example-five div .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head-operators .smartbtn-chat-main__container-head-operators-one-operator .smartbtn-chat-main__container-head-operators-one-operator-img .smartbtn-chat-main__container-head-operators-one-operator-status-online { background-color: #42C1B8;}.smartbtn-chat-main__container-example-five div .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head-operators .smartbtn-chat-main__container-head-operators-one-operator .smartbtn-chat-main__container-head-operators-one-operator-name { color: white;}\/*.smartbtn-chat-main__container-example-five div .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head-phone-operator__container { background-color: white;}*\/.smartbtn-chat-main__container-example-five div .smartbtn-chat-main__container-chat .new_smartbtn_widget_client-message .new_smartbtn_widget_client-message__left-side .new_smartbtn_widget_client-message__message { background: -o-linear-gradient(left, #F19FBF 0%, #ED74AE 100%); background: -webkit-gradient(linear, left top, right top, from(#F19FBF), to(#ED74AE)); background: linear-gradient(90deg, #F19FBF 0%, #ED74AE 100%); color: white;}.smartbtn-chat-main__container-example-five div .smartbtn-chat-main__container-socials-and-post-message .smartbtn-chat-main__container-socials-and-post-message-new-message { background: -o-linear-gradient(left, #FE9677 0%, #F6469D 100%); background: -webkit-gradient(linear, left top, right top, from(#FE9677), to(#F6469D)); background: linear-gradient(90deg, #FE9677 0%, #F6469D 100%);}.smartbtn-chat-main__container-example-five div .smartbtn-chat-main__container-socials-and-post-message .smartbtn-chat-main__container-socials-and-post-message-new-message .smartbtn-chat-main__container-socials-and-post-message-new-message-svg .smartbtn-chat-main__container-socials-and-post-message-new-message-svg_margin-bottom div svg path { stroke: white;}.smartbtn-chat-main__container-example-five div .smartbtn-chat-main__container-socials-and-post-message .smartbtn-chat-main__container-socials-and-post-message-new-message .smartbtn-chat-main__container-socials-and-post-message-new-message-svg .smartbtn-chat-main__container-socials-and-post-message-new-message-svg-label svg path { stroke: white;}.smartbtn-chat-main__container-example-five div .smartbtn-chat-main__container-socials-and-post-message .smartbtn-chat-main__container-socials-and-post-message-new-message .smartbtn-chat-main__container-socials-and-post-message-new-message__button { background: none; background-color: white;}.smartbtn-chat-main__container-example-five div .smartbtn-chat-main__container-socials-and-post-message .smartbtn-chat-main__container-socials-and-post-message-new-message .new_smartbtn_widget_message-area .new_smartbtn_widget_message-area__send-btn { background: none; background-color: white;}.smartbtn-chat-main__container-example-five div .smartbtn-chat-main__container-socials-and-post-message .smartbtn-chat-main__container-socials-and-post-message-new-message .new_smartbtn_widget_message-area .new_smartbtn_widget_message-area__send-btn:hover { -webkit-box-shadow: 0 0 5px 0 white; box-shadow: 0 0 5px 0 white;}.smartbtn-chat-main__container-example-five div .smartbtn-chat-main__container-socials-and-post-message .smartbtn-chat-main__container-socials-and-post-message-new-message .new_smartbtn_widget_message-area .new_smartbtn_widget_message-area__send-btn svg path { fill: #F6469D; stroke: #F6469D;}.smartbtn-chat-main__container-example-five div .smartbtn-chat-main__container-chat .smartbtn-chat-main__container-chat-call .smartbtn-chat-main__container-chat-call__input-submit { background: -o-linear-gradient(left, #984063 0%, #F6469D 100%); background: -webkit-gradient(linear, left top, right top, from(#984063), to(#F6469D)); background: linear-gradient(90deg, #984063 0%, #F6469D 100%);}.smartbtn-chat-main__container-example-five div .smartbtn-chat-main__container-btns .smartbtn-chat-main__container-btns__btn { background: -o-linear-gradient(left, #984063 0%, #F6469D 100%); background: -webkit-gradient(linear, left top, right top, from(#984063), to(#F6469D)); background: linear-gradient(90deg, #984063 0%, #F6469D 100%);}.smartbtn-chat-main__container-example-five div .smartbtn-chat-main__container-btns .smartbtn-chat-main__container-btns__btn-active { background: none; background-color: white;}.smartbtn-chat-main__container-example-five div .smartbtn-chat-main__container-btns .smartbtn-chat-main__container-btns__btn .smartbtn-chat-m
3ain__container-btns__btn-svg { background-color: white;}.smartbtn-chat-main__container-example-five div .smartbtn-chat-main__container-btns .smartbtn-chat-main__container-btns__btn .smartbtn-chat-main__container-btns__btn-svg svg path { stroke: #131313;}.smartbtn-chat-main__container-example-five div .smartbtn-chat-main__container-btns .smartbtn-chat-main__container-btns__btn-active .smartbtn-chat-main__container-btns__btn-svg { background: none; background-color: #131313;}.smartbtn-chat-main__container-example-five div .smartbtn-chat-main__container-btns .smartbtn-chat-main__container-btns__btn-active .smartbtn-chat-main__container-btns__btn-svg svg path { stroke: white;}\/*example five*\/\/*-end- examples for chat*\/.new_smartbtn_widget-pseudo-scroll-9999999998 { position: fixed; left: 0; top: 0; height: 100vh; width: 100%; overflow: hidden; z-index: 9999999998; -webkit-transform: scale(1); -ms-transform: scale(1); transform: scale(1); display: none; background: url(https:\/\/smartbtn.ru\/images\/Base6543654FDSAFSA.jpg) repeat;\tbackground-size: contain; background-position: center;}.new_smartbtn_widget-pseudo-scroll-9999999998-active { display: block;}@media (max-width: 480px) { .new_smartbtn_widget_view.new_smartbtn_widget_view-animation, .new_smartbtn_widget_view.smartbtn-skin-liquid { -webkit-transition: opacity .15s linear !important; -o-transition: opacity .15s linear !important; transition: opacity .15s linear !important; }}@media (max-height: 615px) { .new_smartbtn_widget_map { padding-top: 5px; padding-bottom: 5px; } .smartbtn-chat-main__container-chat { \/* min-height: 50vh;*\/ } .smartbtn-chat-main__container-chat-map { padding-top: 5px; padding-bottom: 5px; } .smartbtn-chat-main__container-chat-call { padding-top: 5px; } .smartbtn-chat-main__container-chat-price { padding-top: 5px; } .smartbtn-chat-main__container-btns { padding-top: 5px; } .smartbtn-chat-main__container-socials-and-post-message-new-message { padding-top: 23px; padding-bottom: 23px; } .new_smartbtn_widget_view__header { padding-top: 5px; padding-bottom: 5px; }}@media (max-width: 1024px) { .new_smartbtn_widget_operator-message__message { font-size: 16px; } .new_smartbtn_widget_client-message__message { font-size: 16px; } .new_smartbtn_widget_operator-message__time { font-size: 12px; } .new_smartbtn_widget_client-message__time { font-size: 12px; } .new_smartbtn_widget_message-area__textarea { font-size: 13px; line-height: 20px; } .new_smartbtn_widget_phone { display: -webkit-box; display: -ms-flexbox; display: flex; } .smartbtn-chat-main__container-btns__btn__text { font-size: 12px; } .smartbtn-chat-main__container-head__title { font-size: 18px; margin-bottom: 10px; } .smartbtn-chat-main__container-head__text { font-size: 12px; } .smartbtn-chat-main__container-socials-and-post-message-socials__text { font-size: 12px; } .smartbtn-chat-main__container-socials-and-post-message-new-message__textarea { font-size: 16px; line-height: 20px; } .smartbtn-chat-main__container-socials-and-post-message-new-message-svg_margin-bottom__container-btn__svg { width: 26px; height: 26px; } .smartbtn-chat-main__container-socials-and-post-message-new-message-svg_margin-bottom { display: none; } .smartbtn-chat-main__container-socials-and-post-message-new-message-svg-label__svg { width: 26px; height: 26px; }}@media (max-width: 480px) { .new_smartbtn_widget_phone { bottom: 30px; } .smartbtn-chat-main__container-socials-and-post-message-socials__text-for-click { font-size: 16px; } .smartbtn-chat-main__container-socials-and-post-message-socials__text { width: 350px; } .smartbtn-chat-main__container-btns { background-color: white; } .smartbtn-chat-main__container-head-phone-operator__container { bottom: 15px; right: 30px; } .smartbtn-chat-main__container-chat { height: 100%; \/* min-height: auto;*\/ background-color: white; } .new_smartbtn_widget_client-message__message img { width: 100%; } .smartbtn-chat-main__container { height: 100%; width: 100%; -webkit-box-shadow: 0 0 0 1000px #343434; box-shadow: 0 0 0 1000px #343434; border-radius: 0; -webkit-box-orient: vertical; -webkit-box-direction: normal; -ms-flex-direction: column; flex-direction: column; -webkit-box-pack: justify; -ms-flex-pack: justify; justify-content: space-between; } .smartbtn-chat-main__container-active { display: -webkit-box; display: -ms-flexbox; display: flex; } .new_smartbtn_widget_view__header { padding-left: 15px; padding-right: 15px; min-height: 100px; } .smartbtn-chat-main__container-btns { padding-top: 5px; padding-left: 30px; padding-right: 30px; min-height: 43px; } .smartbtn-chat-main__container-socials-and-post-message-socials-l
3inks__img { width: 90%; } .smartbtn-chat-main__container-socials-and-post-message-new-message-svg-emoji { width: 191px; max-width: 191px; } .smartbtn-chat-main__container-socials-and-post-message-new-message-svg-emoji__box { width: 20%; } .smartbtn-chat-main__container-socials-and-post-message-new-message { min-height: 228px; padding-bottom: 130px; } .new_smartbtn_widget_message-area__textarea { font-size: 19px; }}.new_smartbtn_widget_view-shadow-for-socials-and-smiles { position: absolute; top: 0; left: 0; width: 100%; height: 100%; display: none; justify-content: center; align-items: center; z-index: 1;}.new_smartbtn_widget_view-shadow-for-socials-and-smiles-active { display: block;}.new_smartbtn_widget_view-shadow-for-mobiles { width: 100%; height: 100%; position: absolute; top: 0; left: 0; display: none; align-items: center; justify-content: center; background-color: #131313; z-index: 99999999999;}.new_smartbtn_widget_view-shadow-for-mobiles-active { display: flex;}.new_smartbtn_widget_view-shadow-for-mobiles-messege { color: white;}.smartbtn-chat-main__container-example-one .new_smartbtn_widget_client-message_text{ color: black;}.smartbtn-chat-main__container-example-two .new_smartbtn_widget_client-message_text{ color: black;}.smartbtn-chat-main__container-example-three .new_smartbtn_widget_client-message_text{ color: black;}.smartbtn-chat-main__container-example-four .new_smartbtn_widget_client-message_text{ color: black;}.smartbtn-chat-main__container-example-five .new_smartbtn_widget_client-message_text{ color: white;}.smartbtn-chat-main__container-example-one .smartbtn-chat-main__container-chat::-webkit-scrollbar-button { background-color: #f6489c;}.smartbtn-chat-main__container-example-one .smartbtn-chat-main__container-chat::-webkit-scrollbar-thumb { background-color: #f6489c;}.smartbtn-chat-main__container-example-two .smartbtn-chat-main__container-chat::-webkit-scrollbar-button { background-color: #30faec;}.smartbtn-chat-main__container-example-two .smartbtn-chat-main__container-chat::-webkit-scrollbar-thumb { background-color: #30faec;}.smartbtn-chat-main__container-example-three .smartbtn-chat-main__container-chat::-webkit-scrollbar-button { background-color: #48abff;}.smartbtn-chat-main__container-example-three .smartbtn-chat-main__container-chat::-webkit-scrollbar-thumb { background-color: #48abff;}.smartbtn-chat-main__container-example-four .smartbtn-chat-main__container-chat::-webkit-scrollbar-button { background-color: #ebc005;}.smartbtn-chat-main__container-example-four .smartbtn-chat-main__container-chat::-webkit-scrollbar-thumb { background-color: #ebc005;}.smartbtn-chat-main__container-example-five .smartbtn-chat-main__container-chat::-webkit-scrollbar-button { background-color: #ef4598;}.smartbtn-chat-main__container-example-five .smartbtn-chat-main__container-chat::-webkit-scrollbar-thumb { background-color: #ef4598;}.main-section-smartbtn-chat__container-chat-scroll__container-open-room-messages-not-open-message-indicator_ready_left { width: 27px; height: 15px; overflow: hidden; margin-top: 5px; display: inline-block; transform: translate(0px, 2px);}\/* ========================================================================== Widget Skins -- Liquid Glass theme (RT-1 Unified Plan 2026-07-09, Phase 3) ========================================================================== NOTE: this whole file is embedded raw into a single-quoted JS string by widget-v2\/layout.blade.php - never use an apostrophe or single quote in any comment here, it breaks the widget script parse. Double quotes are safe. Every rule below is scoped to the `.smartbtn-skin-liquid` marker class, compounded onto an EXISTING element class -- no existing rule body is edited anywhere in this file. `.smartbtn-skin-liquid` is not emitted by any Blade view yet: wiring it onto the launcher wrapper (`#js-
3phone-btn`) and the panel (`.new_smartbtn_widget_view`) when Button.data->skin equals \"liquid\" is a Phase 4 job, the same phase that wires the gallery\/picker into the constructor (RT-1 plan Sec.4, Finding C). Until then this block is inert for every existing button. Color source: the frosted tint is NOT hardcoded here. It comes from config\/skins.php `liquid` entry through the exact `--smartbtn-*` custom-property mechanism WidgetController::getButtonV2 already emits for any fixed skin (Phase 0) -- e.g. `.new_smartbtn_widget_view__content` pre-existing `background-color: var(--smartbtn-window-bg)` rule (line ~1914, untouched) automatically renders the Liquid translucent value. This block only supplies what that mechanism has no field for: backdrop-filter, extra border\/shadow, corner radius, and the open\/close morph. Selector-collision check against Phase 1 (icon presets): the outer launcher container `.smartbtn-chat-main-animation` (defined ~line 4454) is a DIFFERENT selector from the Phase 1 inner icon-spiral elements `.smartbtn-chat-main-animation-spiralAnim__box` (~4435) and `.smartbtn-chat-main-animation-spiralAnim__box-active` (~4450) -- verified by direct grep before writing this block. The morph rules below only ever compound onto `.smartbtn-chat-main-animation` (the outer button), never onto the `__box`\/`__box-active` selectors. *\/\/* --- Launcher (\"thin glass\") --------------------------------------------- *\/.smartbtn-chat-main-animation.smartbtn-skin-liquid { background: rgba(255, 255, 255, .4); -webkit-backdrop-filter: blur(10px) saturate(170%); backdrop-filter: blur(10px) saturate(170%); border: 1px solid rgba(255, 255, 255, .75); border-radius: 50%; -webkit-box-shadow: 0 8px 24px rgba(31, 38, 135, .18), inset 0 3px 14px rgba(255, 255, 255, .28); box-shadow: 0 8px 24px rgba(31, 38, 135, .18), inset 0 3px 14px rgba(255, 255, 255, .28); opacity: 1; -webkit-transition: width .28s cubic-bezier(.34, 1.56, .64, 1), height .28s cubic-bezier(.34, 1.56, .64, 1), opacity .28s cubic-bezier(.34, 1.56, .64, 1); transition: width .28s cubic-bezier(.34, 1.56, .64, 1), height .28s cubic-bezier(.34, 1.56, .64, 1), opacity .28s cubic-bezier(.34, 1.56, .64, 1);}\/* Opening: script.js clickPhoneBtn() adds `.new_smartbtn_widget_btn-hide` to `#js-phone-btn` in the same tick it collapses this element inline width\/height to 0 (and removes the class again on close) -- so this ancestor+class compound is a reliable, already-existing hook for \"which direction is the morph running,\" without adding any new JS or touching the `.new_smartbtn_widget_btn-hide` own (empty) rule. *\/#js-phone-btn.new_smartbtn_widget_btn-hide .smartbtn-chat-main-animation.smartbtn-skin-liquid { opacity: 0; -webkit-transition-duration: .4s; transition-duration: .4s;}\/* --- Chat panel (\"thick glass\" -- deliberately denser than the launcher, per the Apple 2025+ Liquid Glass walk-back of full \"Clear\" transparency: this widget embeds on arbitrary third-party backgrounds, so \"Regular\" density is the correct default here, not a compromise) ----------------- *\/.new_smartbtn_widget_view.smartbtn-skin-liquid { background: rgba(255, 255, 255, .58); -webkit-backdrop-filter: blur(16px) saturate(180%); backdrop-filter: blur(16px) saturate(180%); border: 1px solid rgba(255, 255, 255, .85); border-radius: 24px; -webkit-box-shadow: 0 12px 40px rgba(31, 38, 135, .28), 0 0 0 1px rgba(0, 0, 0, .06), inset 0 3px 14px rgba(255, 255, 255, .32); box-shadow: 0 12px 40px rgba(31, 38, 135, .28), 0 0 0 1px rgba(0, 0, 0, .06), inset 0 3px 14px rgba(255, 255, 255, .32); opacity: 0; -webkit-transition: opacity .28s cubic-bezier(.34, 1.56, .64, 1), bottom .28s cubic-bezier(.34, 1.56, .64, 1), right .28s cubic-bezier(.34, 1.56, .64, 1), top .28s cubic-bezier(.34, 1.56, .64, 1), left .28s cubic-bezier(.34, 1.56, .64, 1); transition: opacity .28s cubic-bezier(.34, 1.56, .64, 1), bottom .28s cubic-bezier(.34, 1.56, .64, 1), right .28s cubic-bezier(.34, 1.56, .64, 1), top .28s cubic-bezier(.34, 1.56, .64, 1), left .28s cubic-bezier(.34, 1.56, .64, 1);}\/* Opening morph: longer, springier than the .28s close default above (350-450ms open \/ 250-300ms close per the design spec). *\/.new_smartbtn_widget_view.smartbtn-skin-liquid.new_smartbtn_widget_view--opened { opacity: 1; -webkit-transition-duration: .4s; transition-duration: .4s;}\/* --- Content wrapper: stop double-stacking translucency -- the background of this element comes from config\/skins.php \"liquid\" entry window_bg through the pre-existing var(--smartbtn-window-bg) token mechanism (see note above); with the panel itself now supplying the one true glass tint (.58 above), this nested layer must be transparent or the two flat\/blurred layers compound and the panel reads as washed-out instead of a single glass surface. --- *\/.new_smartbtn_widget_view.smartbtn-skin-liquid .new_smartbtn_widget_view__content { background: transparent;}\/* --- Tab bar (\"thin glass\" -- same alpha\/blur\/border ballpark as the input\/send button recipe below, so the whole bar reads as one glass family). All four tabs (\u041e\u043d\u043b\u0430\u0439\u043d-\u0447\u0430\u0442 \/ \u0417\u0430\u043a\u0430\u0437 \u0437\u0432\u043e\u043d\u043a\u0430 \/ \u041f\u0440\u0430\u0439\u0441 \/ map pin) get the identical translucent face; only the active tab gets a denser fill (`.smartbtn-chat-main__container-btns__btn-active`, same element, no background-color swap needed on the wrapper). The icon chip drops the hardcoded black
3in favor of a lighter nested glass layer; navigation state is now read from icon color alone (stroke for the outline icons, fill for the price glyph -- `path[fill]` targets only the one path in the price icon that sets fill inline, leaving the fill:none outline paths of the other three icons untouched). ------------------------------------------ *\/.new_smartbtn_widget_view.smartbtn-skin-liquid .smartbtn-chat-main__container-btns__btn { background: rgba(255, 255, 255, .45); -webkit-backdrop-filter: blur(8px) saturate(160%); backdrop-filter: blur(8px) saturate(160%); border: 1px solid rgba(255, 255, 255, .5);}.new_smartbtn_widget_view.smartbtn-skin-liquid .smartbtn-chat-main__container-btns__btn.smartbtn-chat-main__container-btns__btn-active { background: rgba(255, 255, 255, .7);}.new_smartbtn_widget_view.smartbtn-skin-liquid .smartbtn-chat-main__container-btns__btn-svg { background: rgba(255, 255, 255, .35);}.new_smartbtn_widget_view.smartbtn-skin-liquid .smartbtn-chat-main__container-btns__btn-svg .smartbtn-chat-main__container-btns__btn-svg__svg path { stroke: #1c1c1e;}.new_smartbtn_widget_view.smartbtn-skin-liquid .smartbtn-chat-main__container-btns__btn-svg .smartbtn-chat-main__container-btns__btn-svg__svg path[fill] { fill: #1c1c1e;}.new_smartbtn_widget_view.smartbtn-skin-liquid .smartbtn-chat-main__container-btns__btn-active .smartbtn-chat-main__container-btns__btn-svg .smartbtn-chat-main__container-btns__btn-svg__svg path { stroke: #FED215;}.new_smartbtn_widget_view.smartbtn-skin-liquid .smartbtn-chat-main__container-btns__btn-active .smartbtn-chat-main__container-btns__btn-svg .smartbtn-chat-main__container-btns__btn-svg__svg path[fill] { fill: #FED215;}\/* --- Input bar (issue 2 fix): the container and the send button had zero Liquid coverage before -- a hardcoded dark #343434 bar and an untouched yellow-gradient button showed through unchanged under this skin. Same alpha\/blur\/border family as the tab bar above so the whole chrome reads as one glass surface. The textarea itself (.new_smartbtn_widget_message-area__textarea) keeps its existing opaque white fill for typed-text readability -- left out of scope here. ------- *\/.new_smartbtn_widget_view.smartbtn-skin-liquid .smartbtn-chat-main__container-socials-and-post-message-new-message { background: rgba(255, 255, 255, .45); -webkit-backdrop-filter: blur(10px) saturate(170%); backdrop-filter: blur(10px) saturate(170%); border-top: 1px solid rgba(255, 255, 255, .5);}.new_smartbtn_widget_view.smartbtn-skin-liquid .new_smartbtn_widget_message-area__send-btn { background: rgba(255, 255, 255, .45); -webkit-backdrop-filter: blur(8px) saturate(160%); backdrop-filter: blur(8px) saturate(160%); border: 1px solid rgba(255, 255, 255, .5); -webkit-box-shadow: 0 4px 14px rgba(31, 38, 135, .18); box-shadow: 0 4px 14px rgba(31, 38, 135, .18);}\/* --- No-backdrop-filter fallback: a dense, opaque card, not a broken or invisible one -- border\/shadow\/radius are preserved, only the translucency is dropped. -------------------------------------------------------------- *\/@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) { .smartbtn-chat-main-animation.smartbtn-skin-liquid { background: #eef1fb; } .new_smartbtn_widget_view.smartbtn-skin-liquid { background: #f3f2fb; } .new_smartbtn_widget_view.smartbtn-skin-liquid .smartbtn-chat-main__container-btns__btn { background: #f3f2fb; } .new_smartbtn_widget_view.smartbtn-skin-liquid .smartbtn-chat-main__container-btns__btn-svg { background: #eef1fb; } .new_smartbtn_widget_view.smartbtn-skin-liquid .smartbtn-chat-main__container-socials-and-post-message-new-message { background: #f3f2fb; } .new_smartbtn_widget_view.smartbtn-skin-liquid .new_smartbtn_widget_message-area__send-btn { background: #f3f2fb; }}\/* --- Reduced motion: no morph, a plain opacity fade only ----------------- *\/@media (prefers-reduced-motion: reduce) { .smartbtn-chat-main-animation.smartbtn-skin-liquid, #js-phone-btn.new_smartbtn_widget_btn-hide .smartbtn-chat-main-animation.smartbtn-skin-liquid, .new_smartbtn_widget_view.smartbtn-skin-liquid, .new_smartbtn_widget_view.smartbtn-skin-liquid.new_smartbtn_widget_view--opened { -webkit-transition: opacity .15s linear; transition: opacity .15s linear; }}\/* ========================================================================== BEGIN feat\/widget-custom-launcher-icon -- custom uploaded launcher icons (appended block -- keep as ONE contiguous unit at EOF so the concurrent CSS-isolation lane merges trivially; every selector below is inert unless the launcher carries data-icon-preset^=\"custom:\" or the __img--custom class, both of which only exist for buttons whose icon_preset resolved to a real uploaded file -- see panel.blade.php \/ iconPresetSpiral.blade.php). 1. Idle spin for custom uploaded icons: same keyframe (smartbtn-chat-main-animation-iconSpin, defined ~line 4485 above) and same timing as the 4 spiral-category presets. feat\/cu
3stom-icon-cabinet-ui: this used to select by SHAPE ([data-icon-preset^=\"custom:\"]), which spun EVERY custom icon with no way to opt out. The owner now chooses static vs animated per button (Button.data->icon_custom_animated), so the spin is keyed off the marker class panel.blade.php emits for that choice instead. An absent choice still resolves to animated, so a button that was spinning before this change keeps spinning -- see WidgetIconService::isCustomLauncherIconAnimated(). 2. __img--custom sizing: the preset frames are full-bleed square SVGs; an uploaded raster\/vector file can be any aspect ratio, so it gets height:100% + object-fit:contain to stay centred inside the same round 2px-padded white __box the presets use. 3. Reduced motion: the spin is decorative -- switch it off entirely under prefers-reduced-motion, following the existing reduced-motion block for the Liquid skin at the end of this file. ========================================================================== *\/#smartbtn-chat-main-animation-spiralAnim-none.smartbtn-chat-main-animation--custom-spin .smartbtn-chat-main-animation-spiralAnim__img { -webkit-animation: smartbtn-chat-main-animation-iconSpin 3.5s linear infinite; animation: smartbtn-chat-main-animation-iconSpin 3.5s linear infinite;}.smartbtn-chat-main-animation-spiralAnim__img--custom { display: block; width: 100%; height: 100%; -o-object-fit: contain; object-fit: contain; border-radius: 100px;}@media (prefers-reduced-motion: reduce) { #smartbtn-chat-main-animation-spiralAnim-none.smartbtn-chat-main-animation--custom-spin .smartbtn-chat-main-animation-spiralAnim__img { -webkit-animation: none; animation: none; }}\/* 4. Spiral motion for custom uploaded icons (feat\/custom-icon-spiral-animation). The marker class itself declares NOTHING here, on purpose. The movement is `smartbtn-chat-main-animation-spiralAnim` (~line 4597 above, shared with the presets and untouched by this change), which script.js puts on the launcher for 2s at a time from a 5s interval. The marker exists so that interval knows it has a reason to run -- see the gate beside smartbtnSpiralAnimation() in public\/assets\/smartbtn\/js\/script.js. A CSS rule cannot express \"every 5 seconds, twice, then stop\", which is why this one motion needs the script and the other two do not. What DOES belong here is the reduced-motion opt-out. The spiral is decorative, so under prefers-reduced-motion the keyframe is cancelled while the timer goes on harmlessly toggling a class that paints nothing. Scoped to the custom-spiral marker so that the PRESET spiral keeps behaving exactly as it does today for the 7 preset-icon customer buttons -- this change must not reach them. *\/@media (prefers-reduced-motion: reduce) { #smartbtn-chat-main-animation-spiralAnim-none.smartbtn-chat-main-animation--custom-spiral.smartbtn-chat-main-animation-spiralAnim { -webkit-animation: none; animation: none; }}\/* === END feat\/widget-custom-launcher-icon ================================= *\/\/* ========================================================================== BEGIN fix\/constructor-i18n-and-widget-layout -- language switcher base CSS (appended block -- keep as ONE contiguous unit at EOF, same convention as the block above). The real #smb-set-locale \/ .new_smartbtn_widget_view___locale_wrapper pill (widget-v2\/chat.blade.php, ~line 749; NOT the decorative preview pill in includes\/widget\/widget.blade.php) had zero rules anywhere in this file -- its only styling lived in chat.blade.php's own inline <style> tag, which ships as part of $html (WidgetController::getButtonV2()), not as part of this $css blob. That inline block IS what has been rendering it correctly in production (verified live on edme.pro\/button 8 at 320\/375\/768\/1024\/1280, with and without the operators row, with and without the phone button -- no overlap with avatars, the phone button, or the close (X) button at any width). But per the fix ticket this file -- the widget's actual served stylesheet -- must be self-sufficient for this control on its own, not rely solely on a same-named rule living only in a different file's inline markup. Values below are copied VERBATIM from the working chat.blade.php rule (not reinvented), so whichever of the two <style> elements the browser's cascade prefers for a shared property, the rendered result is identical -- zero visual regression risk. The chat.blade.php inline block, including its own <480px override (top: 61px, \"Re-align the language pill ...\" comment, ~line 528), is left exactly as-is; that override still wins there is no competing <480px rule for this selector in this file, so nothing here can fight it. ========================================================================== *\/.new_smartbtn_widget_view___locale_wrapper { position: absolute; top: 85px; left: 20px; cursor: pointer; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-orient: horizontal; -webkit-box-direction: normal; -ms-flex-direction: row; flex-direction: row; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; -webkit-box-align: center; -ms-flex-align: center; align-items: center;}
3#smartbtn_widget_head_operators_row[style*=\"display: none\"] ~ .new_smartbtn_widget_view___locale_wrapper,#smartbtn_widget_head_operators_row.smartbtn-operators-row-hidden ~ .new_smartbtn_widget_view___locale_wrapper { top: 55px;}.new_smartbtn_widget_view___locale { line-height: 12px; margin-left: 0; color: #fff; background: transparent; border: 1px solid rgba(255, 255, 255, .55); border-radius: 6px; min-height: 28px; padding: 2px 6px; font: inherit;}.new_smartbtn_widget_view___locale option { color: #131313;}\/* === BEGIN fix\/widget-locale-flag-parity ==================================== Owner report 2026-09-04: the live selector showed the full option text (\"\u0420\u0443\u0441\u0441\u043a\u0438\u0439\") in a bare bordered box, nothing like the constructor's own pill+flag preview (widget.blade.php, .smartbtn-chat-main__container-head -locale-preview). The select's <option> text is now the 2-letter code (chat.blade.php), so it no longer needs room for a whole language name -- these two rules only shrink its padding\/width to match and add the gap the new flag <svg> (chat.blade.php, ___locale_flag) sits in. No selector from the original CSS pass above is touched, so the proven no-overlap geometry (3 rounds of adversarial review) is unaffected. *\/.new_smartbtn_widget_view___locale_wrapper { gap: 4px;}.new_smartbtn_widget_view___locale_flag { -webkit-box-flex: 0; -ms-flex: 0 0 auto; flex: 0 0 auto; border-radius: 2px; overflow: hidden;}.new_smartbtn_widget_view___locale { min-width: 0; width: auto; padding: 2px 4px; text-align: center;}\/* === END fix\/widget-locale-flag-parity ====================================== *\/\/* === END fix\/constructor-i18n-and-widget-layout ============================ *\/"; 4document.head.appendChild(styleSheet); 5 6 7var widgetID = '2331c204150c0fab02304984d6dc330a'; 8var rating = '5'; 9var test = "[]"; 10 11 12document.body.insertAdjacentHTML('beforeEnd', "<svg width=\"0\" height=\"0\" class=\"hidden\"> <!-- Send-btn icon --> <symbol xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 535.5 535.5\" id=\"send-btn-icon\"> <path d=\"M0 497.25l535.5-229.5L0 38.25v178.5l382.5 51-382.5 51z\"><\/path> <\/symbol> <!-- Edit icon --> <symbol viewBox=\"0 -1 381.534 381\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" id=\"edit-icon\">
12 <path d=\"M370.59 230.965c-5.524 0-10 4.476-10 10v88.793c-.02 16.558-13.438 29.98-30 30H50c-16.563-.02-29.98-13.442-30-30V69.168c.02-16.563 13.438-29.98 30-30h88.79c5.523 0 10-4.477 10-10s-4.477-10-10-10H50c-27.602.031-49.969 22.398-50 50v260.59c.031 27.601 22.398 49.969 50 50h280.59c27.601-.031 49.969-22.399 50-50v-88.79c0-5.523-4.477-10.003-10-10.003zm0 0\"><\/path> <path d=\"M156.367 178.344L302.38 32.328l47.09 47.09-146.012 146.016zm-23.824 70.914l52.039-14.414-37.625-37.625zM362.488 7.578c-9.77-9.746-25.586-9.746-35.355 0l-10.606 10.606 47.09 47.09 10.606-10.606c9.75-9.77 9.75-25.586 0-35.355zm0 0\"><\/path> <\/symbol> <!-- Add photo icon --> <symbol xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 419.2 419.2\" id=\"add-photo-icon\"> <circle cx=\"158\" cy=\"144.4\" r=\"28.8\"><\/circle> <path d=\"M394.4 250.4c-13.6-12.8-30.8-21.2-49.6-23.6V80.4c0-15.6-6.4-29.6-16.4-40C318 30 304 24 288.4 24h-232c-15.6 0-29.6 6.4-40 16.4C6 50.8 0 64.8 0 80.4v238.8c0 15.6 6.4 29.6 16.4 40 10.4 10.4 24.4 16.4 40 16.4h224.4c14.8 12 33.2 19.6 53.6 19.6 23.6 0 44.8-9.6 60-24.8 15.2-15.2 24.8-36.4 24.8-60s-9.6-44.8-24.8-60zM21.2 80.4c0-9.6 4-18.4 10.4-24.8 6.4-6.4 15.2-10.4 24.8-10.4h232c9.6 0 18.4 4 24.8 10.4 6.4 6.4 10.4 15.2 10.4 24.8v124.8l-59.2-58.8c-4-4-10.8-4.4-15.2 0L160 236l-60.4-60.8c-4-4-10.8-4.4-15.2 0l-63.2 64V80.4zM56 354.8v-.4c-9.6 0-18.4-4-24.8-10.4-6-6.4-10-15.2-10-24.8v-50L92.4 198l60.4 60.4c4 4 10.8 4 15.2 0l89.2-89.6 58.4 58.8-3.6 1.2c-1.6.4-3.2.8-5.2 1.6-1.6.4-3.2 1.2-4.8 1.6-1.2.4-2 .8-3.2 1.6-1.6.8-2.8 1.2-4 2l-6 3.6c-1.2.8-2 1.2-3.2 2-.8.4-1.2.8-2 1.2-3.6 2.4-6.8 5.2-9.6 8.4-15.2 15.2-24.8 36.4-24.8 60 0 6 .8 11.6 2 17.6.4 1.6.8 2.8 1.2 4.4 1.2 4 2.4 8 4 12v.4c1.6 3.2 3.2 6.8 5.2 9.6H56zm322.8.4c-11.6 11.6-27.2 18.4-44.8 18.4-16.8 0-32.4-6.8-43.6-17.6-1.6-1.6-3.2-3.6-4.8-5.2-1.2-1.2-2.4-2.8-3.6-4-1.6-2-2.8-4.4-4-6.8-.8-1.6-1.6-2.8-2.4-4.4-.8-2-1.6-4.4-2-6.8-.4-1.6-1.2-3.6-1.6-5.2-.8-4-1.2-8.4-1.2-12.8 0-17.6 7.2-33.2 18.4-44.8 11.6-11.6 27.2-18.4 44.8-18.4 17.6 0 33.2 7.2 44.8 18.4 11.6 11.2 18.4 27.2 18.4 44.8 0 17.2-7.2 32.8-18.4 44.4z\"><\/path> <path d=\"M368.8 299.6h-24.4v-24.4c0-6-4.8-10.8-10.8-10.8s-10.8 4.8-10.8 10.8v24.4h-24.4c-6 0-10.8 4.8-10.8 10.8s4.8 10.8 10.8 10.8h24.4v24.4c0 6 4.8 10.8 10.8 10.8s10.8-4.8 10.8-10.8v-24.4h24.4c6 0 10.8-4.8 10.8-10.8s-4.8-10.8-10.8-10.8z\"><\/path> <\/symbol> <!-- Close icon --> <symbol xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 47.971 47.971\" id=\"close-icon\"> <path d=\"M28.228 23.986L47.092 5.122a2.998 2.998 0 0 0 0-4.242 2.998 2.998 0 0 0-4.242 0L23.986 19.744 5.121.88a2.998 2.998 0 0 0-4.242 0 2.998 2.998 0 0 0 0 4.242l18.865 18.864L.879 42.85a2.998 2.998 0 1 0 4.242 4.241l18.865-18.864L42.85 47.091c.586.586 1.354.879 2.121.879s1.535-.293 2.121-.879a2.998 2.998 0 0 0 0-4.242L28.228 23.986z\"><\/path> <\/symbol> <!-- Favourite icon --> <symbol xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 510 510\" id=\"favourite-icon\"> <path d=\"M255 489.6l-35.7-35.7C86.7 336.6 0 257.55 0 160.65 0 81.6 61.2 20.4 140.25 20.4c43.35 0 86.7 20.4 114.75 53.55C283.05 40.8 326.4 20.4 369.75 20.4 448.8 20.4 510 81.6 510 160.65c0 96.9-86.7 175.95-219.3 293.25L255 489.6z\"> <\/path> <\/symbol> <!-- Message icon --> <symbol viewBox=\"0 0 35 33\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" id=\"message-icon\"> <path d=\"M30.188 0H4.812C2.159 0 0 2.212 0 4.931v15.916c0 2.713 2.15 4.921 4.795 4.93V33l10.127-7.222h15.266c2.653 0 4.812-2.212 4.812-4.931V4.93C35 2.211 32.841 0 30.188 0zm2.761 20.847c0 1.56-1.238 2.83-2.76 2.83h-15.91l-7.433 5.3v-5.3H4.812c-1.523 0-2.761-1.27-2.761-2.83V4.93c0-1.56 1.238-2.83 2.76-2.83h25.377c1.523 0 2.761 1.27 2.761 2.83v15.916z\"><\/path> <path d=\"M8 8h19v2H8V8zm0 4h19v2H8v-2zm0 4h19v2H8v-2z\"><\/path> <\/symbol> <!-- Phone icon --> <symbol xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 473.806 473.806\" id=\"phone-icon\"> <path d=\"M374.456 293.506c-9.7-10.1-21.4-15.5-33.8-15.5-12.3 0-24.1 5.3-34.2 15.4l-31.6 31.5c-2.6-1.4-5.2-2.7-7.7-4-3.6-1.8-7-3.5-9.9-5.3-29.6-18.8-56.5-43.3-82.3-75-12.5-15.8-20.9-29.1-27-42.6 8.2-7.5 15.8-15.3 23.2-22.8 2.8-2.8 5.6-5.7 8.4-8.5 21-21 21-48.2 0-69.2l-27.3-27.3c-3.1-3.1-6.3-6.3-9.3-9.5-6-6.2-12.3-12.6-18.8-18.6-9.7-9.6-21.3-14.7-33.5-14.7s-24 5.1-34 14.7l-.2.2-34 34.3c-12.8 12.8-20.1 28.4-21.7 46.5-2.4 29.2 6.2 56.4 12.8 74.2 16.2 43.7 40.4 84.2 76.5 127.6 43.8 52.3 96.5 93.6 156.7 122.7 23 10.9 53.7 23.8 88 26 2.1.1 4.3.2 6.3.2 23.1 0 42.5-8.3 57.7-24.8.1-.2.3-.3.4-.5 5.2-6.3 11.2-12 17.5-18.1 4.3-4.1 8.7-8.4 13-12.9 9.9-10.3 15.1-22.3 15.1-34.6 0-12.4-5.3-24.3-15.4-34.3l-54.9-55.1zm35.8 105.3c-.1 0-.1.1 0 0-3.9 4.2-7.9 8-12.2 12.2-6.5 6.2-13.1 12.7-19.3 20-10.1 10.8-22 15.9-37.6 15.9-1.5 0-3.1 0-4.6-.1-29.7-1.9-57.3-13.5-78-23.4-56.6-27.4-106.3-66.3-147.6-115.6-34.1-41.1-56.9-79.1-72-119.9-9.3-24.9-12.7-44.3-11.2-62.6 1-11.7 5.5-21.4 13.8-29.7l34.1-34.1c4.9-4.6 10.1-7.1 15.2-7.1 6.3 0 11.4 3.8 14.6 7l.3.3c6.1 5.7 11.9 11.6 18 17.9 3.1 3.2 6.3 6.4 9.5 9.7l27.3 27.3c10.6 10.6 10.6 20.4 0 31-2.9 2.9-5.7 5.8-8.6 8.6-8.4 8.6-16.4 16.6-25.1 24.4-.2.2-.4.3-.5.5-8.6 8.6-7 17-5.2 22.7l.3.9c7.1 17.2 17.1 33.4 32.3 52.7l.1.1c27.6 34 56.7 60.5 88.8 80.8 4.1 2.6 8.3 4.7 12.3 6.7 3.6 1.8 7 3.5 9.9 5.3.4.2.8.5 1.2.7 3.4 1.7 6.6 2.5 9.9 2.5 8.3 0 13.5-5.2 15.2-6.9l34.2-34.2c3.4-3.4 8.8-7.5 15.1-7.5 6.2 0 11.3 3.9 14.4 7.3l.2.2 55.1 55.1c10.3 10.2 10.3 20.7.1 31.3zm-154.2-286.1c26.2 4.4 50 16.8 69 35.8s31.3 42.8 35.8 69c1.1 6.6 6.8 11.2 13.3 11.2.8 0 1.5-.1 2.3-.2 7.4-1.2 12.3-8.2 11.1-15.6-5.4-31.7-20.4-60.6-43.3-83.5s-51.8-37.9-83.5-43.3c-7.4-1.2-14.3 3.7-15.6 11s3.5 14.4 10.9 15.6zm217.2 96.3c-8.9-52.2-33.5-99.7-
1271.3-137.5s-85.3-62.4-137.5-71.3c-7.3-1.3-14.2 3.7-15.5 11-1.2 7.4 3.7 14.3 11.1 15.6 46.6 7.9 89.1 30 122.9 63.7 33.8 33.8 55.8 76.3 63.7 122.9 1.1 6.6 6.8 11.2 13.3 11.2.8 0 1.5-.1 2.3-.2 7.3-1.1 12.3-8.1 11-15.4z\"> <\/path> <\/symbol> <!-- Mark icon --> <symbol xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 512 512\" id=\"mark-icon\"> <path d=\"M256 0C156.748 0 76 80.748 76 180c0 33.534 9.289 66.26 26.869 94.652l142.885 230.257A15 15 0 0 0 258.499 512h.119a14.997 14.997 0 0 0 12.75-7.292L410.611 272.22C427.221 244.428 436 212.539 436 180 436 80.748 355.252 0 256 0zm128.866 256.818L258.272 468.186l-129.905-209.34C113.734 235.214 105.8 207.95 105.8 180c0-82.71 67.49-150.2 150.2-150.2S406.1 97.29 406.1 180c0 27.121-7.411 53.688-21.234 76.818z\"><\/path> <path d=\"M256 90c-49.626 0-90 40.374-90 90 0 49.309 39.717 90 90 90 50.903 0 90-41.233 90-90 0-49.626-40.374-90-90-90zm0 150.2c-33.257 0-60.2-27.033-60.2-60.2 0-33.084 27.116-60.2 60.2-60.2s60.1 27.116 60.1 60.2c0 32.683-26.316 60.2-60.1 60.2z\"><\/path> <\/symbol> <!-- Back icon --> <symbol viewBox=\"0 0 13 18\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" id=\"back-icon\"> <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M10.33 1.26L.968 8.41c-.528.402-.528 1.073 0 1.477l9.364 7.146c.574.439 1.48.439 2.055 0 .607-.464.607-1.237 0-1.702L4.543 9.344c-.142-.108-.142-.287 0-.395l7.843-5.987c.607-.464.607-1.237 0-1.701a1.709 1.709 0 0 0-1.027-.328c-.371 0-.74.11-1.028.328z\" fill-opacity=\".66\"> <\/path> <\/symbol> <!-- Info icon --> <symbol viewBox=\"0 0 22 18\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" id=\"info-icon\"> <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M10.875 6.242c.76 0 1.375-.49 1.375-1.094 0-.603-.616-1.093-1.375-1.093-.76 0-1.375.49-1.375 1.093 0 .604.616 1.094 1.375 1.094zM10 7.235h2v6.361h1v.398H9v-.398h1V7.633H9v-.398h1zm1 9.94c5.523 0 10-3.56 10-7.952 0-4.391-4.477-7.95-10-7.95S1 4.831 1 9.222s4.477 7.951 10 7.951zm0 .794c-6.075 0-11-3.915-11-8.746C0 4.393 4.925.477 11 .477s11 3.916 11 8.746-4.925 8.746-11 8.746z\" fill-opacity=\".66\"> <\/path> <\/symbol> <!-- VK icon --> <symbol xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 548.358 548.358\" id=\"vk-icon\"> <path d=\"M545.451 400.298c-.664-1.431-1.283-2.618-1.858-3.569-9.514-17.135-27.695-38.167-54.532-63.102l-.567-.571-.284-.28-.287-.287h-.288c-12.18-11.611-19.893-19.418-23.123-23.415-5.91-7.614-7.234-15.321-4.004-23.13 2.282-5.9 10.854-18.36 25.696-37.397 7.807-10.089 13.99-18.175 18.556-24.267 32.931-43.78 47.208-71.756 42.828-83.939l-1.701-2.847c-1.143-1.714-4.093-3.282-8.846-4.712-4.764-1.427-10.853-1.663-18.278-.712l-82.224.568c-1.332-.472-3.234-.428-5.712.144l-3.713.859-1.431.715-1.136.859c-.952.568-1.999 1.567-3.142 2.995-1.137 1.423-2.088 3.093-2.848 4.996-8.952 23.031-19.13 44.444-30.553 64.238-7.043 11.803-13.511 22.032-19.418 30.693-5.899 8.658-10.848 15.037-14.842 19.126-4 4.093-7.61 7.372-10.852 9.849-3.237 2.478-5.708 3.525-7.419 3.142-1.715-.383-3.33-.763-4.859-1.143-2.663-1.714-4.805-4.045-6.42-6.995-1.622-2.95-2.714-6.663-3.285-11.136-.568-4.476-.904-8.326-1-11.563-.089-3.233-.048-7.806.145-13.706.198-5.903.287-9.897.287-11.991 0-7.234.141-15.085.424-23.555.288-8.47.521-15.181.716-20.125.194-4.949.284-10.185.284-15.705s-.336-9.849-1-12.991a44.442 44.442 0 0 0-2.99-9.137c-1.335-2.95-3.289-5.232-5.853-6.852-2.569-1.618-5.763-2.902-9.564-3.856-10.089-2.283-22.936-3.518-38.547-3.71-35.401-.38-58.148 1.906-68.236 6.855-3.997 2.091-7.614 4.948-10.848 8.562-3.427 4.189-3.905 6.475-1.431 6.851 11.422 1.711 19.508 5.804 24.267 12.275l1.715 3.429c1.334 2.474 2.666 6.854 3.999 13.134 1.331 6.28 2.19 13.227 2.568 20.837.95 13.897.95 25.793 0 35.689-.953 9.9-1.853 17.607-2.712 23.127-.859 5.52-2.143 9.993-3.855 13.418-1.715 3.426-2.856 5.52-3.428 6.28-.571.76-1.047 1.239-1.425 1.427a21.387 21.387 0 0 1-7.71 1.431c-2.667 0-5.901-1.334-9.707-4-3.805-2.666-7.754-6.328-11.847-10.992-4.093-4.665-8.709-11.184-13.85-19.558-5.137-8.374-10.467-18.271-15.987-29.691l-4.567-8.282c-2.855-5.328-6.755-13.086-11.704-23.267-4.952-10.185-9.329-20.037-13.134-29.554-1.521-3.997-3.806-7.04-6.851-9.134l-1.429-.859c-.95-.76-2.47
125-1.567-4.567-2.427a30.301 30.301 0 0 0-6.567-1.854l-78.229.568c-7.994 0-13.418 1.811-16.274 5.428l-1.143 1.711c-.571.953-.859 2.475-.859 4.57 0 2.094.571 4.664 1.714 7.707 11.42 26.84 23.839 52.725 37.257 77.659 13.418 24.934 25.078 45.019 34.973 60.237 9.897 15.229 19.985 29.602 30.264 43.112 10.279 13.515 17.083 22.176 20.412 25.981 3.333 3.812 5.951 6.662 7.854 8.565l7.139 6.851c4.568 4.569 11.276 10.041 20.127 16.416 8.853 6.379 18.654 12.659 29.408 18.85 10.756 6.181 23.269 11.225 37.546 15.126 14.275 3.905 28.169 5.472 41.684 4.716h32.834c6.659-.575 11.704-2.669 15.133-6.283l1.136-1.431c.764-1.136 1.479-2.901 2.139-5.276.668-2.379 1-5 1-7.851-.195-8.183.428-15.558 1.852-22.124 1.423-6.564 3.045-11.513 4.859-14.846 1.813-3.33 3.859-6.14 6.136-8.418 2.282-2.283 3.908-3.666 4.862-4.142.948-.479 1.705-.804 2.276-.999 4.568-1.522 9.944-.048 16.136 4.429 6.187 4.473 11.99 9.996 17.418 16.56 5.425 6.57 11.943 13.941 19.555 22.124 7.617 8.186 14.277 14.271 19.985 18.274l5.708 3.426c3.812 2.286 8.761 4.38 14.853 6.283 6.081 1.902 11.409 2.378 15.984 1.427l73.087-1.14c7.229 0 12.854-1.197 16.844-3.572 3.998-2.379 6.373-5 7.139-7.851.764-2.854.805-6.092.145-9.712-.677-3.611-1.344-6.136-2.008-7.563z\"> <\/path> <\/symbol> <!-- Telegram icon --> <symbol xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 511.999 511.999\" id=\"tg-icon\"> <path d=\"M165.323 267.452L395.89 125.446c4.144-2.545 8.407 3.058 4.849 6.359L210.454 308.684a39.448 39.448 0 0 0-12.225 23.602l-6.482 48.036c-.858 6.414-9.868 7.05-11.638.843L155.18 293.57c-2.855-9.992 1.306-20.663 10.143-26.118z\" fill=\"#c3c3c7\"><\/path> <path d=\"M9.043 246.86l117.975 44.032 45.664 146.854c2.922 9.405 14.423 12.882 22.057 6.641l65.761-53.61a19.618 19.618 0 0 1 23.916-.667l118.61 86.113c8.166 5.936 19.736 1.461 21.784-8.407l86.888-417.947c2.236-10.779-8.356-19.772-18.62-15.802L8.905 220.845c-11.948 4.608-11.844 21.524.138 26.015zm156.28 20.592L395.89 125.446c4.144-2.545 8.407 3.058 4.849 6.359L210.454 308.684a39.448 39.448 0 0 0-12.225 23.602l-6.482 48.036c-.858 6.414-9.868 7.05-11.638.843L155.18 293.57c-2.855-9.992 1.306-20.663 10.143-26.118z\" fill=\"#dedee0\"><\/path> <\/symbol> <!-- Facebook icon --> <symbol xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 676.000000 1280.000000\" id=\"fb-icon\"> <g transform=\"translate(0.000000,1280.000000) scale(0.100000,-0.100000)\" fill=\"#3BA49D\" stroke=\"none\"> <path d=\"M5480 12793 c-636 -33 -1113 -106 -1565 -241 -1297 -387 -2118 -1249 -2391 -2509 -52 -241 -87 -510 -100 -775 l-7 -138 -401 0 -402 0 -307 -1237 c-298 -1201 -307 -1241 -307 -1335 l0 -98 705 0 705 0 0 -3230 0 -3230 98 0 c70 0 487 52 1481 185 762 102 1386 187 1388 188 2 2 3 1373 3 3045 l0 3042 815 0 815 0 0 1335 0 1335 -809 0 -810 0 6 38 c37 253 113 415 261 552 121 114 284 185 517 225 248 43 665 64 1263 65 l322 0 0 98 0 99 -344 1119 c-189 615 -368 1199 -397 1296 l-54 178 -215 -2 c-118 -1 -240 -3 -270 -5z\"\/> <\/g> <\/symbol> <!-- OK icon --> <symbol xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 512.479 512.479\" id=\"ok-icon\"> <g> <path d=\"M256.239 277.333c76.583 0 138.667-62.083 138.667-138.667S332.823 0 256.239 0 117.573 62.083 117.573 138.667c.094 76.544 62.122 138.572 138.666 138.666zm0-213.333c41.237 0 74.667 33.429 74.667 74.667s-33.429 74.667-74.667 74.667-74.667-33.429-74.667-74.667S215.002 64 256.239 64z\"><\/path> <path d=\"M392.069 343.04a53.72 53.72 0 0 0 24.171-44.8 38.698 38.698 0 0 0-21.696-35.307 40.534 40.534 0 0 0-42.667 4.011c-56.983 41.543-134.27 41.543-191.253 0a40.747 40.747 0 0 0-42.667-4.011 38.74 38.74 0 0 0-21.717 35.285 53.78 53.78 0 0 0 24.171 44.8 246.275 246.275 0 0 0 62.507 29.867 212.318 212.318 0 0 0 11.627 3.243l-64.469 63.04c-16.912 16.409-17.321 43.42-.912 60.333 16.409 16.912 43.42 17.321 60.333.912.352-.342.698-.689 1.038-1.043l65.707-68.011 65.835 68.139c16.395 16.925 43.407 17.355 60.332.96 16.925-16.395 17.355-43.407.96-60.332a42.943 42.943 0 0 0-1.047-1.044l-64.363-62.976a270.92 270.92 0 0 0 11.669-3.264 245.352 245.352 0 0 0 62.441-29.802z\"><\/path> <\/g> <\/symbol> <!-- Whatsapp icon --> <symbol xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 90 90\" id=\"wa-icon\"> <path d=\"M90 43.841c0 24.213-19.779 43.841-44.182 43.841a44.256 44.256 0 0 1-21.357-
125.455L0 90l7.975-23.522a43.38 43.38 0 0 1-6.34-22.637C1.635 19.628 21.416 0 45.818 0 70.223 0 90 19.628 90 43.841zM45.818 6.982c-20.484 0-37.146 16.535-37.146 36.859 0 8.065 2.629 15.534 7.076 21.61L11.107 79.14l14.275-4.537A37.122 37.122 0 0 0 45.819 80.7c20.481 0 37.146-16.533 37.146-36.857S66.301 6.982 45.818 6.982zm22.311 46.956c-.273-.447-.994-.717-2.076-1.254-1.084-.537-6.41-3.138-7.4-3.495-.993-.358-1.717-.538-2.438.537-.721 1.076-2.797 3.495-3.43 4.212-.632.719-1.263.809-2.347.271-1.082-.537-4.571-1.673-8.708-5.333-3.219-2.848-5.393-6.364-6.025-7.441-.631-1.075-.066-1.656.475-2.191.488-.482 1.084-1.255 1.625-1.882.543-.628.723-1.075 1.082-1.793.363-.717.182-1.344-.09-1.883-.27-.537-2.438-5.825-3.34-7.977-.902-2.15-1.803-1.792-2.436-1.792-.631 0-1.354-.09-2.076-.09s-1.896.269-2.889 1.344c-.992 1.076-3.789 3.676-3.789 8.963 0 5.288 3.879 10.397 4.422 11.113.541.716 7.49 11.92 18.5 16.223C58.2 65.771 58.2 64.336 60.186 64.156c1.984-.179 6.406-2.599 7.312-5.107.9-2.512.9-4.663.631-5.111z\"> <\/path> <\/symbol> <!-- Viber icon --> <symbol viewBox=\"-22 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" id=\"vb-icon\"> <path d=\"M468.484 180.707c.004-48.086-18.843-93.414-53.066-127.637C381.195 18.848 335.868 0 287.778 0H180.702C132.621 0 87.29 18.848 53.07 53.066 18.848 87.293 0 132.621 0 180.707v84.164c0 37.242 11.36 73.063 32.852 103.598 18.96 26.937 44.46 47.98 74.191 61.32v48.344c0 24.996 13.996 33.867 25.98 33.867 8.563 0 17.125-4.227 25.461-12.559l53.86-53.859 75.437-.004c48.086 0 93.414-18.848 127.637-53.066 34.223-34.223 53.07-79.555 53.07-127.64zM287.781 415.578l-81.648.004c-3.98 0-7.793 1.578-10.606 4.39l-58.254 58.255c-.074.078-.152.152-.23.226v-58.676a15 15 0 0 0-9.652-14.015c-58.25-22.227-97.387-78.848-97.387-140.89v-84.165c0-40.074 15.726-77.871 44.281-106.43C102.84 45.727 140.633 30 180.707 30h107.07c40.075 0 77.871 15.727 106.426 44.281 28.559 28.559 44.285 66.356 44.281 106.426l.004 84.164c-.004 83.102-67.61 150.707-150.707 150.707zm0 0\"><\/path> <path d=\"M274.133 245.336c-5.856-5.86-15.352-5.86-21.211 0l-12.117 12.113-46.953-46.949 12.117-12.113a15.003 15.003 0 0 0 0-21.215l-56.805-56.805a14.996 14.996 0 0 0-21.21 0l-39.766 39.766c-21.504 21.504-21.504 56.5.003 78.015l124.965 124.973c10.39 10.387 24.246 16.106 39.008 16.106 14.766 0 28.621-5.72 39.012-16.106l39.765-39.762a15.012 15.012 0 0 0 4.395-10.609c0-3.977-1.582-7.793-4.395-10.605zm-4.172 96.566c-4.723 4.723-11.043 7.325-17.797 7.325-6.754 0-13.074-2.602-17.797-7.325l-124.96-124.968c-9.813-9.813-9.817-25.782-.005-35.59l29.157-29.16 35.59 35.593-12.118 12.114a15.003 15.003 0 0 0-4.394 10.605c0 3.98 1.582 7.793 4.394 10.61l68.164 68.164c5.86 5.855 15.356 5.859 21.215 0l12.117-12.114 35.59 35.59zM237.883 66.355c-8.285 0-15 6.715-15 15 0 8.282 6.715 15 15 15 34.328 0 66.605 13.368 90.879 37.645 24.277 24.273 37.644 56.547 37.644 90.879 0 8.281 6.715 15 15 15 8.281 0 15-6.715 15-15 0-42.344-16.488-82.152-46.43-112.094-29.94-29.941-69.75-46.43-112.093-46.43zm0 0\"><\/path> <path d=\"M302.14 224.875c0 8.281 6.72 15 15 15 8.286 0 15-6.719 15-15 0-51.973-42.285-94.254-94.257-94.254-8.285 0-15 6.715-15 15s6.715 15 15 15c35.433 0 64.258 28.824 64.258 64.254zm0 0\"><\/path> <\/symbol> <!-- Exchange icon --> <symbol viewBox=\"0 0 16 16\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" id=\"exchange-icon\"> <path d=\"M8.78 12.406h2.314a.75.75 0 0 1 0 1.5H6.969a.75.75 0 0 1-.75-.75V9.031a.75.75 0 0 1 1.5 0v2.315l4.907-4.908a.75.75 0 0 1 1.06 1.061L8.78 12.406zM7.22 3.594H4.907a.75.75 0 0 1 0-1.5h4.125a.75.75 0 0 1 .75.75v4.125a.75.75 0 0 1-1.5 0V4.654L3.374 9.562A.75.75 0 0 1 2.314 7.5L7.22 3.594z\"> <\/path> <\/symbol> <!-- Link icon --> <symbol xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 512.092 512.092\" id=\"link-icon\"> <path d=\"M312.453 199.601a116.167 116.167 0 0 0-20.053-16.128 119.472 119.472 0 0 0-64.427-18.859 118.952 118.952 0 0 0-84.48 34.987L34.949 308.23a119.466 119.466 0 0 0-34.91 84.318c-.042 65.98 53.41 119.501 119.39 119.543a118.7 118.7 0 0 0 84.395-34.816l89.6-89.6a8.534 8.534 0 0 0-6.059-14.592h-3.413a143.626 143.626 0 0 1-54.613-10.581 8.533 8.533 0 0 0-9.301 1.877l-64.427 64.512c-20.006 20.006-52.442 20.006-72.448 0-20.006-20.006-20.006-52.442 0-72.448l108.971-108.885c19.99-19.965 52.373-19.965 72.363 0 13.472 12.679 34.486 12.679 47.957 0a34.134 34.134 0 0 0 9.899-21.675 34.137 34.137 0 0 0-9.9-26.282z\"><\/path> <path d=\"M477.061 34.993c-46.657-46.657-122.303-46.657-168.96 0l-89.515 89.429a8.533 8.533 0 0 0-1.792 9.387 8.532 8.532 0 0 0 8.021 5.205h3.157a143.357 143.357 0 0 1 54.528 10.667 8.533 8.533 0 0 0 9.301-1.87
127l64.256-64.171c20.006-20.006 52.442-20.006 72.448 0 20.006 20.006 20.006 52.442 0 72.448l-80.043 79.957-.683.768-27.989 27.819c-19.99 19.965-52.373 19.965-72.363 0-13.472-12.679-34.486-12.679-47.957 0a34.139 34.139 0 0 0-9.899 21.845 34.137 34.137 0 0 0 9.899 26.283 118.447 118.447 0 0 0 34.133 23.893c1.792.853 3.584 1.536 5.376 2.304 1.792.768 3.669 1.365 5.461 2.048a67.799 67.799 0 0 0 5.461 1.792l5.035 1.365c3.413.853 6.827 1.536 10.325 2.133 4.214.626 8.458 1.025 12.715 1.195h6.485l5.12-.597c1.877-.085 3.84-.512 6.059-.512h2.901l5.888-.853 2.731-.512 4.949-1.024h.939a119.456 119.456 0 0 0 55.381-31.403l108.629-108.629c46.66-46.657 46.66-122.303.003-168.96z\"><\/path> <\/symbol><\/svg><div class=\"new_smartbtn_widget_iphone-btn new_smartbtn_widget_iphone-btn--fixed\" id=\"js-phone-btn\" data-smartbtn-device-profile-root=\"launcher\" data-ipwidget=181.215.65.70 data-smartbtn-language-pending lang=\"ru\" style=\"visibility: hidden;\"> <div class=\"new_smartbtn_widget-pseudo-scroll-9999999998\"><\/div> <div style=\"bottom: 20px; right: 20px; width:100px;height:100px;\" class=\"smartbtn-chat-main-animation smartbtn-skin-classic\" id=\"smartbtn-chat-main-animation-spiralAnim-none\" data-smartbtn-device-profile-launcher data-icon-preset=\"spiral-default\" onclick=\"smartbtnOpenChat()\" tabindex=\"0\" role=\"button\" aria-label=\"\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0447\u0430\u0442\" data-smartbtn-i18n-aria-label=\"launcher_open_chat\"> <div class=\"smartbtn-chat-main-animation-spiralAnim__box smartbtn-chat-main-animation-spiralAnim__box-one smartbtn-chat-main-animation-spiralAnim__box-active\"> <svg class=\"smartbtn-chat-main-animation-spiralAnim__img\" width=\"100%\" viewBox=\"0 0 36 36\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"> <path d=\"M0 18C0 8.05887 8.05887 0 18 0C27.9411 0 36 8.05887 36 18C36 27.9411 27.9411 36 18 36C8.05887 36 0 27.9411 0 18Z\" fill=\"#4C6C91\"\/><path d=\"M18.9808 23.9498C18.9808 23.9498 19.3418 23.9077 19.5267 23.6988C19.6959 23.5075 19.69 23.1464 19.69 23.1464C19.69 23.1464 19.6675 21.4602 20.4119 21.2112C21.1456 20.9664 22.0876 22.8418 23.0873 23.563C23.8425 24.1083 24.4157 23.9889 24.4157 23.9889L27.0872 23.9498C27.0872 23.9498 28.484 23.8593 27.8218 22.704C27.767 22.6093 27.4354 21.8491 25.8361 20.2874C24.1604 18.6526 24.3854 18.917 26.4024 16.0889C27.6311 14.3667 28.1221 13.3153 27.9685 12.8657C27.8228 12.4357 26.9189 12.5499 26.9189 12.5499L23.9119 12.5694C23.9119 12.5694 23.6889 12.5375 23.5236 12.6414C23.3622 12.7433 23.2575 12.9809 23.2575 12.9809C23.2575 12.9809 22.7821 14.3132 22.1473 15.4469C20.8081 17.8378 20.273 17.9644 20.0539 17.8162C19.5443 17.4695 19.6714 16.4253 19.6714 15.6836C19.6714 13.3657 20.006 12.3997 19.0209 12.1497C18.6942 12.0664 18.4536 12.0118 17.6172 12.0026C16.5441 11.9913 15.6364 12.0067 15.1218 12.2711C14.7795 12.447 14.5153 12.84 14.6767 12.8626C14.8753 12.8904 15.3253 12.9902 15.564 13.3318C15.8721 13.7731 15.8613 14.7628 15.8613 14.7628C15.8613 14.7628 16.0384 17.4911 15.4476 17.8296C15.0426 18.0621 14.487 17.5878 13.2926 15.4181C12.6812 14.3071 12.2195 13.0787 12.2195 13.0787C12.2195 13.0787 12.1305 12.8493 11.971 12.7258C11.7783 12.5766 11.5093 12.5303 11.5093 12.5303L8.65201 12.5499C8.65201 12.5499 8.22258 12.5622 8.06509 12.7587C7.92521 12.9326 8.05433 13.2937 8.05433 13.2937C8.05433 13.2937 10.2915 18.7987 12.825 21.5734C15.1482 24.1165 17.7855 23.9498 17.7855 23.9498H18.9808Z\" fill=\"white\"\/> <\/svg> <\/div> <div class=\"smartbtn-chat-main-animation-spiralAnim__box\"> <svg class=\"smartbtn-chat-main-animation-spiralAnim__img\" width=\"100%\" viewBox=\"0 0 36 36\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"> <path d=\"M18 36C27.9411 36 36 27.9411 36 18C36 8.05887 27.9411 0 18 0C8.05887 0 0 8.05887 0 18C0 27.9411 8.05887 36 18 36Z\" fill=\"#25D366\"\/><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M18.0461 28.811H18.0415C16.2082 28.8103 14.4068 28.3526 12.8069 27.484L7 29L8.55402 23.3509C7.59542 21.6976 7.09102 19.8222 7.09184 17.9009C7.09424 11.8902 12.0082 7 18.046 7C20.9763 7.00126 23.7266 8.13656 25.7947 10.1972C27.8628 12.2577 29.0012 14.9966 29 17.9095C28.9976 23.9188 24.0856 28.8085 18.0461 28.811ZM13.0871 25.551L13.4158 25.746C14.7976 26.5656 16.3816 26.9994 17.9965 27H18.0002C22.960
127 27 26.998 22.964 27 18.0033C27.0009 15.5993 26.0657 13.339 24.3665 11.6384C22.6673 9.93782 20.4076 9.00083 18.0037 9C13.0394 9 9.00197 13.0356 9 17.996C8.9993 19.6959 9.47512 21.3515 10.376 22.7839L10.59 23.1243L9.68083 26.4442L13.0871 25.551ZM22.6272 20.1901C22.7988 20.2794 22.9147 20.3398 22.9642 20.4287C23.0257 20.5392 23.0257 21.0699 22.8207 21.689C22.6156 22.3081 21.6327 22.8731 21.16 22.9491C20.7361 23.0174 20.1997 23.0459 19.6103 22.8441C19.2529 22.722 18.7947 22.5589 18.2077 22.2859C15.9011 21.213 14.3424 18.805 14.0478 18.3499C14.0271 18.318 14.0127 18.2957 14.0046 18.2841L14.0026 18.2813C13.8724 18.0941 13 16.8403 13 15.5426C13 14.3218 13.5567 13.6819 13.813 13.3874C13.8305 13.3672 13.8467 13.3487 13.8611 13.3317C14.0866 13.0663 14.3532 13 14.5172 13C14.6812 13 14.8454 13.0016 14.9888 13.0094C15.0065 13.0103 15.0249 13.0102 15.0439 13.0101C15.1873 13.0092 15.366 13.0081 15.5423 13.4643C15.6102 13.6399 15.7094 13.9002 15.8141 14.1748C16.0259 14.73 16.2598 15.3434 16.3009 15.4321C16.3624 15.5648 16.4034 15.7195 16.3214 15.8965C16.3091 15.923 16.2977 15.948 16.2869 15.972C16.2253 16.1074 16.1799 16.2071 16.0754 16.3385C16.0343 16.3903 15.9918 16.446 15.9493 16.5017C15.8647 16.6128 15.78 16.7238 15.7063 16.8029C15.5832 16.935 15.4549 17.0784 15.5985 17.3437C15.742 17.6091 16.2358 18.4769 16.9672 19.1797C17.7534 19.9351 18.4368 20.2544 18.7832 20.4162C18.8508 20.4478 18.9056 20.4734 18.9458 20.4951C19.1917 20.6278 19.3353 20.6056 19.4788 20.4287C19.6223 20.2519 20.0939 19.6549 20.2579 19.3896C20.4218 19.1243 20.5859 19.1685 20.8114 19.2569C21.037 19.3455 22.2466 19.9865 22.4927 20.1192C22.5407 20.1451 22.5856 20.1684 22.6272 20.1901Z\" fill=\"#FDFDFD\"\/> <\/svg> <\/div> <div class=\"smartbtn-chat-main-animation-spiralAnim__box\"> <svg class=\"smartbtn-chat-main-animation-spiralAnim__img\" width=\"100%\" viewBox=\"0 0 36 36\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"> <path d=\"M18 36C27.9411 36 36 27.9411 36 18C36 8.05887 27.9411 0 18 0C8.05887 0 0 8.05887 0 18C0 27.9411 8.05887 36 18 36Z\" fill=\"#37AEE2\"\/><path d=\"M8.27186 18.4425C10.1133 17.3538 12.1689 16.4452 14.0895 15.532C17.3937 14.0361 20.711 12.5662 24.0618 11.1978C24.7137 10.9646 25.8851 10.7366 26 11.7735C25.9371 13.2413 25.6783 14.7005 25.5009 16.1597C25.0505 19.3686 24.5298 22.5665 24.0221 25.7649C23.8472 26.8302 22.6038 27.3817 21.8081 26.6999C19.8961 25.3138 17.9693 23.941 16.0816 22.5227C15.4633 21.8483 16.0367 20.8799 16.5889 20.3984C18.1638 18.7326 19.8339 17.3174 21.3264 15.5656C21.7291 14.5221 20.5395 15.4015 20.1471 15.671C17.9911 17.2656 15.8879 18.9575 13.6148 20.3589C12.4538 21.0449 11.1005 20.4587 9.93994 20.0759C8.89937 19.6135 7.37453 19.1476 8.27176 18.4426L8.27186 18.4425Z\" fill=\"white\"\/><defs><linearGradient id=\"paint0_linear\" x1=\"24.0015\" y1=\"6.0012\" x2=\"15.0015\" y2=\"27\" gradientUnits=\"userSpaceOnUse\"><stop stop-color=\"#37AEE2\"\/><stop offset=\"1\" stop-color=\"#1E96C8\"\/><\/linearGradient><\/defs> <\/svg> <\/div> <div class=\"smartbtn-chat-main-animation-spiralAnim__box\"> <svg class=\"smartbtn-chat-main-animation-spiralAnim__img\" width=\"100%\" viewBox=\"0 0 36 36\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"> <path d=\"M0 18C0 8.05887 8.05887 0 18 0C27.9411 0 36 8.05887 36 18C36 27.9411 27.9411 36 18 36C8.05887 36 0 27.9411 0 18Z\" fill=\"#F68634\"\/><path d=\"M19.8028 21.3971L22.2935 23.8267C22.8037 24.3234 22.8037 25.13 22.2935 25.6271C21.7838 26.1243 20.9576 26.1243 20.4484 25.6271L17.9995 23.2396L15.5528 25.6271C15.2977 25.8754 14.9634 25.9997 14.6291 25.9997C14.2953 25.9997 13.9615 25.8754 13.7064 25.6271C13.1967 25.13 13.1967 24.3239 13.7059 23.8267L16.1969 21.3971C15.2899 21.1955 14.4153 20.845 13.6096 20.352C12.9999 19.9771 12.8168 19.1915 13.2009 18.5963C13.584 18.0004 14.3897 17.8209 15.0004 18.1959C16.8244 19.315 19.1741 19.3153 20.9992 18.1959C21.61 17.8209 22.4153 18.0004 22.7992 18.5963C23.1834 19.191 22.9997 19.9771 22.39 20.352C21.5844 20.8455 20.7097 21.1955 19.8028 21.3971Z\" fill=\"white\"\/><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M14 13.5005C14 15.4303 15.7941 17 18 17C20.2064 17 22 15.4303 22 13.5005C22 11.5701 20.2064 10 18 10C15.7941 10 14 11.5701 14 13.5005ZM19.818 13.5C19.818 12.7278 19.0024 12.0999 17.9998 12.0999C16.998 12.0999 16.1816 12.7278 16.1816 13.5C16.1816 14.2716 16.998 14.8999 17.9998 14.8999C19.0024 14.8999 19.818 14.2716 19.818 13.5Z\" fill=\"white\"\/> <\/svg> <\/div> <div class=\"smartbtn-chat-main-animation-spiralAnim__box\"> <svg class=\"smartbtn-chat-main-animation-spiralAnim__img\" width=\"100%\" viewBox=\"0 0 36 36\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"> <path d=\"M18 0C27.9411 0 36 8.05887 36 18C36 27.9411 27.9411 36 18 36C8.05887 36 0 27.9411 0 18C0 8.05887 8.05887 0 18 0Z\" fill=\"#7F4DA0\"\/><path d=\"M23.1518 15.0631C23.0693 14.3663 22.8603 13.8195 22.4879 13.3356C22.0044 12.7126 21.3855 12.3403 20.4683 12.1209C19.8706 11.9746 19.6289 11.9921 19.4121 12.1939C19.2101 12.383 19.1698 12.761 19.3232 13.0054C19.4311 13.1828 19.5558 13.2461 19.9031 13.3147C20.3655 13.4003 20.685 13.512 20.9754 13.6807C21.5919 14.0422 21.878 14.6096 21.9065 15.5293C21.9198 15.9611 21.9561 16.0938 22.1038 16.2466C22.3776 16.5259 22.8662 16.4702 23.0743 16.1347C23.1506 16.0082 23.1624 15.9532 23.1711 15.6599C23.1769 15.4784 23.1699 15.2081 23.1518 15.0631Z\" fill=\"white\"\/><path d=\"M25.6624 15.4978C25.5283 13.5694 24.7009 12.0135 23.2311 10.9136C22.4029 10.2955 21.404 9.86797 20.3108 9.65642C19.9103 9.5807 19.1735 9.51686 19.0474 9.55011C18.9283 9.58088 18.7605 9.69897 18.686 9.80622C18.6073 9.92253 18.5911 10.1832 18.6599 10.3344C18.771 10.5872 18.9752 10.6775 19.5456 10.7269C20.425 10.8031 21.3334 11.0934 22.0211 11.5193C22.8063 12.0041 23.4322 12.6646 23.8394 13.4388C24.1912 14.104 24.4111 15.061 24.4108 15.9167C24.4108 16.2262 24.4638 16.4013 24.5995 16.5299C24.8045 16.7276 25.1016 16.7723 25.3627 16.6434C25.6522 16.5043 25.7185 16.2574 25.6624 15.4978Z\" fill=\"white\"\/><path d=\"M27.9044 23.9651C27.8651 23.8494 27.7732 23.6709 27.7076 23.5685C27.2941 22.9406 25.0726 21.1924 23.9634 20.6206C23.3301 20.2935 22.8609 20.1844 22.513 20.2868C22.1389 20.3926 21.942 20.5677 21.3153 21.351C21.0626 21.6649 20.8034 21.9591 20.7345 22.0053C20.5638 22.1243 20.2291 22.2202 19.9929 22.2202C19.4448 22.2168 18.4506 21.8599 17.686 21.3906C17.092 21.0271 16.3308 20.3761 15.7466 19.7316C15.0575 18.9749 14.5883 18.3073 14.2175 17.5538C13.7384 16.5855 13.617 15.9939 13.8171 15.561C13.8664 15.4519 13.932 15.3363 13.9615 15.2999C13.991 15.2669 14.2995 15.0124 14.6407 14.7348C15.3102 14.1994 15.4185 14.0772 15.5432 13.7103C15.7007 13.2443 15.658 12.7684 15.4152 12.2893C15.2281 11.9257 14.7392 11.1326 14.3848 10.6203C13.9156 9.94619 12.7474 8.5053 12.5144 8.31026C12.0943 7.9666 11.5562 7.90708 10.9622 8.13846C10.3355 8.38302 9.16072 9.33479 8.65864 9.99906C8.2058 10.6005 8.03194 11.0268 8.00566 11.5886C7.9827 12.0513 8.02207 12.243 8.2649 12.8345C10.1649 17.4745 13 21.1791 16.8952 24.1204C18.9297 25.6571 21.0396 26.827 23.2284 27.6268C24.5048 28.0928 25.0594 28.1159 25.7124 27.7326C25.988 27.5673 26.6706 26.8634 27.0512 26.3512C27.6813 25.4985 27.9143 25.1052 27.9799 24.7913C28.0259 24.5765 27.9898 24.2031 27.9044 23.9651Z\" fill=\"white\"\/>
12<path d=\"M28.21 16.0252C28.1633 14.9044 27.9634 13.9845 27.5493 12.9584C27.1405 11.9491 26.7279 11.29 25.9496 10.3979C25.2139 9.56152 24.6429 9.0835 23.7381 8.55062C22.4757 7.80816 20.9406 7.3148 19.2214 7.10421C18.6351 7.03065 18.5025 7.0354 18.323 7.14974C17.9752 7.36633 17.9816 7.90908 18.3317 8.12443C18.4477 8.19294 18.5504 8.21808 19.0194 8.27819C19.7394 8.37304 20.2024 8.4618 20.752 8.60683C22.907 9.1766 24.5664 10.3333 25.6786 12.0464C26.6094 13.4744 26.9983 14.9008 26.9493 16.7211C26.9322 17.3365 26.9463 17.4448 27.045 17.593C27.234 17.8691 27.7304 17.9251 27.9843 17.6971C28.1423 17.5582 28.1718 17.4536 28.2014 16.927C28.2156 16.6523 28.2175 16.2466 28.21 16.0252Z\" fill=\"white\"\/> <\/svg> <\/div> <\/div><\/div><div class=\"new_smartbtn_widget_view smartbtn-skin-classic\" id=\"smartbtn_widget_view\" data-smartbtn-device-profile-root=\"chat\" data-smartbtn-language-pending lang=\"ru\" dir=\"ltr\" style=\"visibility: hidden;\" dataposition=\" smartbtn-position-widget-in-page-bottom-right \" onmouseenter=\"smartbtnWidgetOver()\" onmouseleave=\"smartbtnWidgetOut()\"> <div class=\"new_smartbtn_widget_view-shadow-for-mobiles\" id=\"js-new_smartbtn_widget_view-shadow-for-mobiles\"> <div class=\"new_smartbtn_widget_view-shadow-for-mobiles-messege\" id=\"please_turn_your_phone\" data-smartbtn-i18n=\"please_turn_your_phone\"> \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u0435\u0440\u0435\u0432\u0435\u0440\u043d\u0438\u0442\u0435 \u0442\u0435\u043b\u0435\u0444\u043e\u043d <\/div> <\/div> <style> .smartbtn-chat-main__container-socials-and-post-message-socials__text { width: 340px; line-height: 14px; font-size: 14px; font-weight: 600; display: flex; flex-direction: column; } .smartbtn-chat-main__container-socials-and-post-message-socials-links_info { display: flex; flex-direction: row; align-items: center; justify-content: flex-start; padding-right: 10px; overflow: hidden; text-overflow: clip; } .smartbtn-chat-main__container-socials-and-post-message-socials-links_info-content { display: flex; flex-direction: row; align-items: center; justify-content: center; margin-left: 0; margin-right: auto; width: 100%; } .smartbtn-chat-main__container-socials-and-post-message-socials__text-for-click { padding-top: 18px; padding-bottom: 18px; padding-left: 5px; line-height: 14px; font-size: 14px; font-weight: 600; } .smartbtn-chat-main__container-socials-and-post-message-socials__text-random-socials { width: 62px; top: 18px; \/* top: 12px; *\/ } .smartbtn-chat-main__container-socials-and-post-message-socials-links_info-disable { \/*display: none;*\/ height: 0; } .smartbtn-chat-main__container-socials-and-post-message-socials__text-random-socials { position: static; flex-direction: row; align-items: center; justify-content: flex-start; display: -webkit-box; display: -ms-flexbox; display: flex; overflow: hidden; width: 62px; z-index: 1; margin-left:10px; } .smartbtn-chat-main__container-socials-and-post-message-socials-svg { width: 28px; height: 28px; min-width: 28px; top: 18px; } .smartbtn-chat-main__container-socials-and-post-message-socials-svg { cursor: pointer; width: 28px; height: 28px; min-width: 28px; background-color: #e9e6fc; border-radius: 32px; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; align-items: center; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; } .smartbtn-chat-main-arrow_open-socials{ position: static; display: flex; align-items: center; justify-content: center; margin-left: 20px; margin-right: 0; } .smartbtn-chat-main__container-socials-and-post-message-socials-l
12inks_buttons-parent { display: flex; align-items: center; justify-content: space-evenly; margin-left:0; margin-right:auto; width: 100%; } .smartbtn-chat-main__container-socials-and-post-message-socials__text .smartbtn-chat-main__container-socials-and-post-message-socials__text-random-socials .new_smartbtn_widget_social-card .new_smartbtn_widget_social-card__icon_small { width: 28px !important; height: 28px !important; min-width: 28px; min-height: 28px; } .smartbtn-chat-main__container-socials-and-post-message-socials__text .smartbtn-chat-main__container-socials-and-post-message-socials__text-random-socials .new_smartbtn_widget_social-card { width: 28px !important; height: 28px !important; min-width: 28px; min-height: 28px; overflow: hidden; animation: SmartbtnPulse 3s infinite alternate;\t\t \/* transition: background 0.4s, border 0.2s, margin 0.2s; *\/ } .smartbtn-chat-main__container-socials-and-post-message-socials__text-random-socials .new_smartbtn_widget_social-card .new_smartbtn_widget_social-card__icon_small .new_smartbtn_widget_icon { width: 17px !important; height: 17px !important; } @keyframes SmartbtnPulse { 0% { -webkit-transform: rotate(0deg) scale(1); transform: rotate(0deg) scale(1); } 50% { -webkit-transform: rotate(2000deg) scale(0.5); transform: rotate(2000deg) scale(0.5); } 100% { -webkit-transform: rotate(0deg) scale(1); transform: rotate(0deg) scale(1); } } .smartbtn-chat-main__container-socials-and-post-message-socials__text .smartbtn-chat-main__container-socials-and-post-message-socials__text-random-socials .new_smartbtn_widget_social-card { min-width: 28px; overflow: hidden; } \/* smartbtn-chat-main__container-socials-and-post-message-socials-links smartbtn-chat-main__container-socials-and-post-message-socials-links-active *\/ .smartbtn-chat-main__container-socials-and-post-message-socials-links-active .new_smartbtn_widget_social-card { min-height: 40px; } .smartbtn-chat-main__container-socials-and-post-message-socials-links { position: relative; padding-top: 15px; padding-bottom: 5px; padding-right: 10px; } .smartbtn-chat-main__container-socials-and-post-message-socials-links-active { -webkit-box-align: center; -ms-flex-align: center; align-items: center; -webkit-box-pack: flex-start; -ms-flex-pack: flex-start; justify-content: flex-start; } @media (max-width: 480px) { .smartbtn-chat-main__container-socials-and-post-message-socials__text { width: 400px; } .smartbtn-chat-main__container-socials-and-post-message-socials__text-for-click { padding-left: 5px; line-height: 18px; font-size: 18px; font-weight: 600; } } @media (max-width: 420px) { .smartbtn-chat-main__container-socials-and-post-message-socials__text { width: 370px; } .smartbtn-chat-main__container-socials-and-post-message-socials__text-for-click { padding-left: 5px; line-height: 17px; font-size: 17px; font-weight: 600; } } @media (max-width: 390px) { .smartbtn-chat-main__container-socials-and-post-message-socials__text { width: 350px; } .smartbtn-chat-main__container-socials-and-post-message-socials__text-for-click { padding-left: 5px; line-height: 16px; font-size: 16px; font-weight: 600; } } .new_smartbtn_widget_social-card__icon { border-radius: 100px; } .new_smartbtn_widget_view { opacity: 0; border: none; margin-right: 0; margin: 0; position: fixed; opacity: 1; z-index: 9999999999; border-radius: 40px; width: 410px !important; overflow: hidden; display: none; bottom: 300%; right: 0px; } .new_smartbtn_widget_view-animation { -webkit-transition: 0.3s ease-in-out; -o-transition: 0.3s ease-in-out; transition: 0.3s ease-in-out; } xmp{ white-space: pre-wrap; word-break: keep-all;
12 overflow-wrap: anywhere; } .new_smartbtn_widget_view--opened { bottom: 0px; right: 0px; display: flex; } @media (max-width: 480px) { .new_smartbtn_widget_view { border-radius: 0; background-color: #343434; height: 100%; width: 100% !important; } \/* Mobile takes the whole viewport (rule above), so the owner's configured chat-window edge offset (widget_chat_offset_x\/y, applied in .new_smartbtn_widget_view--opened above) must NOT also apply here -- it would shove the fullscreen panel off-canvas. Flush to all four edges instead, same as before this offset feature existed. Same later-in-source class-override mechanism as .new_smartbtn_widget_view___locale_wrapper \/ .new_smartbtn_widget_phone below. *\/ .new_smartbtn_widget_view--opened { top: 0; right: 0; bottom: 0; left: 0; } } .smartbtn-chat-main__container-chat-call__no_active{ display: none; } .new_smartbtn_widget_view--service-text{ position: absolute; z-index: 9; bottom: .3em; margin-left: auto; margin-right: auto; left: 0; right: 0; text-align: center; color: #fff; user-select: none; margin-top: 0 !important; margin-bottom: 0 !important; font-size: 13px; padding-bottom: 5px; padding-top: 5px; } .new_smartbtn_widget_view--service-text a{ color: #ffffff; font-weight: 600; letter-spacing: 0.8px; } .smartbtn-call-success-message-no-operators{ \/*position: fixed;*\/ bottom: 90px; opacity: 0; user-select: none; z-index: -9; padding: 6px 3px; margin: 0px 25px; text-align: center; box-shadow: 0px 0px 13px 12px rgb(58 155 81 \/ 22%); color: #155724; background-color: #d4edda; border: none; border-radius: 6px; font-weight: 600; font-size: 20px; transition: all .4s ease-in-out; } \/* #smb-set-locale{ margin-top: 60px; cursor: pointer; color: #ffffff; } *\/ .smartbtn-chat-main__container-chat{ overscroll-behavior: contain; } .new_smartbtn_widget_view___locale { line-height: 12px; margin-left: 0; \/* position: absolute; top: 15px; left: 30px; cursor: pointer; *\/ color: white; background: transparent; border: 1px solid rgba(255, 255, 255, .55); border-radius: 6px; min-height: 28px; padding: 2px 6px; font: inherit; } .new_smartbtn_widget_view___locale option { color: #131313; } .smartbtn-widget-visually-hidden { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; } .new_smartbtn_widget_view___locale_wrapper { position: absolute; \/* Centered on the operators-row avatar axis: row top is 5 (header padding) + 10 (title margin) + 31 (title) + 16 (subtitle 14px line + 2px margin) + 8 (row margin) = 70px, avatar box is 52px high, so the axis sits at 96px; the 22px pill starts at 96 - 11 = 85px. *\/ top: 85px; left: 20px; cursor: pointer; display: flex; flex-direction: row; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; -webkit-box-align: center; -ms-flex-align: center; align-items: center; }
12 \/* When the operators row is collapsed (script.js keeps inline \"display: none\" while zero operators are online), pull the locale pill and the call button back onto a shared axis beside the subtitle so neither jumps between the two header states. Both elements follow the row in the DOM, hence the sibling combinator. *\/ #smartbtn_widget_head_operators_row[style*=\"display: none\"] ~ .new_smartbtn_widget_view___locale_wrapper, #smartbtn_widget_head_operators_row.smartbtn-operators-row-hidden ~ .new_smartbtn_widget_view___locale_wrapper { top: 55px; } #smartbtn_widget_head_operators_row[style*=\"display: none\"] ~ .new_smartbtn_widget_phone, #smartbtn_widget_head_operators_row.smartbtn-operators-row-hidden ~ .new_smartbtn_widget_phone { top: 41px; } \/* operators_display_mode = 'none' (constructor setting): force the row hidden regardless of the live online-operator count the WS layer pushes via setOnlineOperator()\/ fUpdateWidgetOperatorsRowVisibility() in script.js -- those only ever touch the row's plain (non-!important) inline `style.display`, which a stylesheet !important rule always wins against. Keeping the class off the row (rather than removing the row's DOM node) is deliberate: script.js's getElementById lookups for the row and its 3 status-dot children must keep resolving, or setOnlineOperator() throws on the next WS event. *\/ #smartbtn_widget_head_operators_row.smartbtn-operators-row-hidden { display: none !important; } .new_smartbtn_widget_view__header{ height: auto; min-height: 100px; -webkit-box-pack: flex-start; -ms-flex-pack: flex-start; justify-content: flex-start; padding-top: 5px; padding-bottom: 12px; } .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head-operators{ \/* feat SB-FEAT-HEADER-SLOTS: unlimited slots that scroll horizontally. `safe center` keeps a short row centred but falls back to start- alignment (so nothing is clipped off both ends) once it overflows; browsers that don't understand `safe` use the plain `center` above. *\/ max-width: 100%; -ms-flex-wrap: nowrap; flex-wrap: nowrap; justify-content: center; justify-content: safe center; overflow-x: auto; overflow-y: hidden; scrollbar-width: thin; -webkit-overflow-scrolling: touch; \/* The horizontal scroll needs overflow-y clipped too (overflow-x:auto forces the other axis to clip), which otherwise cuts off the active operator's box-shadow ring at the top\/sides. Give the row inner padding so the ring fits INSIDE the clip box, and drop margin-top by the same amount (8 -> 2 + 6px padding) so the avatar axis is unchanged \u2014 important, the mobile locale\/phone pills are aligned to it (see the \"\u0441\u044a\u0435\u0445\u0430\u043b\u0430\" fix in the media queries below). *\/ margin-top: 2px; padding: 6px 6px 0; } \/* Keep each avatar at its natural width and scroll instead of squishing. *\/ .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head-operators-one-operator{ -ms-flex-negative: 0; flex-shrink: 0; } .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head-operators::-webkit-scrollbar{ height: 4px; } .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head-operators::-webkit-scrollbar-thumb{ background: rgba(255, 255, 255, 0.35); border-radius: 4px; } .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head-operators::-webkit-scrollbar-track{ background: transparent; } \/* Operators row is shown on mobile \/ short screens too (it used to be desktop-only). Kept COMPACT \u2014 smaller 30px avatars, names hidden \u2014 so it fits the fixed-height (HEIGHT_HEADER=100) mobile header. The old rules force-hid the row and unconditionally pinned the locale\/phone to the collapsed axis; both are dropped here so the existing #...operators_row[style*=\"dis
12play: none\"] sibling rules keep placing the locale\/phone correctly whether the row is shown (operators online) or collapsed by script.js (nobody online). *\/ @media (max-width: 480px) { .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head-operators{ display: -webkit-box; display: -ms-flexbox; display: flex; \/* Give the row 3px of vertical ring-room for the active-operator ring (2px solid + glow), which overflow-y:hidden was clipping top and bottom on mobile. margin-top drops by the same 3px (2 -> -1) so the avatar axis the locale\/phone pills are tuned to does not move. *\/ margin-top: -1px; padding-top: 3px; padding-bottom: 3px; } .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head-operators-one-operator-img--active{ \/* Tighter glow on the compact 30px avatars so the ring fits the 3px room. *\/ -webkit-box-shadow: 0 0 0 2px #42C1B8, 0 0 4px 1px rgba(66, 193, 184, 0.4); box-shadow: 0 0 0 2px #42C1B8, 0 0 4px 1px rgba(66, 193, 184, 0.4); } .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head-operators-one-operator{ width: 40px; margin-left: 3px; margin-right: 3px; } .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head-operators-one-operator-img{ width: 30px; height: 30px; padding: 2px; } .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head-operators-one-operator-name{ display: none; } .new_smartbtn_widget_view__header{ padding-bottom: 4px; } \/* Re-align the language pill and call button onto the SMALLER mobile operator-avatar axis (30px avatars, not the desktop 52px): the avatar centre sits ~72px down the fixed 100px header, so centre the ~22px locale pill (top 61) and the 50px phone (top 47) there. Without this they fall back to the desktop base top:85 and drop below the header onto the tabs (\"\u0441\u044a\u0435\u0445\u0430\u043b\u0430\"). *\/ .new_smartbtn_widget_view___locale_wrapper{ top: 61px; } .new_smartbtn_widget_phone{ top: 47px; } } @media (max-height: 700px) { .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head-operators{ display: -webkit-box; display: -ms-flexbox; display: flex; \/* Give the row 3px of vertical ring-room for the active-operator ring (2px solid + glow), which overflow-y:hidden was clipping top and bottom on mobile. margin-top drops by the same 3px (2 -> -1) so the avatar axis the locale\/phone pills are tuned to does not move. *\/ margin-top: -1px; padding-top: 3px; padding-bottom: 3px; } .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head-operators-one-operator-img--active{ \/* Tighter glow on the compact 30px avatars so the ring fits the 3px room. *\/ -webkit-box-shadow: 0 0 0 2px #42C1B8, 0 0 4px 1px rgba(66, 193, 184, 0.4); box-shadow: 0 0 0 2px #42C1B8, 0 0 4px 1px rgba(66, 193, 184, 0.4); } .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head-operators-one-operator{ width: 40px; margin-left: 3px; margin-right: 3px; } .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head-operators-one-operator-img{ width: 30px; height: 30px; padding: 2px; } .new_smartbtn_widget_view__header .smartbtn-chat-main__container-head-operators-one-operator-name{ display: none; } .new_smartbtn_widget_view___locale_wrapper{ top: 61px; } .new_smartbtn_widget_phone{ top: 47px; } } .smartbtn-chat-main__container-head__title { margin-top: 10px; text-align: center; max-height:31px; overflow: hidden; text-overflow: clip;
12 overflow-wrap: anywhere; word-break: break-word; } .new_smartbtn_widget_view__close { line-height: 12px; position: absolute; top: 20px; left: 20px; cursor: pointer; } .smartbtn-chat-main__container-head__text { \/* Preview parity: a small muted single line right under the title (the old 20px\/600 style predates the signature ever rendering - the controller used to pass blanks, so the element was empty). NOTE: this whole block is embedded raw into a single-quoted JS string by widget-v2\/layout.blade.php - never use an apostrophe in any comment or text here, it breaks the widget script parse. The header already has 75px of its own side padding; the previous 70px extra margin on top of that left only ~120px for the text (measured live), truncating the default phrase after a few words. The locale pill sits at left:20px (clears the header padding by ~20px) and the call button hugs the right edge, so 20px\/15px extra is enough clearance without re-doubling the header padding. Long signatures still get an ellipsis instead of inflating the header. *\/ color: #EAF2FF; text-align: center; font-size: 12px; line-height: 14px; margin: 2px 15px 0 20px; font-weight: 400; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .new_smartbtn_widget_phone{ \/* 50px call button centered on the same 96px avatar axis. *\/ top: 71px; bottom: auto; } \/* Base stylesheet hides the call button and only reveals it at <=1024px; when the button has a phone number, show it on desktop too (this inline block is parsed after the head stylesheet, so it wins the cascade). *\/ .new_smartbtn_widget_phone{ display: -webkit-box; display: -ms-flexbox; display: flex; } @media (max-width: 480px) { .new_smartbtn_widget_phone { bottom: auto; top: 41px; } } .smartbtn-chat-main__container-head-logo { top: 10px; } .new_smartbtn_widget_view___locale_icon { width: 38px; height: 22px; } .new_smartbtn_widget_view___locale { } .smartbtn-chat-main__container-socials-and-post-message-socials-links_buttons-parent .new_smartbtn_widget_social-card:hover { overflow: hidden; \/* animation: pulse 3s infinite alternate; *\/ } .smartbtn-widget-quick-phrases { display: flex; flex-wrap: wrap; gap: 6px; padding: 0 15px 10px; } .smartbtn-widget-quick-phrases:empty { display: none; } .smartbtn-widget-quick-phrase { border: 1px solid rgba(33, 34, 35, 0.18); border-radius: 14px; background: #fff; color: #212223; cursor: pointer; font: inherit; padding: 5px 9px; } \/* \u041f\u043e\u043a\u0430 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 \u0432 \u0440\u0430\u0431\u043e\u0442\u0435, \u043a\u043d\u043e\u043f\u043a\u0438 \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u0432\u0438\u0434\u0438\u043c\u043e, \u0430 \u043d\u0435 \u043c\u043e\u043b\u0447\u0430 \u043f\u0440\u043e\u0433\u043b\u0430\u0442\u044b\u0432\u0430\u044e\u0442 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 (script.js, smartbtnApplyQuickPhraseLock). *\/ .smartbtn-widget-quick-phrases--waiting .smartbtn-widget-quick-phrase { cursor: default; opacity: 0.45; } \/* Link buttons under an operator or bot message (script.
12js, smartbtnBuildEnvelopeButtons; format: App\/Support\/MessageEnvelope). The widget lives in the host page DOM, so the selectors are scoped to the widget root and reset what a host stylesheet may put on a plain link (colour, underline, display). *\/ .new_smartbtn_widget_view .smartbtn-widget-message-buttons { display: flex; flex-direction: column; align-items: stretch; gap: 6px; margin: 6px 0 2px; max-width: 92.5%; } .new_smartbtn_widget_view a.smartbtn-widget-message-button { display: block; box-sizing: border-box; border: 1px solid #2F6FEB; border-radius: 14px; padding: 7px 12px; font: inherit; font-size: 12px; line-height: 16px; font-weight: 600; text-align: center; text-decoration: none; overflow-wrap: anywhere; word-break: break-word; cursor: pointer; } .new_smartbtn_widget_view a.smartbtn-widget-message-button--primary, .new_smartbtn_widget_view a.smartbtn-widget-message-button--primary:visited { background: #2F6FEB; color: #fff; } .new_smartbtn_widget_view a.smartbtn-widget-message-button--primary:hover { background: #245BD0; color: #fff; } .new_smartbtn_widget_view a.smartbtn-widget-message-button--secondary, .new_smartbtn_widget_view a.smartbtn-widget-message-button--secondary:visited { background: #fff; color: #2F6FEB; border-color: rgba(33, 34, 35, 0.18); } .new_smartbtn_widget_view a.smartbtn-widget-message-button--secondary:hover { border-color: #2F6FEB; } #js-smartbtn-chat-box.smartbtn-widget-body--dark a.smartbtn-widget-message-button--secondary, #js-smartbtn-chat-box.smartbtn-widget-body--dark a.smartbtn-widget-message-button--secondary:visited { background: transparent; color: #EAF2FF; border-color: rgba(234, 242, 255, 0.35); } .new_smartbtn_widget_view a.smartbtn-widget-message-button:focus-visible { outline: 2px solid #2F6FEB; outline-offset: 2px; } .smartbtn-widget-transcript-tools { position: sticky; top: 0; z-index: 2; display: flex; flex-direction: column; align-items: flex-end; padding: 2px 0 8px; } .smartbtn-widget-transcript-tools button { min-height: 32px; padding: 5px 10px; border: 1px solid #b9c3cc; border-radius: 6px; background: #fff; color: #263746; font: inherit; font-size: 12px; cursor: pointer; } .smartbtn-widget-transcript-tools button:focus-visible { outline: 2px solid #2f6feb; outline-offset: 2px; } .smartbtn-widget-transcript-status { font-size: 11px; color: #34495e; background: #fff; } .smartbtn-widget-transcript-status:empty { display: none; } <\/style> <div class=\"new_smartbtn_widget_view-shadow-for-socials-and-smiles\" onclick=\"smartbtnWidgetCloseModals()\"><\/div> <div class=\"new_smartbtn_widget_view_width\"> <div class=\"new_smartbtn_widget_view__header\"> <div class=\"new_smartbtn_widget_view__close\" id=\"js-back-view\" onclick=\"smartbtnCloseChat()\" role=\"button\" tabindex=\"0\" aria-label=\"\u0417\u0430\u043a\u0440\u044b\u0442\u044c \u0447\u0430\u0442\" data-smartbtn-i18n-aria-label=\"close_chat\"> <svg class=\"new_smartbtn_widget_icon\"> <use xlink:href=\"#close-icon\"><\/use> <\/svg> <\/div> <div class=\"smartbtn-chat-main__container-head__title\" data-smartbtn-text-field=\"widget_name\"> \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 Smartbtn <\/div> <div class=\"smartbtn-chat-main__container-head__text\" data-signature=\"\u041c\u044b \u0442\u0443\u0442 \u0438 \u0433\u043e\u0442\u043e\u0432\u044b \u043f\u043e\u043c\u043e\u0447\u044c\" id=\"smartbtn-chat-head_text\" data-smartbtn-text-field=\"widget_signature\">\u041c\u044b \u0442\u0443\u0442 \u0438 \u0433\u043e\u0442\u043e\u0432\u044b \u043f\u043e\u043c\u043e\u0447\u044c<\/div> <div class=\"smartbtn-chat-main__container-head-logo\" data-smartbtn-profile-logo> <div class=\"new_smartbtn_widget_logo\" style=\"background-image: url("https:\/\/smartbtn.ru\/assets\/images\/logo_white.svg");\"><\/div> <\/div> <div class=\"smartbtn-chat-main__container-head-operators\" id=\"smartbtn_widget_head_operators_row\" style=\"display: none\"> <div class=\"smartbtn-chat-main__container-head-operators-one-operator\"> <div class=\"smartbtn-chat-main__container-head-operators-one-operator-img\" dataId=\"10\" style=\"background-image: url("https:\/\/smartbtn.ru\/storage\/2331c204150c0fab02304984d6dc330a\/imageOperator\/10\/YfVkfiAy1EmIEjqj6phjWEInby6bOI34Y5f9G3E9.pngChatGPT_Image_Jul_11,_2026,_06_29_23_PM.png");\"> <div class=\"smartbtn-chat-main__container-head-operators-one-operator-status\" id=\"smartbtn_chat_main__container_head_operators_slot_0_widget\"><\/div> <\/div> <div class=\"smartbtn-chat-main__container-head-operators-one-operator-name\">AI-\u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442<\/div> <\/div> <div class=\"smartbtn-chat-main__container-head-operators-one-operator\"> <div class=\"smartbtn-chat-main__container-head-operators-one-operator-img\" dataId=\"1\" style=\"background-image: url("https:\/\/smartbtn.ru\/storage\/2331c204150c0fab02304984d6dc330a\/imageOperator\/1\/vKap8pGueFsfF2194JqrDmMaePNdsGQV9R5h5heV.pngChatGPT_Image_Jul_11,_2026,_06_15_49_PM.png");\"> <div class=\"smartbtn-chat-main__container-head-operators-one-operator-status\" id=\"smartbtn_chat_main__container_head_operators_slot_1_widget\"><\/div> <\/div> <div class=\"smartbtn-chat-main__container-head-operators-one-operator-name\">\u0415\u0432\u0433\u0435\u043d\u0438\u0439<\/div> <\/div> <\/div> <div class=\"new_smartbtn_widget_view___locale_wrapper\" id=\"smb-set-locale\" data-smartbtn-language-switcher> <svg class=\"new_smartbtn_widget_view___locale_flag\" data-smartbtn-language-flag=\"ru\" width=\"20\" height=\"12\" viewBox=\"0 0 38 22\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" > <path d=\"M38 0H0V11H38V0Z\" fill=\"white\"\/>
12 <path d=\"M38 11.0001H0V22.0001H38V11.0001Z\" fill=\"#D52B1E\"\/> <path d=\"M38 7.33325H0V14.6666H38V7.33325Z\" fill=\"#0039A6\"\/><\/svg><svg class=\"new_smartbtn_widget_view___locale_flag\" data-smartbtn-language-flag=\"en\" width=\"20\" height=\"12\" viewBox=\"0 0 38 22\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" style=\"display:none\" > <rect width=\"38\" height=\"22\" fill=\"#00247D\"\/> <path d=\"M0 0L38 22M38 0L0 22\" stroke=\"#fff\" stroke-width=\"4\"\/> <path d=\"M0 0L38 22M38 0L0 22\" stroke=\"#CF142B\" stroke-width=\"1.6\"\/> <path d=\"M19 0V22M0 11H38\" stroke=\"#fff\" stroke-width=\"7\"\/> <path d=\"M19 0V22M0 11H38\" stroke=\"#CF142B\" stroke-width=\"4\"\/><\/svg><svg class=\"new_smartbtn_widget_view___locale_flag\" data-smartbtn-language-flag=\"el\" width=\"20\" height=\"12\" viewBox=\"0 0 38 22\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" style=\"display:none\" > <rect width=\"38\" height=\"22\" fill=\"#0D5EAF\"\/> <rect y=\"5.5\" width=\"38\" height=\"5.5\" fill=\"#fff\"\/> <rect y=\"16.5\" width=\"38\" height=\"5.5\" fill=\"#fff\"\/> <rect width=\"15\" height=\"12\" fill=\"#0D5EAF\"\/> <rect x=\"6.2\" width=\"2.6\" height=\"12\" fill=\"#fff\"\/> <rect y=\"4.7\" width=\"15\" height=\"2.6\" fill=\"#fff\"\/><\/svg><svg class=\"new_smartbtn_widget_view___locale_flag\" data-smartbtn-language-flag=\"de\" width=\"20\" height=\"12\" viewBox=\"0 0 38 22\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" style=\"display:none\" > <rect width=\"38\" height=\"7.33\" fill=\"#000000\"\/> <rect y=\"7.33\" width=\"38\" height=\"7.34\" fill=\"#DD0000\"\/> <rect y=\"14.67\" width=\"38\" height=\"7.33\" fill=\"#FFCE00\"\/><\/svg><svg class=\"new_smartbtn_widget_view___locale_flag\" data-smartbtn-language-flag=\"es\" width=\"20\" height=\"12\" viewBox=\"0 0 38 22\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" style=\"display:none\" > <rect width=\"38\" height=\"22\" fill=\"#AA151B\"\/> <rect y=\"5.5\" width=\"38\" height=\"11\" fill=\"#F1BF00\"\/><\/svg><svg class=\"new_smartbtn_widget_view___locale_flag\" data-smartbtn-language-flag=\"ar\" width=\"20\" height=\"12\" viewBox=\"0 0 38 22\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" style=\"display:none\" > <rect x=\"9.5\" width=\"28.5\" height=\"7.33\" fill=\"#00732F\"\/> <rect x=\"9.5\" y=\"7.33\" width=\"28.5\" height=\"7.34\" fill=\"#FFFFFF\"\/> <rect x=\"9.5\" y=\"14.67\" width=\"28.5\" height=\"7.33\" fill=\"#000000\"\/> <rect width=\"9.5\" height=\"22\" fill=\"#FF0000\"\/><\/svg><svg class=\"new_smartbtn_widget_view___locale_flag\" data-smartbtn-language-flag=\"zh\" width=\"20\" height=\"12\" viewBox=\"0 0 38 22\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" style=\"display:none\" > <rect width=\"38\" height=\"22\" fill=\"#DE2910\"\/> <polygon fill=\"#FFDE00\" points=\"9.00,4.16 9.48,5.54 10.94,5.57 9.78,6.45 10.20,7.85 9.00,7.02 7.80,7.85 8.22,6.45 7.06,5.57 8.52,5.54\"\/> <polygon fill=\"#FFDE00\" points=\"16.20,2.34 16.36,2.79 16.83,2.80 16.45,3.08 16.59,3.53 16.20,3.26 15.81,3.53 15.95,3.08 15.57,2.80 16.05,2.79\"\/> <polygon fill=\"#FFDE00\" points=\"18.00,5.64 18.16,6.09 18.63,6.10 18.25,6.38 18.39,6.83 18.00,6.56 17.61,6.83 17.75,6.38 17.37,6.10 17.85,6.09\"\/> <polygon fill=\"#FFDE00\" points=\"17.20,8.94 17.36,9.39 17.83,9.40 17.45,9.68 17.59,10.13 17.20,9.86 16.81,10.13 16.95,9.68 16.57,9.40 17.05,9.39\"\/> <polygon fill=\"#FFDE00\" points=\"13.60,10.94 13.76,11.39 14.23,11.40 13.85,11.68 13.99,12.13 13.60,11.86 13.21,12.13 13.35,11.68 12.97,11.40 13.45,11.39\"\/><\/svg><svg class=\"new_smartbtn_widget_view___locale_flag\" data-smartbtn-language-flag=\"default\" width=\"20\" height=\"12\" viewBox=\"0 0 38 22\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" style=\"display:none\" > <circle cx=\"19\" cy=\"11\" r=\"10\" stroke=\"#fff\" stroke-width=\"2\"\/> <path d=\"M9 11H29M19 1C16.5 4 15.5 7.3 15.5 11C15.5 14.7 16.5 18 19 21M19 1C21.5 4 22.5 7.3 22.5 11C22.5 14.7 21.5 18 19 21\" stroke=\"#fff\" stroke-width=\"1.5\"\/><\/svg> <label class=\"smartbtn-widget-visually-hidden\" for=\"smb-set-locale-select\" data-smartbtn-i18n=\"choose_language\">\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u044f\u0437\u044b\u043a<\/label> <select class=\"new_smartbtn_widget_view___locale\" id=\"smb-set-locale-select\" onchange=\"setLocale(this)\" aria-label=\"\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u044f\u0437\u044b\u043a\" data-smartbtn-i18n-aria-label=\"choose_language\" data-smartbtn-language-select> <option value=\"ru\" title=\"\u0420\u0443\u0441\u0441\u043a\u0438\u0439\" selected >RU<\/option> <option value=\"en\" title=\"English\" >EN<\/option> <\/select> <\/div> <div class=\"new_smartbtn_widget_phone\" id=\"new_smartbtn_widget_phone\" dataphone=\"+7(962)554-0433\" onclick=\"new_smartbtn_widget_phone_f()\" role=\"button\" tabindex=\"0\" aria-label=\"\u041f\u043e\u0437\u0432\u043e\u043d\u0438\u0442\u044c\" data-smartbtn-i18n-aria-label=\"call_phone\"> <div class=\"smartbtn-chat-main__container-head-phone-operator__container-box\"> <svg class=\"smartbtn-chat-main__container-head-phone-operator__container-box__svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"> <path d=\"M15.3334 4.66663V0.666626H11.3334\" stroke=\"white\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/> <path d=\"M10.6666 5.33329L15.3333 0.666626\" stroke=\"white\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/> <path d=\"M14.6667 11.28V13.28C14.6675 13.4657 14.6294 13.6494 14.555 13.8195C14.4807 13.9897 14.3716 14.1424 14.2348 14.2679C14.0979 14.3934 13.9364 14.489 13.7605 14.5485C13.5847 14.6079 13.3983 14.63 13.2134 14.6133C11.1619 14.3904 9.19137 13.6894 7.46004 12.5667C5.84926 11.5431 4.48359
1210.1774 3.46004 8.56665C2.33336 6.82745 1.6322 4.84731 1.41337 2.78665C1.39671 2.60229 1.41862 2.41649 1.4777 2.24107C1.53679 2.06564 1.63175 1.90444 1.75655 1.76773C1.88134 1.63102 2.03324 1.52179 2.20256 1.447C2.37189 1.37221 2.55493 1.33349 2.74004 1.33332H4.74004C5.06357 1.33013 5.37723 1.4447 5.62254 1.65567C5.86786 1.86664 6.02809 2.15961 6.07337 2.47998C6.15779 3.12003 6.31434 3.74847 6.54004 4.35332C6.62973 4.59193 6.64915 4.85126 6.59597 5.10057C6.5428 5.34988 6.41928 5.57872 6.24004 5.75998L5.39337 6.60665C6.34241 8.27568 7.72434 9.65761 9.39337 10.6067L10.24 9.75998C10.4213 9.58074 10.6501 9.45722 10.8994 9.40405C11.1488 9.35088 11.4081 9.37029 11.6467 9.45998C12.2516 9.68568 12.88 9.84224 13.52 9.92665C13.8439 9.97234 14.1396 10.1355 14.3511 10.385C14.5625 10.6345 14.6748 10.953 14.6667 11.28Z\" stroke=\"white\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/> <\/svg> <\/div> <\/div> <\/div> <div class=\"smartbtn-chat-main__container-btns\" > <div class=\"smartbtn-chat-main__container-btns__btn smartbtn-chat-main__container-btns__btn-active\" dataBtn=\"chat\" onclick=\"smartbtnOpenWindowAndBtn(this)\" id=\"smartbtn-chat-main__container-btns__btn_call__chat_widget\"> <div class=\"smartbtn-chat-main__container-btns__btn-svg\"> <svg class=\"smartbtn-chat-main__container-btns__btn-svg__svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"> <path d=\"M13 6.66668C13.0023 7.54659 12.7967 8.4146 12.4 9.20001C11.9296 10.1412 11.2065 10.9328 10.3116 11.4862C9.41675 12.0396 8.38548 12.3329 7.33332 12.3333C6.45341 12.3356 5.5854 12.13 4.79999 11.7333L1 13L2.26666 9.20001C1.86995 8.4146 1.66437 7.54659 1.66667 6.66668C1.66707 5.61452 1.96041 4.58325 2.51381 3.68838C3.06721 2.79352 3.85883 2.0704 4.79999 1.60002C5.5854 1.20331 6.45341 0.997725 7.33332 1.00002H7.66666C9.05622 1.07668 10.3687 1.66319 11.3527 2.64726C12.3368 3.63132 12.9233 4.94378 13 6.33334V6.66668Z\" stroke=\"white\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/> <\/svg> <\/div> <div class=\"smartbtn-chat-main__container-btns__btn__text\" id=\"tab_chat\" data-smartbtn-i18n=\"tab_chat\"> \u041e\u043d\u043b\u0430\u0439\u043d-\u0447\u0430\u0442 <\/div> <\/div> <div class=\"smartbtn-chat-main__container-btns__btn\" dataBtn=\"call\" onclick=\"smartbtnOpenWindowAndBtn(this)\" id=\"smartbtn-chat-main__container-btns__btn_call__bell_widget\" > <div class=\"smartbtn-chat-main__container-btns__btn-svg\"> <svg class=\"smartbtn-chat-main__container-btns__btn-svg__svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"> <path d=\"M12.9996 9.98431V11.7908C13.0003 11.9585 12.9659 12.1245 12.8986 12.2781C12.8313 12.4318 12.7325 12.5697 12.6087 12.6831C12.4849 12.7965 12.3387 12.8828 12.1795 12.9365C12.0203 12.9903 11.8517 13.0102 11.6843 12.9951C9.82768 12.7938 8.04426 12.1606 6.47734 11.1465C5.01953 10.222 3.78356 8.98843 2.8572 7.53351C1.83752 5.96259 1.20294 4.17405 1.0049 2.31277C0.98982 2.14625 1.00965 1.97843 1.06312 1.81998C1.11659 1.66153 1.20254 1.51592 1.31548 1.39244C1.42843 1.26896 1.5659 1.1703 1.71915 1.10274C1.87239 1.03519 2.03805 1.00022 2.20558 1.00006H4.01565C4.30846 0.997182 4.59233 1.10067 4.81435 1.29122C5.03636 1.48178 5.18138 1.74641 5.22236 2.03578C5.29876 2.61389 5.44044 3.18152 5.64471 3.72785C5.72589 3.94338 5.74346 4.17761 5.69534 4.4028C5.64721 4.62799 5.53542 4.83469 5.3732 4.99841L4.60694 5.76315C5.46585 7.27069 6.71655 8.51891 8.22708 9.37612L8.99334 8.61138C9.15739 8.44948 9.3645 8.33791 9.59013 8.28988C9.81577 8.24185 10.0505 8.25939 10.2664 8.3404C10.8138 8.54427 11.3826 8.68567 11.9619 8.76192C12.2549 8.80318 12.5226 8.95052 12.714 9.1759C12.9053 9.40128 13.007 9.68899 12.9996 9.98431Z\" stroke=\"white\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/> <\/svg> <\/div> <div class=\"smartbtn-chat-main__container-btns__btn__text\" id=\"tab_call_order\" data-smartbtn-i18n=\"tab_call_order\"> \u0417\u0430\u043a\u0430\u0437 \u0437\u0432\u043e\u043d\u043a\u0430 <\/div> <\/div> <div class=\"smartbtn-chat-main__container-btns__btn\" dataBtn=\"map\" onclick=\"smartbtnOpenWindowAndBtn(this)\" id=\"smartbtn-chat-main__container-btns__btn_map\" > <div class=\"smartbtn-chat-main__container-btns__btn-svg\"> <svg class=\"smartbtn-chat-main__container-btns__btn-svg__svg\" width=\"12\" height=\"14\" viewBox=\"0 0 12 14\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"> <path d=\"M11 5.90909C11 9.72727 6 13 6 13C6 13 1 9.72727 1 5.90909C1 4.60712 1.52678 3.35847 2.46447 2.43784C3.40215 1.51721 4.67392 1 6 1C7.32608 1 8.59785 1.51721 9.53553 2.43784C10.4732 3.35847 11 4.60712 11 5.90909Z\" stroke=\"white\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/> <path d=\"M6 8C7.10457 8 8 7.10457 8 6C8 4.89543 7.10457 4 6 4C4.89543 4 4 4.89543 4 6C4 7.10457 4.89543 8 6 8Z\" stroke=\"white\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/> <\/svg> <\/div> <div class=\"smartbtn-chat-main__container-btns__btn__text\" id=\"how_to_get_here\" data-smartbtn-i18n=\"how_to_get_here\"> \u041a\u0430\u043a \u0434\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f <\/div> <\/div> <\/div> <div class=\"new_smartbtn_widget_chat__messages smartbtn-chat-main__container-chat smartbtn-chat-main__container-active-box\" id=\"js-smartbtn-chat-box\" dataBtnContainer=\"chat\" style=\"background: #fbf8f8\" > <div class=\"smartbtn-widget-transcript-tools\"> <button type=\"button\" data-smartbtn-chat-download title=\"\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u0432 \u044d\u0442\u043e\u043c \u0447\u0430\u0442\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b.\" data-smartbtn-i18n-title=\"archive_loaded_hint\" aria-describedby=\"smartbtn-chat-download-scope\">
12 <span data-smartbtn-i18n=\"archive_loaded_download\">\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f<\/span> <\/button> <span id=\"smartbtn-chat-download-scope\" class=\"smartbtn-widget-transcript-scope\" data-smartbtn-i18n=\"archive_loaded_hint\" hidden>\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u0432 \u044d\u0442\u043e\u043c \u0447\u0430\u0442\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b.<\/span> <span class=\"smartbtn-widget-transcript-status\" data-smartbtn-chat-download-status role=\"status\" aria-live=\"polite\"><\/span> <\/div> <div class=\"new_smartbtn_widget_operator-message new_smartbtn_widget_operator-message_greeting\"> <div class=\"new_smartbtn_widget_operator-message__right-side\"> <div class=\"new_smartbtn_widget_operator-message__info\"> <\/div> <div class=\"new_smartbtn_widget_operator-message__message\" data-smartbtn-text-field=\"widget_greeting\" data-smartbtn-assistant-greeting> \u0414\u043e\u0431\u0440\u044b\u0439 \u0434\u0435\u043d\u044c, \u0447\u0435\u043c \u043c\u043e\u0433\u0443 \u043f\u043e\u043c\u043e\u0447\u044c <\/div> <\/div> <div class=\"new_smartbtn_widget_operator-message__payment\" data-paymentIDMsg=\"-1\" id=\"pay\" style=\"display:none\" data-smartbtn-i18n=\"pay\">\u041e\u043f\u043b\u0430\u0442\u0438\u0442\u044c<\/div> <\/div> <div class=\"smartbtn-widget-quick-phrases\" data-smartbtn-assistant-quick-phrases><\/div> <div class=\"new_smartbtn_widget_client-message\" style=\"display:none\"> <div class=\"new_smartbtn_widget_client-message__left-side\"> <div class=\"new_smartbtn_widget_client-message__time\"><\/div> <div class=\"new_smartbtn_widget_client-message__message\"> <\/div> <\/div> <div class=\"new_smartbtn_widget_client-message__right-side\" style=\"display: none;\"> <div class=\"new_smartbtn_widget_client-message__typing\"> <div class=\"new_smartbtn_widget_client-message__typing_three\"><\/div> <div class=\"new_smartbtn_widget_client-message__typing_two\"><\/div> <div class=\"new_smartbtn_widget_client-message__typing_one\"><\/div> <div class=\"new_smartbtn_widget_client-message__ava\" ><\/div> <\/div> <\/div> <\/div> <\/div> <div class=\"smartbtn-chat-main__container-chat\" id=\"js-smartbtn-call-box\" dataBtnContainer=\"call\" style=\"background: #fbf8f8\" > <div class=\"smartbtn-call-success-message-no-operators\" id=\"procesed_request\" data-smartbtn-i18n=\"procesed_request\"> \u0412\u0430\u0448 \u0437\u0430\u043f\u0440\u043e\u0441 \u0432 \u0441\u0442\u0430\u0434\u0438\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u
12041c\u044b \u0441 \u0412\u0430\u043c\u0438 \u0441\u0432\u044f\u0436\u0435\u043c\u0441\u044f. <\/div> <div class=\"smartbtn-chat-main__container-chat-call\" id=\"smartbtn-chat-main__container-chat-call_bell__operator_online_widget\"> <div class=\"smartbtn-chat-main__container-chat-call__container\"> <svg class=\"smartbtn-chat-main__container-chat-call__container-svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"> <path d=\"M20 21V19C20 17.9391 19.5786 16.9217 18.8284 16.1716C18.0783 15.4214 17.0609 15 16 15H8C6.93913 15 5.92172 15.4214 5.17157 16.1716C4.42143 16.9217 4 17.9391 4 19V21\" stroke=\"#A0A3BD\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/> <path d=\"M12 11C14.2091 11 16 9.20914 16 7C16 4.79086 14.2091 3 12 3C9.79086 3 8 4.79086 8 7C8 9.20914 9.79086 11 12 11Z\" stroke=\"#A0A3BD\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/> <\/svg> <input class=\"smartbtn-chat-main__container-chat-call__input\" id=\"js-chat-call-back-btn-name\" type=\"text\" placeholder=\"\u0412\u0430\u0448\u0435 \u0438\u043c\u044f\" data-smartbtn-i18n-placeholder=\"js-chat-call-back-btn-name\" onfocus=\"smartbtnFocusInput(this)\" onblur=\"smartbtnBlurInput(this)\"> <\/div> <div class=\"smartbtn-chat-main__container-chat-call__container\"> <svg class=\"smartbtn-chat-main__container-chat-call__container-svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"> <path d=\"M21.9999 16.92V19.92C22.0011 20.1985 21.944 20.4742 21.8324 20.7294C21.7209 20.9845 21.5572 21.2136 21.352 21.4019C21.1468 21.5901 20.9045 21.7335 20.6407 21.8227C20.3769 21.9119 20.0973 21.9451 19.8199 21.92C16.7428 21.5856 13.7869 20.5342 11.1899 18.85C8.77376 17.3147 6.72527 15.2662 5.18993 12.85C3.49991 10.2412 2.44818 7.271 2.11993 4.18001C2.09494 3.90347 2.12781 3.62477 2.21643 3.36163C2.30506 3.09849 2.4475 2.85669 2.6347 2.65163C2.82189 2.44656 3.04974 2.28271 3.30372 2.17053C3.55771 2.05834 3.83227 2.00027 4.10993 2.00001H7.10993C7.59524 1.99523 8.06572 2.16708 8.43369 2.48354C8.80166 2.79999 9.04201 3.23945 9.10993 3.72001C9.23656 4.68007 9.47138 5.62273 9.80993 6.53001C9.94448 6.88793 9.9736 7.27692 9.89384 7.65089C9.81408 8.02485 9.6288 8.36812 9.35993 8.64001L8.08993 9.91001C9.51349 12.4136 11.5864 14.4865 14.0899 15.91L15.3599 14.64C15.6318 14.3711 15.9751 14.1859 16.3491 14.1061C16.723 14.0263 17.112 14.0555 17.4699 14.19C18.3772 14.5286 19.3199 14.7634 20.2799 14.89C20.7657 14.9585 21.2093 15.2032 21.5265 15.5775C21.8436 15.9518 22.0121 16.4296 21.9999 16.92Z\" stroke=\"#A0A3BD\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/> <\/svg> <input class=\"smartbtn-chat-main__container-chat-call__input\" id=\"js-chat-call-back-btn-number\" type=\"tel\" placeholder=\"\u0412\u0430\u0448 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\" data-smartbtn-i18n-placeholder=\"js-chat-call-back-btn-number\" onfocus=\"smartbtnFocusInput(this)\" onblur=\"smartbtnBlurInput(this)\"> <\/div> <input class=\"smartbtn-chat-main__container-chat-call__input-submit\" id=\"request_call\" type=\"submit\" value=\"\u0417\u0430\u043a\u0430\u0437\u0430\u0442\u044c \u0437\u0432\u043e\u043d\u043e\u043a\" data-smartbtn-i18n-value=\"request_call\" onclick=\"jsChatCallBackBtnSubmit()\"\/> <div class=\"new_smartbtn_widget-call-back-btn__container-errors\" id=\"js-chat-call-back-btn__container-errors\" data-smartbtn-i18n=\"js-chat-call-back-btn__container-errors\">\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u0432\u0441\u0435 \u043f\u043e\u043b\u044f<\/div> <\/div> <div class=\"smartbtn-chat-main__container-chat-call smartbtn-chat-main__container-chat-call__no_active\" id=\"smartbtn-chat-main__container-chat-call_bell__no_operator_online_widget\"> <div class=\"smartbtn-chat-main__container-chat-call__container\"> <svg class=\"smartbtn-chat-main__container-chat-call__container-svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"> <path d=\"M20 21V19C20 17.9391 19.5786 16.9217 18.8284 16.1716C18.0783 15.4214 17.0609 15 16 15H8C6.93913 15 5.92172 15.4214 5.17157 16.1716C4.42143 16.9217 4 17.9391 4 19V21\" stroke=\"#A0A3BD\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/> <path d=\"M12 11C14.2091 11 16 9.20914 16 7C16 4.79086 14.2091 3 12 3C9.79086 3 8 4.79086 8 7C8 9.20914 9.79086 11 12 11Z\" stroke=\"#A0A3BD\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/> <\/svg> <input class=\"smartbtn-chat-main__container-chat-call__input\" id=\"js-chat-call-back-btn-name_no_operator\" type=\"text\" placeholder=\"\u0412\u0430\u0448\u0435 \u0438\u043c\u044f\" data-smartbtn-i18n-placeholder=\"js-chat-call-back-btn-name_no_operator\" onfocus=\"smartbtnFocusInput(this)\" onblur=\"smartbtnBlurInput(this)\"> <\/div> <div class=\"smartbtn-chat-main__container-chat-call__container\"> <svg class=\"smartbtn-chat-main__container-chat-call__container-svg\" width=\"26\" height=\"24\" viewBox=\"0 0 26 24\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"> <path d=\"M1 6C1 4.89543 1.89543 4 3 4H23C24.1046 4 25 4.89543 25 6V19C25 20.1046 24.1046 21 23 21H3C1.89543 21 1 20.1046 1 19V6Z\" stroke=\"#A0A3BD\" stroke-width=\"2\" stroke-linejoin=\"round\"><\/path> <path d=\"M2.42131 5.30287C1.91709 4.84067 2.24409 4 2.9281 4H23.0719C23.7559 4 24.0829 4.84067 23.5787 5.30287L15.0272 13.1418C13.8802 14.1931 12.1198 14.1931 10.9728 13.1418L2.42131 5.30287Z\" stroke=\"#A0A3BD\" stroke-width=\"2\" stroke-linejoin=\"round\"><\/path> <\/svg> <input class=\"smartbtn-chat-main__container-chat-call__input\" id=\"js-chat-call-back-btn-email_no_operator\" type=\"email\" placeholder=\"\u0412\u0430\u0448 E-mail\" data-smartbtn-i18n-placeholder=\"js-chat-call-back-btn-email_no_operator\" onfocus=\"smartbtnFocusInput(this)\" onblur=\"smartbtnBlurInput(this)\"> <\/div> <div class=\"smartbtn-chat-main__container-chat-call__container\"> <svg class=\"smartbtn-chat-main__container-chat-call__container-svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"> <path d=\"M21.9999 16.92V19.92C22.0011 20.1985 21.944 20.4742 21.8324 20.7294C21.7209 20.9845 21.5572 21.2136 21.352 21.4019C21.1468 21.5901 20.9045 21.7335 20.6407 21.8227C20.3769 21.9119 20.0973 21.9451 19.8199 21.92C16.7428 21.5856 13.7869 20.5342 11.1899 18.85C8.77376 17.3147 6.72527 15.2662 5.18993 12.85C3.49991 10.2412 2.44818 7.271 2.11993 4.18001C2.09494 3.90347 2.12781 3.62477 2.21643 3.36163C2.30506 3.09849 2.4475 2.85669 2.6347 2.65163C2.82189 2.44656 3.04974 2.28271 3.30372 2.17053C3.55771 2.05834 3.83227 2.00027 4.10993 2.00001H7.10993C7.59524 1.99523 8.06572 2.16708 8.43369 2.48354C8.80166 2.79999 9.04201 3.23945 9.10993 3.72001C9.23656 4.68007 9.47138 5.62273 9.80993 6.53001C9.94448 6.88793 9.9736 7.27692 9.89384 7.65089C9.81408 8.02485 9.6288 8.36812 9.35993 8.64001L8.08993 9.91001C9.51349 12.4136 11.5864 14.4865 14.0899 15.91L15.3599 14.64C15.6318 14.3711 15.9751 14.1859 16.3491 14.1061C16.723 14.0263 17.112 14.0555 17.4699 14.19C18.3772 14.5286 19.3199 14.7634 20.2799 14.89C20.7657 14.9585 21.2093 15.2032 21.5265 15.5775C21.8436 15.9518 22.0121 16.4296 21.9999 16.92Z\" stroke=\"#A0A3BD\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/> <\/svg> <input class=\"smartbtn-chat-main__container-chat-call__input\" id=\"js-chat-call-back-btn-number_no_operator\" type=\"tel\" placeholder=\"\u0412\u0430\u0448 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\" data-smartbtn-i18n-placeholder=\"js-chat-call-back-btn-number_no_operator\" onfocus=\"smartbtnFocusInput(this)\" onblur=\"smartbtnBlurInput(this)\"> <\/div> <div class=\"smartbtn-chat-main__container-chat-call__container\"> <textarea class=\"smartbtn-chat-main__container-chat-call__input smartbtn-chat-main__container-chat-call__input__textarea\" id=\"js-chat-call-back-btn-message_no_operator\" type=\"text\" placeholder=\"\u0412\u0430\u0448\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\" data-smartbtn-i18n-placeholder=\"js-chat-call-back-btn-message_no_operator\" onfocus=\"smartbtnFocusInput(this)\" onblur=\"smartbtnBlurInput(this)\"><\/textarea> <\/div> <input class=\"smartbtn-chat-main__container-chat-call__input-submit\" type=\"submit\" id=\"request_feedback\" value=\"\u0417\u0430\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u0443\u044e \u0441\u0432\u044f\u0437\u044c\" data-smartbtn-i18n-value=\"request_feedback\" onclick=\"jsChatCallBackBtnSubmitNoOperators(this)\"\/> <div class=\"new_smartbtn_widget-call-back-btn__container-errors\" id=\"js-chat-call-back-btn__container-errors\" data-smartbtn-i18n=\"js-chat-call-back-btn__container-errors\">
12\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u0432\u0441\u0435 \u043f\u043e\u043b\u044f<\/div> <\/div> <\/div> <div class=\"smartbtn-chat-main__container-chat\" id=\"js-smartbtn-price-box\" dataBtnContainer=\"price\" style=\"background: #fbf8f8\" > <div class=\"smartbtn-chat-main__container-chat-price\"> <\/div> <\/div> <div class=\"smartbtn-chat-main__container-chat\" dataBtnContainer=\"map\" id=\"js-smartbtn-map-box\"> <div class=\"new_smartbtn_widget_view__map\" > <div class=\"new_smartbtn_widget_map\" id=\"new_smartbtn_widget_map\" data-long= data-lat=><\/div> <div class=\"new_smartbtn_widget_view__map_container\" id=\"new_smartbtn_widget_view__map_container\"><\/div> <\/div> <\/div> <div class=\"smartbtn-chat-main__container-socials-and-post-message-socials\"> <div class=\"smartbtn-chat-main__container-socials-and-post-message-socials_flex\" > <div class=\"smartbtn-chat-main__container-socials-and-post-message-socials__text\"> <div class=\"smartbtn-chat-main__container-socials-and-post-message-socials-links_info\" onclick=\"jsSmartbtnToggleSocialsContainer(this)\"> <div class=\"smartbtn-chat-main__container-socials-and-post-message-socials-links_info-content\" > <div class=\"smartbtn-chat-main__container-socials-and-post-message-socials__text-for-click\" id=\"continue_conv_in_soc\" data-smartbtn-i18n=\"continue_conv_in_soc\"> \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u0432: <\/div> <div class=\"smartbtn-chat-main__container-socials-and-post-message-socials__text-random-socials\" > <a href=\"tg:\/\/resolve?domain=smartbtnru_bot\" class=\"new_smartbtn_widget_social-card\"> <div class=\"new_smartbtn_widget_social-card__icon new_smartbtn_widget_tg-icon new_smartbtn_widget_social-card__icon_small\"> <svg class=\"new_smartbtn_widget_icon\"> <use xlink:href=\"#tg-icon\" ><\/use> <\/svg> <\/div><\/a><a href=\"https:\/\/wa.me\/79625540431\" class=\"new_smartbtn_widget_social-card\" target=\"_blank\"> <div class=\"new_smartbtn_widget_social-card__icon new_smartbtn_widget_wa-icon new_smartbtn_widget_social-card__icon_small\"> <svg class=\"new_smartbtn_widget_icon\"> <use xlink:href=\"#wa-icon\" ><\/use> <\/svg> <\/div><\/a> <\/div> <\/div> <div class=\"smartbtn-chat-main__container-socials-and-post-message-socials-svg smartbtn-chat-main-arrow_open-socials\" id=\"smartbtn-chat-main-arrow\" role=\"button\" tabindex=\"0\" aria-label=\"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u0430\u043d\u0430\u043b\u044b \u0441\u0432\u044f\u0437\u0438\" data-smartbtn-i18n-aria-label=\"open_socials\"> <svg width=\"15\" height=\"10\" viewBox=\"0 0 6 4\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"> <path d=\"M5 3L3 1L1 3\" stroke=\"#212223\" stroke-linecap=\"round\"\/> <\/svg> <\/div> <\/div> <div class=\"smartbtn-chat-main__container-socials-and-post-message-socials-links\" id=\"smartbtn-chat-main__container-socials\" > <div class=\"smartbtn-chat-main__container-socials-and-post-message-socials-links_buttons-parent\" > <a href=\"tg:\/\/resolve?domain=smartbtnru_bot\" class=\"new_smartbtn_widget_social-card\"> <div class=\"new_smartbtn_widget_social-card__icon new_smartbtn_widget_tg-icon new_smartbtn_widget_social-card__icon_small\"> <svg class=\"new_smartbtn_widget_icon\"> <use xlink:href=\"#tg-icon\" ><\/use> <\/svg> <\/div><\/a><a href=\"https:\/\/wa.me\/79625540431\" class=\"new_smartbtn_widget_social-card\" target=\"_blank\"> <div class=\"new_smartbtn_widget_social-card__icon new_smartbtn_widget_wa-icon new_smartbtn_widget_social-card__icon_small\"> <svg class=\"new_smartbtn_widget_icon\"> <use xlink:href=\"#wa-icon\" ><\/use> <\/svg> <\/div><\/a> <\/div> <div class=\"smartbtn-chat-main__container-socials-and-post-message-socials-svg smartbtn-chat-main-arrow_open-socials\" id=\"smartbtn-chat-main-arrow_open\" onclick=\"jsSmartbtnToggleSocialsContainer(this)\" role=\"button\" tabindex=\"0\" aria-label=\"\u0421\u043a\u0440\u044b\u0442\u044c \u043a\u0430\u043d\u0430\u043b\u044b \u0441\u0432\u044f\u0437\u0438\" data-smartbtn-i18n-aria-label=\"close_socials\"> <svg width=\"15\" height=\"10\" viewBox=\"0 0 6 4\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"> <path d=\"M5 1L3 3L1 1\" stroke=\"#212223\" stroke-linecap=\"round\"\/> <\/svg> <\/div> <\/div> <\/div> <\/div> <\/div> <div class=\"smartbtn-chat-main__container-socials-and-post-message\"> <div class=\"smartbtn-chat-main__container-socials-and-post-message-new-message\"> <div class=\"new_smartbtn_widget_view-shadow-for-socials-and-smiles\" onclick=\"smartbtnWidgetCloseModals()\"><\/div> <div class=\"smartbtn-chat-main__container-socials-and-post-message-new-message-svg\"> <div class=\"smartbtn-chat-main__container-socials-and-post-message-new-message-svg_margin-bottom\"> <div class=\"smartbtn-chat-main__container-socials-and-post-message-new-message-svg-emoji\" id=\"js-smartbtn-chat-main__container-socials-and-post-message-new-message-svg-emoji\"> <!--\u0421\u043c\u0430\u0439\u043b\u0438\u043a\u0438--> <div onclick=\"smartbtnAddEmoji(this)\" class=\"smartbtn-chat-main__container-socials-and-post-message-new-message-svg-emoji__box\">😀<\/div> <div onclick=\"smartbtnAddEmoji(this)\" class=\"smartbtn-chat-main__container-socials-and-post-message-new-message-svg-emoji__box\">😃<\/div> <div onclick=\"smartbtnAddEmoji(this)\" class=\"smartbtn-chat-main__container-socials-and-post-message-new-message-svg-emoji__box\">😄<\/div> <div onclick=\"smartbtnAddEmoji(this)\" class=\"smartbtn-chat-main__container-socials-and-post-message-new-message-svg-emoji__box\">😁<\/div> <div onclick=\"smartbtnAddEmoji(this)\" class=\"smartbtn-chat-main__container-socials-and-post-message-new-message-svg-emoji__box\">😆<\/div> <div onclick=\"smartbtnAddEmoji(this)\" class=\"smartbtn-chat-main__container-socials-and-post-message-new-message-svg-emoji__box\">😅<\/div> <div onclick=\"smartbtnAddEmoji(this)\" class=\"smartbtn-chat-main__container-socials-and-post-message-new-message-svg-emoji__box\">🤣<\/div> <div onclick=\"smartbtnAddEmoji(this)\" class=\"smartbtn-chat-main__container-socials-and-post-message-new-message-svg-emoji__box\">😂<\/div> <div onclick=\"smartbtnAddEmoji(this)\" class=\"smartbtn-chat-main__container-socials-and-post-message-new-message-svg-emoji__box\">🙂<\/div> <div onclick=\"smartbtnAddEmoji(this)\" class=\"smartbtn-chat-main__container-socials-and-post-message-new-message-svg-emoji__box\">🙃<\/div> <div onclick=\"smartbtnAddEmoji(this)\" class=\"smartbtn-chat-main__container-socials-and-post-message-new-message-svg-emoji__box\">😉<\/div> <div onclick=\"smartbtnAddEmoji(this)\" class=\"smartbtn-chat-main__container-socials-and-post-message-new-message-svg-emoji__box\">😊<\/div> <div onclick=\"smartbtnAddEmoji(this)\" class=\"smartbtn-chat-main__container-socials-and-post-message-new-message-svg-emoji__box\">😇<\/div> <div onclick=\"smartbtnAddEmoji(this)\" class=\"smartbtn-chat-main__container-socials-and-post-message-new-message-svg-emoji__box\">🥰<\/div> <div onclick=\"smartbtnAddEmoji(this)\" class=\"smartbtn-chat-main__container-socials-and-post-message-new-message-svg-emoji__box\">😍<\/div> <\/div> <div class=\"smartbtn-chat-main__container-socials-and-post-message-new-message-svg_margin-bottom__container-btn\" onclick=\"smartbtnToggleWindowEmoji()\" role=\"button\" tabindex=\"0\" aria-label=\"\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u044d\u043c\u043e\u0434\u0437\u0438\" data-smartbtn-i18n-aria-label=\"choose_emoji\"> <svg class=\"smartbtn-chat-main__container-socials-and-post-message-new-message-svg_margin-bottom__container-btn__svg\" viewBox=\"0 0 18 18\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"> <path d=\"M9 16.7143C13.2605 16.7143 16.7143 13.2605 16.7143 9.00001C16.7143 4.73952 13.2605 1.28572 9 1.28572C4.73952 1.28572 1.28571 4.73952 1.28571 9.00001C1.28571 13.2605 4.73952 16.7143 9 16.7143Z\" stroke=\"#FECE03\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/> <path d=\"M6.42857 11.5714C6.42857 11.5714 7.39286 12.8571 9 12.85
1271C10.6071 12.8571 11.5714 11.5714 11.5714 11.5714\" stroke=\"#FECE03\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/> <path d=\"M6.75 6.42857H6.75952\" stroke=\"#FECE03\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/> <path d=\"M11.25 6.42857H11.2595\" stroke=\"#FECE03\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/> <defs> <linearGradient id=\"paint0_linear\" x1=\"-0.0738925\" y1=\"11.6897\" x2=\"24.2931\" y2=\"10.9774\" gradientUnits=\"userSpaceOnUse\"> <stop stop-color=\"#FECE03\"\/> <stop offset=\"1\" stop-color=\"#EBBF02\"\/> <\/linearGradient> <linearGradient id=\"paint1_linear\" x1=\"5.97537\" y1=\"12.4384\" x2=\"13.995\" y2=\"11.5007\" gradientUnits=\"userSpaceOnUse\"> <stop stop-color=\"#FECE03\"\/> <stop offset=\"1\" stop-color=\"#EBBF02\"\/> <\/linearGradient> <linearGradient id=\"paint2_linear\" x1=\"6.74916\" y1=\"7.1029\" x2=\"6.76421\" y2=\"7.1029\" gradientUnits=\"userSpaceOnUse\"> <stop stop-color=\"#FECE03\"\/> <stop offset=\"1\" stop-color=\"#EBBF02\"\/> <\/linearGradient> <linearGradient id=\"paint3_linear\" x1=\"11.2492\" y1=\"7.1029\" x2=\"11.2642\" y2=\"7.1029\" gradientUnits=\"userSpaceOnUse\"> <stop stop-color=\"#FECE03\"\/> <stop offset=\"1\" stop-color=\"#EBBF02\"\/> <\/linearGradient> <\/defs> <\/svg> <\/div> <\/div> <label class=\"smartbtn-chat-main__container-socials-and-post-message-new-message-svg-label\" for=\"attachment\" role=\"button\" tabindex=\"0\" aria-label=\"\u041f\u0440\u0438\u043a\u0440\u0435\u043f\u0438\u0442\u044c \u0444\u0430\u0439\u043b\" data-smartbtn-i18n-aria-label=\"attach_file\"> <svg class=\"smartbtn-chat-main__container-socials-and-post-message-new-message-svg-label__svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"> <path d=\"M16.0811 8.28759L9.18856 15.1801C8.34418 16.0245 7.19895 16.4988 6.00481 16.4988C4.81068 16.4988 3.66545 16.0245 2.82106 15.1801C1.97668 14.3357 1.50231 13.1905 1.50231 11.9963C1.50231 10.8022 1.97668 9.65698 2.82106 8.81259L9.71356 1.92009C10.2765 1.35717 11.04 1.04092 11.8361 1.04092C12.6322 1.04092 13.3956 1.35717 13.9586 1.92009C14.5215 2.48301 14.8377 3.2465 14.8377 4.04259C14.8377 4.83868 14.5215 5.60217 13.9586 6.16509L7.05856 13.0576C6.7771 13.3391 6.39536 13.4972 5.99731 13.4972C5.59927 13.4972 5.21752 13.3391 4.93606 13.0576C4.6546 12.7761 4.49648 12.3944 4.49648 11.9963C4.49648 11.5983 4.6546 11.2166 4.93606 10.9351L11.3036 4.57509\" stroke=\"#FECE03\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/> <defs> <linearGradient id=\"paint0_linear\" x1=\"0.217594\" y1=\"11.4647\" x2=\"23.2446\" y2=\"10.8298\" gradientUnits=\"userSpaceOnUse\"> <stop stop-color=\"#FECE03\"\/> <stop offset=\"1\" stop-color=\"#EBBF02\"\/> <\/linearGradient> <\/defs> <\/svg> <\/label> <\/div> <form class=\"new_smartbtn_widget_message-area\" id=\"new_smartbtn_widget_message-area\"> <div class=\"new_smartbtn_widget_message-area__other-btn\" id=\"js-smartbtn-send-image\" ><\/div> <input type=\"file\" class=\"smartbtn_widget_input_file\" id=\"attachment\" multiple hidden accept=\".png, .jpg, .jpeg, .txt, .pdf, .doc., .docx, .odt\"\/> <div class=\"new_smartbtn_widget_message-area_wrapper__textarea\"> <div class=\"new_smartbtn_widget_message-area__files_w\" id=\"new_smartbtn_widget_message-area__files\"><\/div> <div class=\"new_smartbtn_widget_message-area__images_w\" id=\"new_smartbtn_widget_message-area__images\"><\/div> <textarea class=\"new_smartbtn_widget_message-area__textarea\" id=\"js-smartbtn-message\" name=\"message\" placeholder=\"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0438 \u043d\u0430\u0436\u043c\u0438\u0442\u0435 Enter\" data-smartbtn-i18n-placeholder=\"js-smartbtn-message\" ><\/textarea> <\/div> <div class=\"new_smartbtn_widget_message-area__send-btn\" id=\"js-smartbtn-send-message\" role=\"button\" tabindex=\"0\" aria-label=\"\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\" data-smartbtn-i18n-aria-label=\"send_message\"> <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"> <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M12.0238 0.924572L0.507223 5.74354C-0.143918 6.01824 -0.128227 6.94436 0.522914 7.19551L4.71218 8.82015C4.91615 8.89863 5.
120809 9.06345 5.15935 9.26751L6.77544 13.4507C7.02648 14.11 7.96004 14.1257 8.23462 13.4743L13.0593 1.96057C13.3182 1.30915 12.6671 0.657724 12.0238 0.924572Z\" fill=\"#131313\"><\/path> <defs> <linearGradient id=\"paint0_linear\" x1=\"9.02664\" y1=\"15.5905\" x2=\"14.7539\" y2=\"-2.40949\" gradientUnits=\"userSpaceOnUse\"> <stop stop-color=\"#1D1D1D\"><\/stop> <stop offset=\"1\" stop-color=\"#333333\"><\/stop> <\/linearGradient> <\/defs> <\/svg> <\/div> <\/form> <div style=\"display: inline\" id=\"js-smartbtn_service_provided_new_block\" data-smartbtn-profile-signature> <div class=\"new_smartbtn_widget_view--service-text\" id=\"service_provided\"> <span data-smartbtn-i18n=\"service_provided\">\u0421\u0435\u0440\u0432\u0438\u0441 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d<\/span><a href=\"https:\/\/smartbtn.ru\" target=\"_blank\"> smartbtn<\/a> <\/div> <\/div> <\/div> <\/div> <\/div><\/div>"); 13 14var JSscript = document.createElement('script'); 15JSscript.type = 'text/javascript'; 16JSscript.innerText = "var smartbtnLanguageRuntime = {\"guid\":\"2331c204150c0fab02304984d6dc330a\",\"mode\":\"ru\",\"switcher\":\"1\",\"supported\":[\"ru\",\"en\"],\"fallback\":\"en\",\"revision\":0,\"catalogs\":{\"ru\":{\"tab_chat\":\"\u041e\u043d\u043b\u0430\u0439\u043d-\u0447\u0430\u0442\",\"tab_call_order\":\"\u0417\u0430\u043a\u0430\u0437 \u0437\u0432\u043e\u043d\u043a\u0430\",\"price_list\":\"\u041f\u0440\u0430\u0439\u0441\",\"how_to_get_here\":\"\u041a\u0430\u043a \u0434\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f\",\"please_turn_your_phone\":\"\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u0435\u0440\u0435\u0432\u0435\u0440\u043d\u0438\u0442\u0435 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\",\"head_text\":\"\u041c\u044b \u0442\u0443\u0442 \u0438 \u0433\u043e\u0442\u043e\u0432\u044b \u043f\u043e\u043c\u043e\u0447\u044c\",\"pay\":\"\u041e\u043f\u043b\u0430\u0442\u0438\u0442\u044c\",\"procesed_request\":\"\u0412\u0430\u0448 \u0437\u0430\u043f\u0440\u043e\u0441 \u0432 \u0441\u0442\u0430\u0434\u0438\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u
16041c\u044b \u0441 \u0412\u0430\u043c\u0438 \u0441\u0432\u044f\u0436\u0435\u043c\u0441\u044f.\",\"js-chat-call-back-btn-name\":\"\u0412\u0430\u0448\u0435 \u0438\u043c\u044f\",\"js-chat-call-back-btn-number\":\"\u0412\u0430\u0448 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\",\"request_call\":\"\u0417\u0430\u043a\u0430\u0437\u0430\u0442\u044c \u0437\u0432\u043e\u043d\u043e\u043a\",\"js-chat-call-back-btn__container-errors\":\"\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u0432\u0441\u0435 \u043f\u043e\u043b\u044f\",\"js-chat-call-back-btn-name_no_operator\":\"\u0412\u0430\u0448\u0435 \u0438\u043c\u044f\",\"js-chat-call-back-btn-email_no_operator\":\"\u0412\u0430\u0448 E-mail\",\"js-chat-call-back-btn-number_no_operator\":\"\u0412\u0430\u0448 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\",\"js-chat-call-back-btn-message_no_operator\":\"\u0412\u0430\u0448\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\",\"request_feedback\":\"\u0417\u0430\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u0443\u044e \u0441\u0432\u044f\u0437\u044c\",\"download\":\"\u0421\u043a\u0430\u0447\u0430\u0442\u044c\",\"continue_conv_in_soc\":\"\u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u0432:\",\"service_provided\":\"\u0421\u0435\u0440\u0432\u0438\u0441 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\",\"js-smartbtn-message\":\"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0438 \u043d\u0430\u0436\u043c\u0438\u0442\u0435 Enter\",\"operator_will_connect_30\":\"\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u0441\u044f \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 30 \u0441\u0435\u043a\u0443\u043d\u0434\",\"operator_will_connect_60\":\"\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u0441\u044f \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u0439 \u043c\u0438\u043d\u0443\u0442\u044b\",\"operator_will_connect_90\":\"\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u0441\u044f \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0443\u0442\u043e\u0440\u0430 \u043c\u0438\u043d\u0443\u0442\",\"operator_will_connect_180\":\"\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u0441\u044f \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0442\u0440\u0451\u0445 \u043c\u0438\u043d\u0443\u0442\",\"personal_name_widget\":\"\u0423\u043c\u043d\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430\",\"personal_greeting_widget\":\"\u0414\u043e\u0431\u0440\u044b\u0439 \u0434\u0435\u043d\u044c. \u0427\u0435\u043c \u043c\u043e\u0433\u0443 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u0435\u043d? \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435\u0441\u044c, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430.\",\"launcher_open_chat\":\"\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0447\u0430\u0442\",\"close_chat\":\"\u0417\u0430\u043a\u0440\u044b\u0442\u044c \u0447\u0430\u0442\",\"switch_to_ru\":\"\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u044f\u0437\u044b\u043a \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u0438\u0439\",\"switch_to_en\":\"\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u044f\u0437\u044b\u043a \u043d\u0430 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0439\",\"choose_language\":\"\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u044f\u0437\u044b\u043a\",\"call_phone\":\"\u041f\u043e\u0437\u0432\u043e\u043d\u0438\u0442\u044c\",\"choose_emoji\":\"\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u044d\u043c\u043e\u0434\u0437\u0438\",\"attach_file\":\"\u041f\u0440\u0438\u043a\u0440\u0435\u043f\u0438\u0442\u044c \u0444\u0430\u0439\u043b\",\"send_message\":\"\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\",\"remove_attachment\":\"\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u043b\u043e\u0436\u0435\u043d\u0438\u0435\",\"open_socials\":\"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u0430\u043d\u0430\u043b\u044b \u0441\u0432\u044f\u0437\u0438\",\"close_socials\":\"\u0421\u043a\u0440\u044b\u0442\u044c \u043a\u0430\u043d\u0430\u043b\u044b \u0441\u0432\u044f\u0437\u0438\",\"offline_file_unavailable\":\"\u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0444\u0430\u0439\u043b\u043e\u0432 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0431\u0435\u0437 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0443.\",\"new_operator_message_title\":\"**
16* \u041d\u043e\u0432\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0442 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430\",\"map_locate_title\":\"\u0423\u0442\u043e\u0447\u043d\u0438\u0442\u044c \u043c\u043e\u0451 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\",\"map_locate_short\":\"\u0423\u0442\u043e\u0447\u043d\u0438\u0442\u044c \u043c\u0435\u0441\u0442\u043e\",\"map_choose_route\":\"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\",\"map_you\":\"\u042f\",\"map_add_point\":\"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0442\u043e\u0447\u043a\u0443\",\"map_drag_hint\":\"\u041f\u0435\u0440\u0435\u0442\u0430\u0449\u0438\u0442\u0435 \u0442\u043e\u0447\u043a\u0443\",\"map_search\":\"\u041f\u043e\u0438\u0441\u043a\u2026\",\"map_address\":\"\u0410\u0434\u0440\u0435\u0441\",\"map_control_item\":\"\u041c\u0430\u0440\u0448\u0440\u0443\u0442\",\"callback_title\":\"\u041e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u0437\u0432\u043e\u043d\u043e\u043a\",\"callback_title_offline\":\"\u041e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u0437\u0432\u043e\u043d\u043e\u043a \u043f\u0440\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0438 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430\",\"field_name\":\"\u0418\u043c\u044f\",\"field_phone\":\"\u0422\u0435\u043b\u0435\u0444\u043e\u043d\",\"field_email\":\"E-mail\",\"field_message\":\"\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\",\"operator_fallback\":\"\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\",\"no_active_operators\":\"\u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0435\u0442 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432! \u0412\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435\u0441\u044c \u0444\u043e\u0440\u043c\u043e\u0439 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0439 \u0441\u0432\u044f\u0437\u0438.\",\"no_operator_input\":\"\u0412\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435\u0441\u044c \u0444\u043e\u0440\u043c\u043e\u0439 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0439 \u0441\u0432\u044f\u0437\u0438 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0435 \u0437\u0430\u043a\u0430\u0437\u0430 \u0437\u0432\u043e\u043d\u043a\u0430\",\"file_too_large\":\"\u0420\u0430\u0437\u043c\u0435\u0440 \u0444\u0430\u0439\u043b\u0430 \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0442\u044c 10 \u041c\u0411\",\"file_transfer_failed\":\"\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0444\u0430\u0439\u043b\",\"notification_new_message\":\"\u041d\u043e\u0432\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\",\"bytes_unit\":\"\u0431\u0430\u0439\u0442\",\"notification_clicked\":\"\u0412\u044b \u043e\u0442\u043a\u0440\u044b\u043b\u0438 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435\",\"notification_denied\":\"\u041f\u043e\u043a\u0430\u0437 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0439 \u0437\u0430\u043f\u0440\u0435\u0449\u0451\u043d\",\"rating_thanks\":\"\u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u043e\u0446\u0435\u043d\u043a\u0443!\",\"rating_prompt\":\"\u041e\u0446\u0435\u043d\u0438\u0442\u0435 \u0440\u0430\u0431\u043e\u0442\u0443 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430\",\"rating_star_label\":\"\u041e\u0446\u0435\u043d\u043a\u0430: :value \u0438\u0437 5\",\"archive_filename\":\"\u0427\u0430\u0442 Smartbtn\",\"archive_operator\":\"\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\",\"archive_loaded_download\":\"\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\",\"archive_loaded_hint\":\"\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u0432 \u044d\u0442\u043e\u043c \u0447\u0430\u0442\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b.\",\"archive_attachment\":\"\u0412\u043b\u043e\u0436\u0435\u043d\u0438\u0435\",\"archive_empty\":\"\u041d\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f.\",\"archive_saved\":\"\u0422\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b \u0433\u043e\u0442\u043e\u0432.\",\"archive_failed\":\"\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0444\u0430\u0439\u043b. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0435\u0449\u0451 \u0440\u0430\u0437.\",\"archive_you\":\"\u0412\u044b\",\"request_operator_control\":\"\u0421\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0441 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c\",\"request_operator_message\"
16:\"\u0421\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u0435 \u043c\u0435\u043d\u044f \u0441 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c\"},\"en\":{\"tab_chat\":\"Online chat\",\"tab_call_order\":\"Request a call\",\"price_list\":\"Price list\",\"how_to_get_here\":\"How to get there\",\"please_turn_your_phone\":\"Please rotate your phone\",\"head_text\":\"We are here and ready to help\",\"pay\":\"Pay\",\"procesed_request\":\"Your request is being processed. We will contact you.\",\"js-chat-call-back-btn-name\":\"Your name\",\"js-chat-call-back-btn-number\":\"Your phone\",\"request_call\":\"Request a call\",\"js-chat-call-back-btn__container-errors\":\"Please fill in all fields\",\"js-chat-call-back-btn-name_no_operator\":\"Your name\",\"js-chat-call-back-btn-email_no_operator\":\"Your email\",\"js-chat-call-back-btn-number_no_operator\":\"Your phone\",\"js-chat-call-back-btn-message_no_operator\":\"Your message\",\"request_feedback\":\"Request feedback\",\"download\":\"Download\",\"continue_conv_in_soc\":\"Continue in:\",\"service_provided\":\"Service provided by\",\"js-smartbtn-message\":\"Type your message and press Enter\",\"operator_will_connect_30\":\"The operator will connect within 30 seconds\",\"operator_will_connect_60\":\"The operator will connect within one minute\",\"operator_will_connect_90\":\"The operator will connect within one and a half minutes\",\"operator_will_connect_180\":\"The operator will connect within three minutes\",\"personal_name_widget\":\"Smartbtn\",\"personal_greeting_widget\":\"Good afternoon. How can I help? Please introduce yourself.\",\"launcher_open_chat\":\"Open chat\",\"close_chat\":\"Close chat\",\"switch_to_ru\":\"Switch language to Russian\",\"switch_to_en\":\"Switch language to English\",\"choose_language\":\"Choose language\",\"call_phone\":\"Call\",\"choose_emoji\":\"Choose an emoji\",\"attach_file\":\"Attach a file\",\"send_message\":\"Send message\",\"remove_attachment\":\"Remove attachment\",\"open_socials\":\"Show contact channels\",\"close_socials\":\"Hide contact channels\",\"offline_file_unavailable\":\"File sending is unavailable while you are offline.\",\"new_operator_message_title\":\"*** New message from an operator\",\"map_locate_title\":\"Refine my location\",\"map_locate_short\":\"Refine location\",\"map_choose_route\":\"Choose a route\",\"map_you\":\"Me\",\"map_add_point\":\"Add a point\",\"map_drag_hint\":\"Drag the point\",\"map_search\":\"Search\u2026\",\"map_address\":\"Address\",\"map_control_item\":\"Route\",\"callback_title\":\"Callback request\",\"callback_title_offline\":\"Callback request while operators are offline\",\"field_name\":\"Name\",\"field_phone\":\"Phone\",\"field_email\":\"Email\",\"field_message\":\"Message\",\"operator_fallback\":\"Operator\",\"no_active_operators\":\"There are currently no active operators! Use the feedback form.\",\"no_operator_input\":\"Use the feedback form on the call request tab\",\"file_too_large\":\"The file size must not exceed 10 MB\",\"file_transfer_failed\":\"The file could not be sent\",\"notification_new_message\":\"New message\",\"bytes_unit\":\"bytes\",\"notification_clicked\":\"You opened the notification\",\"notification_denied\":\"Notifications are blocked\",\"rating_thanks\":\"Thank you for your rating!\",\"rating_prompt\":\"Rate the operator\",\"rating_star_label\":\"Rating: :value out of 5\",\"archive_filename\":\"Smartbtn chat\",\"archive_operator\":\"Operator\",\"archive_loaded_download\":\"Save loaded messages\",\"archive_loaded_hint\":\"Saves messages shown in this chat as a text file.\",\"archive_attachment\":\"Attachment\",\"archive_empty\":\"There are no loaded messages to save.\",\"archive_saved\":\"The text file is ready.\",\"archive_failed\":\"Could not save the file. Try again.\",\"archive_you\":\"You\",\"request_operator_control\":\"Connect me with an operator\",\"request_operator_message\":\"Please connect me with an operator\"}},\"texts\":{\"widget_name\":{\"source\":\"\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 Smartbtn\",\"custom\":true,\"values\":{\"ru\":\"\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 Smartbtn\",\"en\":\"\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 Smartbtn\"}},\"widget_signature\":{\"source\":\"\",\"custom\":false,\"values\":{\"ru\":\"\u041c\u044b \u0442\u0443\u0442 \u0438 \u0433\u043e\u0442\u043e\u0432\u044b \u043f\u043e\u043c\u043e\u0447\u044c\",\"en\":\"We are here and ready to help\"}},\"widget_greeting\":{\"source\":\"\u0414\u043e\u0431\u0440\u044b\u0439 \u0434\u0435\u043d\u044c, \u0447\u0435\u043c \u043c\u043e\u0433\u0443 \u043f\u043e\u043c\u043e\u0447\u044c\",\"custom\":true,\"values\":{\"ru\":\"\u0414\u043e\u0431\u0440\u044b\u0439 \u0434\u0435\u043d\u044c, \u0447\u0435\u043c \u043c\u043e\u0433\u0443 \u043f\u043e\u043c\u043e\u0447\u044c\",\"en\":\"\u0414\u043e\u0431\u0440\u044b\u0439 \u0434\u0435\u043d\u044c, \u0447\u0435\u043c \u043c\u043e\u0433\u0443 \u043f\u043e\u043c\u043e\u0447\u044c\"}}}};\/* D-06\/D-07 device profiles and D-05 assistant locale payload. Both are additive\/opt-in: an absent-profile ({enabled:false,...}) or empty-payload ({assistants:{},operators:{},unique_eligible_target:null}) tenant takes none of the branches gated on them below, so this pass changes nothing observable for a legacy\/non-target widget. *\/var smartbtnDeviceProfileRuntime = {\"enabled\":false,\"desktop\":{\"launcher_size_px\":100,\"position\":\"smartbtn-position-widget-in-page-bottom-right\",\"launcher_offset_x_px\":20,\"launcher_offset_y_px\":20,\"chat_offset_x_px\":0,\"chat_offset_y_px\":0,\"launcher_reveal_delay_sec\":0,\"auto_open_delay_sec\":0,\"show_signature\":true,\"show_logo\":true},\"mobile\":{\"launcher_size_px\":100,\"position\":\"smartbtn-position-widget-in-page-bottom-right\",\"launcher_offset_x_px\":20,\"launcher_offset_y_px\":20,\"chat_offset_x_px\":0,\"chat_offset_y_px\":0,\"launcher_reveal_delay_sec\":0,\"auto_open_delay_sec\":0,\"show_signature\":true,\"show_logo\":true}};if (!smartbtnDeviceProfileRuntime || typeof smartbtnDeviceProfileRuntime !== \"object\") { smartbtnDeviceProfileRuntime = {enabled: false, desktop: {}, mobile: {}};}var smartbtnAssistantLocalePayload = {\"assistants\":{\"1\":{\"assistant_id\":1,\"greeting\":\"\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435! \u042f AI-\u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438. \u
160420\u0430\u0441\u0441\u043a\u0430\u0436\u0438\u0442\u0435, \u0441 \u0447\u0435\u043c \u043f\u043e\u043c\u043e\u0447\u044c \u2014 \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u043e\u0439, \u0442\u0430\u0440\u0438\u0444\u0430\u043c\u0438 \u0438\u043b\u0438 \u043e\u0448\u0438\u0431\u043a\u043e\u0439 \u0432 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0435.\",\"quick_phrases\":[\"\u041a\u0430\u043a \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e?\",\"\u041a\u0430\u043a\u0438\u0435 \u0443 \u043c\u0435\u043d\u044f \u043b\u0438\u043c\u0438\u0442\u044b?\",\"\u041d\u0430\u0448\u0451\u043b \u043e\u0448\u0438\u0431\u043a\u0443\",\"\u0412\u043e\u043f\u0440\u043e\u0441 \u043f\u043e \u043e\u043f\u043b\u0430\u0442\u0435\",\"\u041a\u0430\u043a \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c Telegram?\",\"\u041a\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c API-\u0442\u043e\u043a\u0435\u043d?\"],\"greeting_i18n\":null,\"quick_phrases_i18n\":null}},\"operators\":{\"10\":{\"operator_id\":10,\"assistant_id\":1}},\"unique_eligible_target\":{\"assistant_id\":1,\"operator_id\":10}};if (!smartbtnAssistantLocalePayload || typeof smartbtnAssistantLocalePayload !== \"object\") { smartbtnAssistantLocalePayload = {assistants: {}, operators: {}, unique_eligible_target: null};}\/* Assistant authority state (D-05). `assistantId` null means generic greeting\/no phrases. The sole unique eligible target seeds this once, here, at boot; thereafter only a genuine operator-authored socket sender_id may change it (smartbtnAssistantHandleAuthoredSender) -- an unmapped id clears to generic and this initial seed is never consulted again, even if a later event cannot resolve to any mapped operator. *\/var smartbtnAssistantState = { assistantId: (smartbtnAssistantLocalePayload.unique_eligible_target && typeof smartbtnAssistantLocalePayload.unique_eligible_target === \"object\" && typeof smartbtnAssistantLocalePayload.unique_eligible_target.assistant_id === \"number\") ? smartbtnAssistantLocalePayload.unique_eligible_target.assistant_id : null, authorityEstablished: false};\/* One idempotent matchMedia listener is the sole breakpoint authority for the device-profile module (D-07); null until smartbtnDeviceProfileInit() attaches it, and it is attached ONLY when a profile is enabled, so a disabled\/legacy widget adds no new listener at all. *\/var smartbtnDeviceProfileMql = null;var smartbtnLanguageMemoryPreference = null;var local = \"en\";var smartbtnCatalogs = smartbtnLanguageRuntime.catalogs && typeof smartbtnLanguageRuntime.catalogs === \"object\" ? smartbtnLanguageRuntime.catalogs : {};var languages = new Map();Object.keys(smartbtnCatalogs).forEach(function (locale) { languages.set(locale, smartbtnCatalogs[locale]);});var smartbtnSupportedLocales = Array.isArray(smartbtnLanguageRuntime.supported) ? smartbtnLanguageRuntime.supported.filter(function (locale, index, list) { return typeof locale === \"string\" && languages.has(locale) && list.indexOf(locale) === index; }) : Object.keys(smartbtnCatalogs);if (smartbtnSupportedLocales.length === 0) { smartbtnSupportedLocales = languages.has(\"en\") ? [\"en\"] : (languages.has(\"ru\") ? [\"ru\"] : Object.keys(smartbtnCatalogs));}function smartbtnNormalizeLocaleTag(value) { if (typeof value !== \"string\") { return null; } var normalized = value.trim().toLowerCase().replace(\/_\/g, \"-\"); return \/^[a-z]{2,8}(?:-[a-z0-9]{1,8})*$\/.test(normalized) ? normalized : null;}function smartbtnSupportedLocale(value) { var normalized = smartbtnNormalizeLocaleTag(value); if (!normalized) { return null; } if (smartbtnSupportedLocales.indexOf(normalized) !== -1) { return normalized; } var primary = normalized.split(\"-\")[0]; return smartbtnSupportedLocales.indexOf(primary) !== -1 ? primary : null;}function smartbtnFallbackLocale() { var configured = smartbtnSupportedLocale(smartbtnLanguageRuntime.fallback); if (configured) { return configured; } if (smartbtnSupportedLocales.indexOf(\"en\") !== -1) { return \"en\"; } if (smartbtnSupportedLocales.indexOf(\"ru\") !== -1) { return \"ru\"; } return smartbtnSupportedLocales[0] || \"en\";}function smartbtnResolveLocaleCandidates(candidates) { for (var candidateIndex = 0; candidateIndex < candidates.length; candidateIndex++) { var supported = smartbtnSupportedLocale(candidates[candidateIndex]); if (supported) { return supported; } } return smartbtnFallbackLocale();}function smartbtnBrowserLocale(browserNavigator) { try { var candidates = [];
16 if (Array.isArray(browserNavigator.languages)) { candidates = candidates.concat(browserNavigator.languages); } candidates.push(browserNavigator.language); candidates.push(browserNavigator.userLanguage); return smartbtnResolveLocaleCandidates(candidates); } catch (smartbtnBrowserLanguageError) { return smartbtnFallbackLocale(); }}function smartbtnHostLanguageContext() { try { var host = smartbtnNormalizeLocaleTag(window.SmartbtnLocale) || smartbtnNormalizeLocaleTag(document.documentElement && document.documentElement.lang); return host ? host.split(\"-\")[0] : null; } catch (smartbtnHostContextError) { return null; }}function smartbtnLanguageStorageKey() { return \"smartbtn:widget-language:\" + smartbtnLanguageRuntime.guid;}function smartbtnRemoveLanguagePreference() { smartbtnLanguageMemoryPreference = null; try { window.localStorage.removeItem(smartbtnLanguageStorageKey()); } catch (smartbtnLanguageStorageError) { return; }}function smartbtnReadLanguagePreference() { var preference = smartbtnLanguageMemoryPreference; try { var rawPreference = window.localStorage.getItem(smartbtnLanguageStorageKey()); preference = rawPreference === null ? preference : JSON.parse(rawPreference); } catch (smartbtnLanguageStorageError) { preference = smartbtnLanguageMemoryPreference; } if (!preference || typeof preference !== \"object\") { return null; } var preferredLocale = smartbtnSupportedLocale(preference.locale); if (!preferredLocale || preference.policy_revision !== smartbtnLanguageRuntime.revision) { return null; } if (smartbtnLanguageRuntime.mode === \"auto\") { var hostContext = smartbtnHostLanguageContext(); var hasHostContext = Object.prototype.hasOwnProperty.call(preference, \"host_locale\"); if ((hasHostContext && preference.host_locale !== hostContext) || (!hasHostContext && hostContext !== null)) { smartbtnRemoveLanguagePreference(); return null; } } return preferredLocale;}function smartbtnStoreLanguagePreference(locale) { var preference = { locale: locale, policy_revision: smartbtnLanguageRuntime.revision, host_locale: smartbtnHostLanguageContext() }; smartbtnLanguageMemoryPreference = preference; try { window.localStorage.setItem(smartbtnLanguageStorageKey(), JSON.stringify(preference)); } catch (smartbtnLanguageStorageError) { return; }}\/* The host page can tell the widget its own current language directly, two ways, both optional and both lower priority than the visitor's own in-widget choice while the host remains in the same language. In Auto, a host language change invalidates the old-context visitor choice: - window.SmartbtnLocale, read once here at initial load (set it before this <script> tag if the host page already knows its language then). - window.smartbtnSetHostLocale(locale), callable any time after load (e.g. from the host page's own language-toggle handler) -- see its definition below. A site that sets either of these is understood to want full manual control, so smartbtnWatchDocumentLocale() below (the automatic <html lang> signal) steps aside whenever window.SmartbtnLocale is set, explicit or not. *\/function smartbtnHostLocaleOverride() { try { return smartbtnSupportedLocale(window.SmartbtnLocale); } catch (smartbtnHostLocaleError) { return null; }}\/* document.documentElement.lang, read only once mode is \"auto\" and no host\/fixed override applies -- a page-specific signal, tried before falling back to the browser's own language. Confirmed live on meduzavpn.com (2026-09-03): its own EN\/RU toggle keeps <html lang> correctly in sync (both on a fresh load of e.g. \/ru and after an in-page SPA toggle), yet the widget kept showing English regardless, because this file used to deliberately ignore the attribute (an earlier, different customer's <html lang> had been seen stuck stale, which no longer holds as a blanket reason to ignore every site's). A site whose <html lang> genuinely cannot be trusted now has the explicit override above as its way out, rather than this file distrusting the attribute for every site to guard against one. *\/function smartbtnDocumentLocaleOverride() { try { return smartbtnSupportedLocale(document.documentElement.lang); } catch (smartbtnDocumentLocaleError) { return null; }}function smartbtnResolveInitialLocale(browserNavigator) { if (smartbtnLanguageRuntime.switcher === \"1\") { var visitorLocale = smartbtnReadLanguagePreference(); if (visitorLocale) { return visitorLocale; } } else { smartbtnRemoveLanguagePreference(); } var hostLocale = smartbtnHostLocaleOverride(); if (hostLocale) { return hostLocale; } if (smartbtnLanguageRuntime.mode !== \"auto\") { var fixedLocale = smartbtnSupportedLocale(smartbtnLanguageRuntime.mode); if (fixedLocale) { return fixedLocale; } } var documentLocale = smartbtnDocumentLocaleOverride(); if (documentLocale) { return documentLocale; } return smartbtnBrowserLocale(browserNavigator);}\/* meduzavpn.com's own EN\/RU toggle is a client-side route change (no full reload) that updates <html lang> in place -- this widget's <script> tag only ever runs once, at initial load, so without watching for that mutation it keeps whatever locale it first resolved even after the host page's own toggle switches under it. Steps aside the moment window.SmartbtnLocale is set (any value, even one smartbtnSupportedLocale rejects): a site driving the widget explicitly is assumed to want full control, not a competing automatic guess. Also steps aside for a visitor's own stored switcher choice only while its host-language context still matches; a site language change expires that choice in Auto. *\/function smartbtnWatchDocumentLocale() { if (typeof MutationObserver === \"undefined\" || !document.documentElement) { return; } try { var observer = new MutationObserver(function () { if (smartbtnLanguageRuntime.mode !== \"auto\") { return; } if (window.SmartbtnLocale !== undefined && window.SmartbtnLocale !== null) { return; } if (smartbtnLanguageRuntime.switcher === \"1\" && smartbtnReadLanguagePreference()) { return; } var resolvedLocale = smartbtnResolveInitialLocale(window.navigator); if (resolvedLocale !== local) { smartbtnApplyLocale(resolvedLocale, false); } }); observer.observe(document.documentElement, { attributes: true, attributeFilter: [\"lang\"] }); } catch (smartbtnWatchDocumentLocaleError) { return; }}\/* Public API for the host page: call this from your own language-toggle handler (e.g. window.smartbtnSetHostLocale('ru')) any time after the widget has loaded, and its chrome switches immediately. Unsupported or unrecognised locales are silently ignored -- a bad value here must not throw out of the host page's own click handler. Does not touch a visitor's own stored in-widget preference (smartbtnStoreLanguagePreference is for the widget's own switcher only); the host page's own signal is not remembered across visits by design, since it should just reflect the site's live state on the next call. *\/window.smartbtnSetHostLocale = function (locale) { var resolved = smartbtnSupportedLocale(locale); if (resolved) { window.SmartbtnLocale = resolved; smartbtnReadLanguagePreference(); smartbtnApplyLocale(resolved, false); }};\/* Send the effective visible locale with every visitor frame, including reconnects and queued messages flushed after a language switch. *\/function smartbtnSerializeClientFrame(frame) { return JSON.stringify(Object.assign({}, frame, {clientLocale: local}));}function smartbtnI18n(key, replacements) { var catalogOrder = [local, smartbtnFallbackLocale(), \"en\", \"ru\"]; var value = null; for (var catalogIndex = 0; catalogIndex < catalogOrder.length; catalogIndex++) { var catalog = languages.get(catalogOrder[catalogIndex]); if (catalog && typeof catalog[key] === \"string\") { value = catalog[key]; break; } } value = value === null ? key : value; if (replacements && typeof replacements === \"object\") { Object.keys(replacements).forEac
16h(function (name) { value = value.split(\":\" + name).join(String(replacements[name])); }); } return value;}function smartbtnCallbackSummary(callbackData, offline) { var lines = [smartbtnI18n(offline ? \"callback_title_offline\" : \"callback_title\")]; if (callbackData.name) { lines.push(smartbtnI18n(\"field_name\") + \": \" + callbackData.name); } if (callbackData.number) { lines.push(smartbtnI18n(\"field_phone\") + \": \" + callbackData.number); } if (callbackData.email !== null && callbackData.email !== undefined && callbackData.email !== \"\") { lines.push(smartbtnI18n(\"field_email\") + \": \" + callbackData.email); } if (callbackData.body) { lines.push(smartbtnI18n(\"field_message\") + \": \" + callbackData.body); } return lines.join(\"\\n\");}function smartbtnAppendPendingCallback(callbackData) { var bubble = document.createElement(\"div\"); bubble.classList.add(\"new_smartbtn_widget_client-message\", \"new_smartbtn_widget_client-message-no-connection\"); var leftSide = document.createElement(\"div\"); leftSide.className = \"new_smartbtn_widget_client-message__left-side\"; var time = document.createElement(\"div\"); time.className = \"new_smartbtn_widget_client-message__time new_smartbtn_widget_client-spin_loader\"; var message = document.createElement(\"div\"); message.className = \"new_smartbtn_widget_client-message__message\"; message.style.wordBreak = \"break-word\"; message.textContent = smartbtnCallbackSummary(callbackData, callbackData.email !== null); leftSide.appendChild(time); leftSide.appendChild(message); bubble.appendChild(leftSide); document.querySelector(\"#js-smartbtn-chat-box\").appendChild(bubble);}function smartbtnBuildAttachmentPreview(idElement, fileName, source) { var preview = document.createElement(\"div\"); preview.id = idElement; preview.className = \"new_smartbtn_widget_message-area__files\"; var wrapper = document.createElement(\"div\"); wrapper.className = \"new_smartbtn_widget_message-area__files_name_w\"; var name = document.createElement(\"div\"); name.className = \"new_smartbtn_widget_message-area__files_name\"; name.textContent = fileName; var image = document.createElement(\"img\"); image.className = \"new_smartbtn_widget_message-area__files_object\"; image.src = source; image.alt = \"\"; var close = document.createElement(\"div\"); close.className = \"new_smartbtn_widget_message-area__files_close\"; close.id = \"close_\" + idElement; close.dataset.id = idElement; close.textContent = \"\u00d7\"; close.setAttribute(\"role\", \"button\"); close.setAttribute(\"tabindex\", \"0\"); close.setAttribute(\"aria-label\", smartbtnI18n(\"remove_attachment\")); close.addEventListener(\"keydown\", function (event) { if (event.key === \"Enter\" || event.key === \" \" || event.key === \"Spacebar\") { event.preventDefault(); this.click(); } }); wrapper.appendChild(name); wrapper.appendChild(image); wrapper.appendChild(close); preview.appendChild(wrapper); return preview;}function smartbtnRevealLanguageRoots() { document.querySelectorAll(\"[data-smartbtn-language-pending]\").forEach(function (root) { root.removeAttribute(\"data-smartbtn-language-pending\"); root.style.visibility = \"\"; });}var smartbtnTextCatalogKeys = { widget_name: \"personal_name_widget\", widget_signature: \"head_text\", widget_greeting: \"personal_greeting_widget\"};function smartbtnResolveTextField(field, locale) { var fieldRuntime = smartbtnLanguageRuntime.texts && smartbtnLanguageRuntime.texts[field]; var resolvedLocale = smartbtnSupportedLocale(locale) || smartbtnFallbackLocale(); if (fieldRuntime && fieldRuntime.values && typeof fieldRuntime.values[resolvedLocale] === \"string\" && fieldRuntime.values[resolvedLocale].trim() !== \"\") { return fieldRuntime.values[resolvedLocale]; } if (fieldRuntime && fieldRuntime.custom && typeof fieldRuntime.source === \"string\" && fieldRuntime.source.trim() !== \"\") { return fieldRuntime.source; } return smartbtnI18n(smartbtnTextCatalogKeys[field] || field);}function smartbtnApplyTextFields() { document.querySelectorAll(\"[data-smartbtn-text-field]\").forEach(function (node) { node.textContent = smartbtnResolveTextField(node.getAttribute(\"data-smartbtn-text-field\"), local); }); var greetingNode = document.querySelector(\"[data-smartbtn-text-field=\\\"widget_greeting\\\"]\"); if (greetingNode) { messageGreeting = greetingNode.textContent; } \/* D-05: a locale switch re-renders every generic text field, including the shared greeting node -- reapply the current assistant's own greeting\/quick phrases for the new locale right after (no-op with no active assistant target). The typeof guard is a no-op in the real served file (this function is defined later in it and hoisted, like every function declaration); it only matters to a test harness that deliberately executes a narrower prefix slice of the source. *\/ if (typeof smartbtnAssistantApplyProjection === \"function\") { smartbtnAssistantApplyProjection(); }}function smartbtnHeaderCacheKey(field, locale, revision) { return \"smartbtn:widget-header:\" + smartbtnLanguageRuntime.guid + \":\" + locale + \":\" + revision + \":\" + field;}function smartbtnReadHeaderCache(field, locale, revision) { try { var cached = window.localStorage.getItem(smartbtnHeaderCacheKey(field, locale, revision)); return cached && cached.trim() !== \"\" ? cached : null; } catch (smartbtnHeaderStorageError) { return null; }}function smartbtnStoreHeaderCache(field, locale, revision, value) { if (typeof value !== \"string\" || value.trim() === \"\") { return; } try { window.localStorage.setItem(smartbtnHeaderCacheKey(field, locale, revision), value); } catch (smartbtnHeaderStorageError) { return; }}function smartbtnApplyLocale(locale, rememberVisitorChoice) { local = smartbtnSupportedLocale(locale) || smartbtnFallbackLocale(); document.querySelectorAll(\"#js-phone-btn, #smartbtn_widget_view\").forEach(function (root) { root.setAttribute(\"lang\", local); root.setAttribute(\"dir\", local === \"ar\" ? \"rtl\" : \"ltr\"); }); document.querySelectorAll(\"[data-smartbtn-i18n]\").forEach(function (node) { node.textContent = smartbtnI18n(node.getAttribute(\"data-smartbtn-i18n\")); }); document.querySelectorAll(\"[data-smartbtn-i18n-placeholder]\").forEach(function (node) { node.placeholder = smartbtnI18n(node.getAttribute(\"data-smartbtn-i18n-placeholder\")); }); document.querySelectorAll(\"[data-smartbtn-i18n-value]\").forEach(function (node) { node.value = smartbtnI18n(node.getAttribute(\"data-smartbtn-i18n-value\")); }); document.querySelectorAll(\"[data-smartbtn-i18n-title]\").forEach(function (node) { node.setAttribute(\"title\", smartbtnI18n(node.getAttribute(\"data-smartbtn-i18n-title\"))); }); document.querySelectorAll(\"[data-smartbtn-i18n-aria-label]\").forEach(function (node) { node.setAttribute(\"aria-label\", smartbtnI18n(node.getAttribute(\"data-smartbtn-i18n-aria-label\"))); }); smartbtnApplyTextFields(); var switcher = document.querySelector(\"[data-smartbtn-language-switcher]\"); if (switcher) { var languageSelect = switcher.querySelector(\"[data-smartbtn-language-select]\"); if (languageSelect) { languageSelect.value = local; } var flagNodes = switcher.querySelectorAll(\"[data-smartbtn-language-flag]\"); var matchedFlag = false;
16 flagNodes.forEach(function (flagNode) { var isMatch = flagNode.getAttribute(\"data-smartbtn-language-flag\") === local; if (isMatch) { matchedFlag = true; } flagNode.style.display = isMatch ? \"\" : \"none\"; }); if (!matchedFlag) { flagNodes.forEach(function (flagNode) { flagNode.style.display = flagNode.getAttribute(\"data-smartbtn-language-flag\") === \"default\" ? \"\" : \"none\"; }); } } if (rememberVisitorChoice && smartbtnLanguageRuntime.switcher === \"1\") { smartbtnStoreLanguagePreference(local); }}try { smartbtnApplyLocale(smartbtnResolveInitialLocale(window.navigator), false);} catch (smartbtnLanguageBootstrapError) { local = smartbtnFallbackLocale(); try { smartbtnApplyLocale(local, false); } catch (smartbtnLanguageFallbackError) { local = smartbtnFallbackLocale(); }} finally { smartbtnRevealLanguageRoots(); smartbtnWatchDocumentLocale();}document.querySelectorAll('[role=\"button\"][tabindex=\"0\"]').forEach(function (button) { button.addEventListener(\"keydown\", function (event) { if (event.key === \"Enter\" || event.key === \" \" || event.key === \"Spacebar\") { event.preventDefault(); this.click(); } });});const Smartbtn_api = { status: null, clientData: null, apiClientData: null, apiEnabled: 1,url: `https:\/\/smartbtn.ru\/api\/set\/client\/data\/`, setClientInfo : function (data){ let clientData = { name: null, email: null, phone: null, description: null, }; data.name ? clientData.name = data.name : clientData.name = null; data.email ? clientData.email = data.email : clientData.email = null; data.phone ? clientData.phone = data.phone : clientData.phone = null; data.description ? clientData.description = data.description : clientData.description = null; this.clientData = JSON.stringify(clientData);},setClientCustomData : function (data){ let dataArray = Array(); if(Array.isArray(data)){ data.forEach(function (currentData) { const title = (currentData && currentData.title != null && currentData.title != undefined ) ? currentData.title : null; const content = (currentData && currentData.content != null && currentData.content != undefined ) ? currentData.content : null; const link = (currentData && currentData.link != null && currentData.link != undefined ) ? currentData.link : null; dataArray.push({title, content, link}); }); this.apiClientData = JSON.stringify(dataArray); }},makeRequest : async function () { if (this.apiEnabled && this.apiClientData || this.apiEnabled && this.clientData) { let formData = new FormData(); formData.append(\"client\", this.clientData); formData.append(\"options\", this.apiClientData); \/* cluster-node-selector: route through the selected node (no-op single-origin); a network failure marks the node for the penalty box + re-race instead of dying as an unhandled rejection. *\/ try { response = await fetch(smartbtnClusterUrl(this.url + SmartBtnClient), { method: \"POST\", body: formData, }); } catch (clusterFetchError) { smartbtnClusterOnAjaxError(); this.status = {result: \"fail\", reason: \"network error\"}; return; } response = await response.json(); if (response.status != 200){ this.status = {result: \"fail\", reason: response.error}; } this.status = {result: \"ok\"}; }else { this.state = {result: \"fail\", reason: \"API dissabled by owner\"}; }},};const Cookies = { get: function (name) { let matches = document.cookie.match(new RegExp( \"(?:^|; )\" + name.replace(\/([\\.$?*|{}\\(\\)\\[\\]\\\\\\\/\\+^])\/g, \"\\\\$1\") + \"=([^;]*)\" )); return matches ? decodeURIComponent(matches[1]) : undefined; }, set: function (name, value, opts) { let options = { path: \"\/\", \"max-age\": 600, }; for (let key in opts) { options[key] = opts[key]; } options[\"max-age\"] = options[\"max-age\"]; let updatedCookie = encodeURIComponent(name) + \"=\" + encodeURIComponent(value); for (let optionKey in options) { updatedCookie += \"; \" + optionKey; let optionValue = options[optionKey]; if (optionValue !== true) { updatedCookie += \"=\" + optionValue; } } document.cookie = updatedCookie; }, remove: function (name) { let cookie = encodeURIComponent(name) + \"=null\"; cookie += \"; max-age=0\"; document.cookie = cookie; },};const HEIGHT_HEADER = 100;const HEIGHT_SENDER = 130;const HEIGHT_SENDER_SMALL = 35;const HEIGHT_TAB = 43;function isValidWebUrl(inp) { let url; if (inp.substring(0,4) === \"www.\" && inp.length > 4){ if (inp.trim().split(\".\").length <= 2){ return false; }else if(inp.trim().split(\".\")[2].length < 2){ return false; } return true } try { url = new URL(inp); } catch (e) { return false; } return url.protocol === \"http:\" || url.protocol === \"https:\" || url.protocol === \"mailto:\" || url.protocol === \"ftp:\";};\/* ************** \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e replace \u0432\u043c\u0435\u0441\u0442\u043e replaceAll (\u043d\u0435 \u043d\u0430 \u0432\u0441\u0435\u0445 safari \u0438 iphone \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442) \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u041d\u0443\u0436\u043d\u043e \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0438, \u0435\u0441\u043b\u0438 \u0431\u0443\u0434\u0443\u0442 \u0432\u0445\u043e\u0434\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0430 \u0432\u0438\u0434\u0430 <<div\/>> - \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 < \u0438 > ************************ *\/\/* Markdown-lite for chat bubbles (operator feedback 2026-07-11): converts **bold** to <strong>, and a NEWLINE_PLACEHOLDER token (see urlify() below) back to <br>. MUST run only on text that has ALREADY been HTML-escaped (see the \/g fix on the two string.replace(...) calls in urlify()) -- this function itself never touches raw \"<\"\/\">\"\/\"&\" characters, it only wraps already-safe text in tags IT constructs, so it cannot reopen the escaping it depends on. *\/const NEWLINE_PLACEHOLDER = \"\u0001NL\u0001\";function markdownLiteToHtml(text){ if (!text){ return text; } text = text.replace(\/\\*\\*(.+?)\\*\\*\/g, \"<strong>$1<\/strong>\"); text = text.split(NEWLINE_PLACEHOLDER).join(\"<br>\"); return text;}\/* HTML-escape a string for use as element text or inside a double-quoted attribute. *\/function smartbtnEscapeHtml(value){ return String(value) .replace(\/&\/g, \"&\") .replace(\/<\/g, \"<\") .replace(\/>\/g, \">\") .replace(\/\"\/g, \""\") .replace(\/'\/g, \"'\");}\/* Returns the URL only when it is http(s); anything else (javascript:, data:, relative junk) yields null. *\/function smartbtnSafeHttpUrl(url){ if (typeof url !== \"string\" || url === \"\"){ return null; } var parsed; try { parsed = new URL(url, window.location.href); } catch (e) { return null; } if (parsed.protocol !== \"https:\" && parsed.protocol !== \"http:\"){ return null; } return parsed.href;}\/* The display name of a stored attachment body. The body is server-built anchor markup, but old rows hold the client file name unescaped, so the markup is never inserted: it is parsed in an inert DOMParser document (no scripts, no handlers, no image loads) and only its text is taken. *\/function smartbtnAttachmentLabel(body){ if (typeof body !== \"string\" || body === \"\"){ return \"\"; } var text = \"\";
16 try { text = new DOMParser().parseFromString(body, \"text\/html\").body.textContent || \"\"; } catch (e) { text = body.replace(\/<[^>]*>\/g, \"\"); } return text.replace(\/\\s+\/g, \" \").trim();}\/* Builds the non-image attachment bubble from trusted pieces: a link (only when the URL is http(s)) whose text is the file name, plus the size. createElement + textContent only, never innerHTML. *\/function smartbtnBuildAttachmentBlock(wrapperClass, body, url, sizeText){ var wrapper = document.createElement(\"div\"); wrapper.className = wrapperClass; var safeUrl = smartbtnSafeHttpUrl(url); var label = smartbtnAttachmentLabel(body); if (!label && safeUrl){ label = safeUrl.split(\"?\")[0].split(\"\/\").pop() || \"\"; try { label = decodeURIComponent(label); } catch (e) { label = label; } } if (!label){ label = \"file\"; } var nameNode; if (safeUrl){ nameNode = document.createElement(\"a\"); nameNode.className = \"new_smartbtn_widget_message-area__files_object_chat_client\"; nameNode.setAttribute(\"href\", safeUrl); nameNode.setAttribute(\"target\", \"_blank\"); nameNode.setAttribute(\"rel\", \"noopener noreferrer\"); } else { nameNode = document.createElement(\"span\"); } nameNode.textContent = label; wrapper.appendChild(nameNode); if (sizeText){ wrapper.appendChild(document.createTextNode(\" \" + sizeText)); } return wrapper;}\/* Builds the image attachment preview: a link around an img, both pointing at the same http(s) URL. *\/function smartbtnBuildAttachmentImage(url){ var safeUrl = smartbtnSafeHttpUrl(url); if (!safeUrl){ return null; } var link = document.createElement(\"a\"); link.setAttribute(\"href\", safeUrl); link.setAttribute(\"target\", \"_blank\"); link.setAttribute(\"rel\", \"noopener noreferrer\"); var img = document.createElement(\"img\"); img.className = \"new_smartbtn_widget_message-area__files_object_chat\"; img.setAttribute(\"src\", safeUrl); img.setAttribute(\"alt\", \"\"); link.appendChild(img); return link;}function urlify(string){ if (!string){ return \"\"; } \/* fix (2026-07-11): a bare (non-global) .replace() only swaps the FIRST \"<\"\/\">\" in the message -- any message with a SECOND literal \"<\"\/\">\" (e.g. a second <script> tag) left the rest completely unescaped and rendered as live HTML via the .innerHTML assignment at every call site of this function -- a real stored-XSS hole. Global regex closes it for every occurrence, not just the first. *\/ \/* fix (2026-09-24): escape the FULL HTML set, not only angle brackets. With \"&\" and quotes left raw, a token that isValidWebUrl() accepts could carry a double quote into the href=\"...\" this function builds and end the attribute early. \"&\" goes first so the entities added after it are not double-escaped. *\/ string = smartbtnEscapeHtml(string); \/* Normalize real newlines to a SPACE-PADDED placeholder token BEFORE the word-split below, converted back to <br> at the very end by markdownLiteToHtml(). Caught by a behavioral test: without this, a message like \"https:\/\/example.com\\n\u0421\u043f\u0430\u0441\u0438\u0431\u043e\" has no space between the URL and the next line, so split(\" \") treated the whole \"url+newline+text\" run as ONE token and isValidWebUrl() wrongly linkified the newline and trailing text INTO the href\/link text. Padding the placeholder with real spaces guarantees it is always its own isolated token, so a URL can never straddle a line break. *\/ string = string.replace(\/\\r\\n|\\n\/g, \" \" + NEWLINE_PLACEHOLDER + \" \"); let arr = string.split(\" \"); \/* keep the untouched words so a non-URL token can be restored below instead of staying stripped\/empty *\/ const originalArr = arr.slice(); let wrong = false; let specialChars = [\"!\",\"@\",\"#\",\"$\",\"^\",\"%\",\"?\",\",\",\"*\",\"[\",\"]\",\"(\",\")\"]; for (let i = 0; i < specialChars.length; i++) { for (let j = 0; j< arr.length;j++){ if (arr[j].trim().slice(-1) === specialChars[i]){ arr[j] = arr[j].replace(specialChars[i], \"\").replace(\" \",\"\"); }else if (arr[j].trim().charAt(0) === specialChars[i]){ arr[j] = arr[j].replace(specialChars[i], \"\").replace(\" \",\"\"); } } }; for (let j = 0; j< arr.length;j++){ if (isValidWebUrl(arr[j])){ let ll = \"\"; let ff = \"\"; for (let i = 0; i < specialChars.length; i++) { if (arr[j].charAt(arr[j].length-1) === specialChars[i]){ arr[j] = arr[j].replace(specialChars[i], \"\").replace(\" \",\"\"); }else if (arr[j].charAt(0) === specialChars[i]){ arr[j] = arr[j].replace(specialChars[i], \"\").replace(\" \",\"\"); } if (arr[j].charAt(arr[j].length - 1) === \".\"){ ll = \".\"; arr[j] = arr[j].slice(0,-1); } } if (arr[j].substring(0,4) === \"www.\" && arr[j].length > 4){ arr[j] = `${ff} <a style=\"overflow-wrap: break-word;\" href=\"http:\/\/${arr[j]}\">${arr[j]}<\/a> ${ll}`; }else{ arr[j] = `${ff} <a style=\"overflow-wrap: break-word;\" href=\"${arr[j]}\">${arr[j]}<\/a> ${ll}`; } }else{ arr[j] = originalArr[j]; } } \/* markdown-lite runs LAST, on the fully escaped+linkified string -- real newlines in the original message survive word-splitting above untouched (split(\" \") never treats \"\\n\" as a separator) and are still present here to convert; \"**\" pairs likewise never appear inside the <a href=\"...\"> tags this function constructs, so this cannot corrupt a URL link. *\/ return markdownLiteToHtml(arr.filter(Boolean).join(\" \"));}\/* Message with buttons -- the client half of App\\Support\\MessageEnvelope. An operator\/bot message body can be a JSON envelope {\"type\":\"keyboard\",\"text\":\"...\",\"markdown\":bool,\"buttons\":[{\"label\":\"...\",\"url\":\"https:\/\/...\",\"style\":\"primary|secondary\"}]}. Its text renders exactly like a plain message (urlify), its buttons as real links under the bubble. The server already sanitises on write and read; every rule is re-checked here because this code must never trust a body: https only (no javascript:, data:, http:, credentials), label 1..64 chars with control characters removed, at most 7 buttons. Buttons are built with createElement + textContent + setAttribute -- never innerHTML -- so a label or url can never become markup. NOTE: WidgetController strips every newline from this file before serving it, so only block comments and explicit semicolons here. *\/var SMARTBTN_ENVELOPE_TYPE = \"keyboard\";var SMARTBTN_ENVELOPE_MAX_BUTTONS = 7;var SMARTBTN_ENVELOPE_MAX_LABEL_CHARS = 64;var SMARTBTN_ENVELOPE_MAX_URL = 2048;function smartbtnEnvelopeSafeUrl(url) { if (typeof url !== \"string\") { return null; } var candidate = url.trim(); if (candidate === \"\" || candidate.length >
16 SMARTBTN_ENVELOPE_MAX_URL || \/[\\s\\u0000-\\u001f\\u007f]\/.test(candidate)) { return null; } var parsed; try { parsed = new URL(candidate); } catch (e) { return null; } if (parsed.protocol !== \"https:\" || !parsed.hostname || parsed.username !== \"\" || parsed.password !== \"\") { return null; } return candidate;}function smartbtnEnvelopeCleanLabel(label) { if (typeof label !== \"string\") { return null; } var clean = label.replace(\/[\\u0000-\\u001f\\u007f-\\u009f\u00ad\u061c\u180e\u200b-\u200f\u202a-\u202e\u2060-\u2064\u2066-\u206f\ufeff\ufff9-\ufffb]+\/g, \" \"); clean = clean.replace(\/\\s+\/g, \" \").trim(); if (clean === \"\") { return null; } var chars = Array.from(clean); if (chars.length > SMARTBTN_ENVELOPE_MAX_LABEL_CHARS) { clean = chars.slice(0, SMARTBTN_ENVELOPE_MAX_LABEL_CHARS - 1).join(\"\").replace(\/\\s+$\/, \"\") + \"\u2026\"; } return clean;}\/* Returns {text, markdown, buttons} for an envelope body, or null for plain text. *\/function smartbtnParseMessageEnvelope(body) { if (typeof body !== \"string\") { return null; } var trimmed = body.replace(\/^\\s+\/, \"\"); if (trimmed.charAt(0) !== \"{\") { return null; } var decoded = null; try { decoded = JSON.parse(trimmed); } catch (e) { return null; } if (!decoded || typeof decoded !== \"object\" || decoded.type !== SMARTBTN_ENVELOPE_TYPE) { return null; } var rawButtons = Array.isArray(decoded.buttons) ? decoded.buttons : []; var buttons = []; for (var i = 0; i < rawButtons.length && buttons.length < SMARTBTN_ENVELOPE_MAX_BUTTONS; i++) { var raw = rawButtons[i]; if (!raw || typeof raw !== \"object\") { continue; } var label = smartbtnEnvelopeCleanLabel(typeof raw.label === \"string\" ? raw.label : raw.text); var url = smartbtnEnvelopeSafeUrl(raw.url); if (label === null || url === null) { continue; } buttons.push({ label: label, url: url, style: (raw.style === \"secondary\") ? \"secondary\" : \"primary\" }); } return { text: (typeof decoded.text === \"string\") ? decoded.text : \"\", markdown: !!decoded.markdown, buttons: buttons };}\/* Text-only form (notifications, previews): the text, then one \"label: url\" line per button. *\/function smartbtnEnvelopePlainText(body) { var envelope = smartbtnParseMessageEnvelope(body); if (!envelope) { return (typeof body === \"string\") ? body : \"\"; } var text = envelope.text.replace(\/\\s+$\/, \"\"); var lines = envelope.buttons.map(function (button) { return button.label + \": \" + button.url; }); if (lines.length === 0) { return text; } return (text === \"\" ? \"\" : text + \"\\n\\n\") + lines.join(\"\\n\");}function smartbtnBuildEnvelopeButtons(buttons) { var wrap = document.createElement(\"div\"); wrap.className = \"smartbtn-widget-message-buttons\"; (Array.isArray(buttons) ? buttons : []).forEach(function (button) { if (!button) { return; } var url = smartbtnEnvelopeSafeUrl(button.url); var label = smartbtnEnvelopeCleanLabel(button.label); if (url === null || label === null) { return; } var link = document.createElement(\"a\"); link.className = \"smartbtn-widget-message-button smartbtn-widget-message-button--\" + ((button.style === \"secondary\") ? \"secondary\" : \"primary\"); link.setAttribute(\"href\", url); link.setAttribute(\"target\", \"_blank\"); link.setAttribute(\"rel\", \"noopener noreferrer\"); link.textContent = label; wrap.appendChild(link); }); return wrap;}function smartbtnSpiralAnimation() { document.getElementById(\"smartbtn-chat-main-animation-spiralAnim-none\").classList.add(\"smartbtn-chat-main-animation-spiralAnim\"); function smartbtnSpiralAnimationSetTimout() { const getElement = document.querySelector(\".smartbtn-chat-main-animation-spiralAnim__box-active\"); const nextElement = getElement.nextElementSibling; function smartbtnSpiralAnimationSetTimoutElement() { document.getElementById(\"smartbtn-chat-main-animation-spiralAnim-none\").classList.remove(\"smartbtn-chat-main-animation-spiralAnim\"); } if(nextElement == null) { getElement.classList.remove(\"smartbtn-chat-main-animation-spiralAnim__box-active\"); const getNewElement = document.querySelector(\".smartbtn-chat-main-animation-spiralAnim__box-one\"); getNewElement.classList.add(\"smartbtn-chat-main-animation-spiralAnim__box-active\"); setTimeout(smartbtnSpiralAnimationSetTimoutElement, 1000); return; } getElement.classList.remove(\"smartbtn-chat-main-animation-spiralAnim__box-active\"); nextElement.classList.add(\"smartbtn-chat-main-animation-spiralAnim__box-active\"); setTimeout(smartbtnSpiralAnimationSetTimoutElement, 1000); } setTimeout(smartbtnSpiralAnimationSetTimout, 1000);};function openChatWindow() { \/* Enabled profiles own one tracked auto-open timer on both desktop and mobile. The flat timer must not race it or reopen a chat the visitor already closed. Absent\/disabled profiles retain this path. *\/ if (smartbtnDeviceProfileRuntime.enabled) { return; } if (openWidget > 0){ let openWidgetTime = openWidget*1000; if (openedChat === false){ setTimeout(() => { if (openedChat === false){ if (isOnlineOperator === false){ document.getElementById(\"smartbtn-chat-main-animation-spiralAnim-none\").click(); } } },openWidgetTime); } }}function drawRatingMessageInterval() { if (intervalForRating){ clearTimeout(intervalForRating); return; }; if (openedChatForRatingShow === true){ intervalForRating = setTimeout(() => { createRatingMessage(local); },openOperatorWidgetRating * 1000); }}var smbLauncherEl = document.getElementById(\"smartbtn-chat-main-animation-spiralAnim-none\");\/* Two independent reasons to run the 5s spiral cycle, and ONE timer for both. 1. the spiral-default preset -- the SmartBTN chat default icon, which swaps to the next messenger frame on every pulse;
16 2. an uploaded custom icon whose owner picked \"Spiral\" (Button.data->icon_custom_animated === \"2\", which panel.blade.php emits as the smartbtn-chat-main-animation--custom-spiral marker class). A custom icon has exactly one frame, so nothing swaps and nothing needs to: what the owner asked for is the MOVEMENT, and smartbtnSpiralAnimation() below is where the movement lives -- it puts smartbtn-chat-main-animation-spiralAnim (the rotate+shrink keyframe, main.min.css) on the launcher and takes it off 2s later. The single-box case is already handled: nextElementSibling is null, so it re-activates __box-one, which is the same box. Deliberately NOT a second mechanism. A separate interval would drift out of phase with this one and would have to re-implement the same class dance. NOTE for anyone editing this file: every newline is stripped out of it before it is served (WidgetController::getButtonV2), so block comments only -- a line comment here swallows the whole rest of the widget. *\/if (smbLauncherEl && (smbLauncherEl.dataset.iconPreset === \"spiral-default\" || smbLauncherEl.classList.contains(\"smartbtn-chat-main-animation--custom-spiral\"))) { setInterval(smartbtnSpiralAnimation, 5000);}function notSendMsgsToStorage(message){ let msgsWithFile = localStorage.getItem(\"notSendMessagesFromClient\"); if (msgsWithFile !== null && JSON.parse(msgsWithFile).length > 0){ let msgs = [...JSON.parse(msgsWithFile)]; msgs.push(message); localStorage.setItem(\"notSendMessagesFromClient\",JSON.stringify(msgs)); }else{ let msgs = []; msgs.push(message); localStorage.setItem(\"notSendMessagesFromClient\",JSON.stringify(msgs)); } createClientMessageNoConnection(message);};\/* addEventListener, NOT window.ononline\/onoffline assignment: the widget runs inside a customer's page, and assigning the on* property would silently destroy any handler the host page had installed the same way. *\/window.addEventListener(\"online\", function (){ if (window.navigator.onLine === true){ clearWarningMessage(\"_no_internet\"); }; document.querySelector(\".smartbtn-chat-main__container-socials-and-post-message-new-message-svg-label\").style.pointerEvents = \"\";});window.addEventListener(\"offline\", function (){ createWarningMessage(smartbtnI18n(\"offline_file_unavailable\"),\"_no_internet\"); document.querySelector(\".smartbtn-chat-main__container-socials-and-post-message-new-message-svg-label\").style.pointerEvents = \"none\";});function getviewPortHeight(){ return smartbtnViewportSnapshot().height;}function smartbtnViewportSnapshot(){ var viewport = window.visualViewport; var width = viewport && viewport.width ? viewport.width : window.innerWidth; var height = viewport && viewport.height ? viewport.height : window.innerHeight; var top = viewport && viewport.offsetTop ? viewport.offsetTop : 0; return { width: Math.max(0, Math.round(width)), top: Math.max(0, Math.round(top)), height: Math.max(0, Math.round(height)) };}var SMARTBTN_HOST_SCROLL_LOCK_CLASS = \"smartbtn_widget_host_scroll_lock\";var smartbtnHostScrollState = null;function smartbtnWindowScrollX(){ if (typeof window.scrollX === \"number\") { return window.scrollX; } return typeof window.pageXOffset === \"number\" ? window.pageXOffset : 0;}function smartbtnWindowScrollY(){ if (typeof window.scrollY === \"number\") { return window.scrollY; } return typeof window.pageYOffset === \"number\" ? window.pageYOffset : 0;}function smartbtnLockHostScroll(){ if (screen.width > 480 || smartbtnHostScrollState !== null) { return; } var root = document.documentElement || document.querySelector(\"html\"); var body = document.body; smartbtnHostScrollState = { x: Math.round(smartbtnWindowScrollX()), y: Math.round(smartbtnWindowScrollY()), root: root, body: body, rootHadLock: Boolean(root && root.classList.contains(SMARTBTN_HOST_SCROLL_LOCK_CLASS)), bodyHadLock: Boolean(body && body.classList.contains(SMARTBTN_HOST_SCROLL_LOCK_CLASS)) }; if (root && !smartbtnHostScrollState.rootHadLock) { root.classList.add(SMARTBTN_HOST_SCROLL_LOCK_CLASS); } if (body && !smartbtnHostScrollState.bodyHadLock) { body.classList.add(SMARTBTN_HOST_SCROLL_LOCK_CLASS); }}function smartbtnUnlockHostScroll(){ if (smartbtnHostScrollState === null) { return; } var state = smartbtnHostScrollState; smartbtnHostScrollState = null; if (state.root && !state.rootHadLock) { state.root.classList.remove(SMARTBTN_HOST_SCROLL_LOCK_CLASS); } if (state.body && !state.bodyHadLock) { state.body.classList.remove(SMARTBTN_HOST_SCROLL_LOCK_CLASS); } if (Math.abs(smartbtnWindowScrollX() - state.x) > 2 || Math.abs(smartbtnWindowScrollY() - state.y) > 2) { window.scrollTo(state.x, state.y); }}var smartbtnLastGeomSignature = null;var smartbtnLastGeomHeight = null;var smartbtnViewportSettleTimer = null;var smartbtnPinHistoryPending = null;var smartbtnHistoryWriting = false;var smartbtnAnchorLastTop = null;var smartbtnAnchorLastHeight = null;var smartbtnViewportListenersAttached = false;var smartbtnViewportStyleState = null;var smartbtnViewportBaselineWidth = null;var smartbtnViewportBaselineHeight = null;var smartbtnKeyboardVisibleState = false;
16function smartbtnCaptureViewportBaseline(snapshot){ if (screen.width > 480) { return; } smartbtnViewportBaselineWidth = snapshot.width; smartbtnViewportBaselineHeight = snapshot.height;}function smartbtnKeyboardEligibleElement(element){ var view = document.querySelector(\"#smartbtn_widget_view\"); if (!element || !view || typeof view.contains !== \"function\" || !view.contains(element)) { return false; } return typeof element.matches === \"function\" && element.matches(\"input, textarea, [contenteditable='true']\");}function smartbtnUpdateKeyboardState(snapshot){ var current = snapshot || smartbtnViewportSnapshot(); var focusActive = smartbtnKeyboardEligibleElement(document.activeElement); if (!focusActive) { smartbtnCaptureViewportBaseline(current); smartbtnKeyboardVisibleState = false; return false; } if (smartbtnViewportBaselineWidth === null) { smartbtnCaptureViewportBaseline(current); smartbtnKeyboardVisibleState = false; return false; } if (Math.abs(current.width - smartbtnViewportBaselineWidth) > 1) { smartbtnViewportBaselineWidth = current.width; smartbtnViewportBaselineHeight = null; return smartbtnKeyboardVisibleState; } if (smartbtnViewportBaselineHeight === null) { return smartbtnKeyboardVisibleState; } var contraction = smartbtnViewportBaselineHeight - current.height; var enterThreshold = Math.max(150, smartbtnViewportBaselineHeight * 0.30); var exitThreshold = Math.max(80, smartbtnViewportBaselineHeight * 0.15); if (smartbtnKeyboardVisibleState) { if (contraction < exitThreshold) { smartbtnKeyboardVisibleState = false; } }else if (contraction > enterThreshold) { smartbtnKeyboardVisibleState = true; } return smartbtnKeyboardVisibleState;}function smartbtnKeyboardIsVisible(){ return smartbtnKeyboardVisibleState;}function smartbtnCaptureViewportStyles(){ if (smartbtnViewportStyleState !== null) { return; } var view = document.querySelector(\"#smartbtn_widget_view\"); var width = document.querySelector(\".new_smartbtn_widget_view_width\"); var pseudo = document.querySelector(\".new_smartbtn_widget-pseudo-scroll-9999999998\"); smartbtnViewportStyleState = { view: view, width: width, pseudo: pseudo, viewTop: view ? view.style.top : \"\", viewHeight: view ? view.style.height : \"\", viewB
16ottom: view ? view.style.bottom : \"\", widthTop: width ? width.style.top : \"\", widthHeight: width ? width.style.height : \"\", pseudoTop: pseudo ? pseudo.style.top : \"\", pseudoHeight: pseudo ? pseudo.style.height : \"\" };}function smartbtnRestoreViewportStyles(){ if (smartbtnViewportStyleState === null) { return; } var state = smartbtnViewportStyleState; smartbtnViewportStyleState = null; if (state.view) { state.view.style.top = state.viewTop; state.view.style.height = state.viewHeight; state.view.style.bottom = state.viewBottom; } if (state.width) { state.width.style.top = state.widthTop; state.width.style.height = state.widthHeight; } if (state.pseudo) { state.pseudo.style.top = state.pseudoTop; state.pseudo.style.height = state.pseudoHeight; }}function smartbtnWriteViewportSnapshot(snapshot){ if (snapshot.top === smartbtnAnchorLastTop && snapshot.height === smartbtnAnchorLastHeight) { return false; } smartbtnCaptureViewportStyles(); smartbtnAnchorLastTop = snapshot.top; smartbtnAnchorLastHeight = snapshot.height; var top = snapshot.top + \"px\"; var height = snapshot.height + \"px\"; var view = document.querySelector(\"#smartbtn_widget_view\"); var width = document.querySelector(\".new_smartbtn_widget_view_width\"); var pseudo = document.querySelector(\".new_smartbtn_widget-pseudo-scroll-9999999998\"); if (view) { view.style.top = top; view.style.height = height; view.style.bottom = \"auto\"; } if (width) { width.style.top = top; width.style.height = height; } if (pseudo) { pseudo.style.top = top; pseudo.style.height = height; } return true;}function setCSSInitWidget(e = null, viewportSnapshot = null){ let header = document.querySelector(\".new_smartbtn_widget_view__header\"); let chat = document.querySelector(\"#js-smartbtn-chat-box\"); let btns = chat.previousElementSibling; let sender = document.querySelector(\".smartbtn-chat-main__container-socials-and-post-message\"); let childSender = document.querySelector(\".smartbtn-chat-main__container-socials-and-post-message-new-message-svg\"); let heightChat = 0; let smartbtnKeepBottom = false; if (smartbtnPinHistoryPending !== null){ smartbtnKeepBottom = smartbtnPinHistoryPending; }else if (chat && (chat.scrollHeight - chat.scrollTop - chat.clientHeight) < 50){ smartbtnKeepBottom = true; } if (screen.width <= 480){ var snapshot = viewportSnapshot || smartbtnViewportSnapshot(); var smartbtnGeomHeight = snapshot.height; var smartbtnGeomKeyboard = smartbtnUpdateKeyboardState(snapshot); var smartbtnGeomSender = (childSender.style.display != \"none\"); var smartbtnGeomTabs = (btns && window.getComputedStyle(btns).display != \"none\"); var smartbtnGeomSignature = smartbtnGeomKeyboard + \"|\" + smartbtnGeomSender + \"|\" + smartbtnGeomTabs + \"|\" + snapshot.top; if (e === null && smartbtnGeomSignature === smartbtnLastGeomSignature && smartbtnLastGeomHeight !== null && Math.abs(smartbtnGeomHeight - smartbtnLastGeomHeight) <= 1) { return; } smartbtnLastGeomSignature = smartbtnGeomSignature; smartbtnLastGeomHeight = smartbtnGeomHeight; header.style.display = \"flex\"; smartbtnWriteViewportSnapshot(snapshot); header.style.height = `${HEIGHT_HEADER}px`; let heightTab = 0; if (btns && window.getComputedStyle(btns).display != \"none\"){ btns.style.height = `${HEIGHT_TAB}px`; heightTab = HEIGHT_TAB; } let heightHeader = 0; if (header.style.display != \"none\"){ heightHeader = HEIGHT_HEADER; } let heightSender = 0; if (childSender.style.display != \"none\"){ heightSender = HEIGHT_SENDER; sender.style.height = `${HEIGHT_SENDER}px`; }else{ heightSender = HEIGHT_SENDER_SMALL; sender.style.height = `${HEIGHT_SENDER_SMALL}px`; } heightChat = snapshot.height - heightSender - heightTab - heightHeader; elementS = document.querySelectorAll(\".smartbtn-chat-main__container-chat\");
16 if (e){ elementS.forEach((el) => { let heightEl = heightChat; if (e.attributes.dataBtn.value == el.attributes.dataBtnContainer.value && el.attributes.dataBtnContainer.value !== \"map\"){ el.style.height = heightEl + \"px\"; } }); }else{ elementS.forEach(el => { let heightEl = heightChat; if (el.classList.contains(\"smartbtn-chat-main__container-active-box\") && el.attributes.dataBtnContainer.value !== \"map\"){ el.style.height = heightEl + \"px\"; } }); } if (smartbtnKeepBottom && chat){ smartbtnHistoryWriting = true; chat.scrollTop = chat.scrollHeight; smartbtnHistoryWriting = false; } newSmartbtnWidgetSetHeightMapDevice(heightChat, smartbtnGeomKeyboard); }}function smartbtnRefreshViewportHeight(viewportSnapshot = null) { if (document.querySelector(\"#smartbtn_widget_view\").classList.contains(\"new_smartbtn_widget_view--opened\")) { setCSSInitWidget(null, viewportSnapshot || smartbtnViewportSnapshot()); }}function smartbtnAnchorViewportFast(viewportSnapshot = null) { if (screen.width > 480 || !smartbtnViewportListenersAttached) { return; } var view = document.querySelector(\"#smartbtn_widget_view\"); if (!view || !view.classList.contains(\"new_smartbtn_widget_view--opened\")) { return; } smartbtnWriteViewportSnapshot(viewportSnapshot || smartbtnViewportSnapshot());}function smartbtnResetViewportAnchor() { smartbtnAnchorLastTop = null; smartbtnAnchorLastHeight = null; smartbtnLastGeomSignature = null; smartbtnLastGeomHeight = null; smartbtnPinHistoryPending = null; smartbtnViewportBaselineWidth = null; smartbtnViewportBaselineHeight = null; smartbtnKeyboardVisibleState = false;}function smartbtnScheduleViewportRefresh() { if (!smartbtnViewportListenersAttached) { return; } var snapshot = smartbtnViewportSnapshot(); smartbtnAnchorViewportFast(snapshot); if (smartbtnViewportSettleTimer !== null) { clearTimeout(smartbtnViewportSettleTimer); } smartbtnViewportSettleTimer = setTimeout(function () { smartbtnViewportSettleTimer = null; if (!smartbtnViewportListenersAttached) { return; } var settledSnapshot = smartbtnViewportSnapshot(); smartbtnRefreshViewportHeight(settledSnapshot); var messageField = document.querySelector(\"#js-smartbtn-message\"); var keyboardDown = !smartbtnKeyboardIsVisible(); if (keyboardDown && document.activeElement !== messageField) { smartbtnPinHistoryPending = null; } }, 120);}function smartbtnAttachViewportListeners(){ if (screen.width > 480 || smartbtnViewportListenersAttached) { return; } smartbtnViewportListenersAttached = true; smartbtnCaptureViewportStyles(); if (window.visualViewport) { window.visualViewport.addEventListener(\"resize\", smartbtnScheduleViewportRefresh); window.visualViewport.addEventListener(\"scroll\", smartbtnScheduleViewportRefresh); } else { window.addEventListener(\"resize\", smartbtnScheduleViewportRefresh); }}function smartbtnDetachViewportListeners(){ if (!smartbtnViewportListenersAttached) { return; } smartbtnViewportListenersAttached = false; if (window.visualViewport) { window.visualViewport.removeEventListener(\"resize\", smartbtnScheduleViewportRefresh); window.visualViewport.removeEventListener(\"scroll\", smartbtnScheduleViewportRefresh); } else { window.removeEventListener(\"resize\", smartbtnScheduleViewportRefresh); } if (smartbtnViewportSettleTimer !== null) { clearTimeout(smartbtnViewportSettleTimer); smartbtnViewportSettleTimer = null; }}if (document.querySelector(\"#js-smartbtn-chat-box\")) { document.querySelector(\"#js-smartbtn-chat-box\").addEventListener(\"scroll\", function () { if (smartbtnHistoryWriting || smartbtnPinHistoryPending === null) { return; } var chat = document.querySelector(\"#js-smartbtn-chat-box\"); smartbtnPinHistoryPending = (chat.scrollHeight - chat.scrollTop - chat.clientHeight) < 50; });}function smartbtnCaptureHistoryAnchor() { var chat = document.querySelector(\"#js-smartbtn-chat-box\"); if (!chat) { return; } smartbtnPinHistoryPending = (chat.scrollHeight - chat.scrollTop - chat.clientHeight) < 50;}if (document.querySelector(\"#js-smartbtn-message\")) { document.querySelector(\"#js-smartbtn-message\").addEventListener(\"focus\", smartbtnCaptureHistoryAnchor, true); document.querySelector(\"#js-smartbtn-message\").addEventListener(\"blur\", smartbtnCaptureHistoryAnchor, true);}let SmartBtnClient = Cookies.get(\"SmartBtnClient\");const changedTitleFn = function (title) { \/* Scrolls an alert through the host page's <title> while an incoming message is unread. The host title is deliberately NOT frozen at widget-injection time: a single-page-app router, a marketing script or a second widget can change it at any moment, and restoring a stale snapshot over their title would be worse than not restoring at all. Instead we remember the exact string we last wrote, and treat any other value we find as the new host title. Whether the alert is currently on screen is tracked as internal state rather than
16inferred by comparing document.title, which cannot tell \"we are showing the alert\" apart from \"somebody else changed the title\". *\/ let hostTitle = document.title; let newTitle = title; let changedInterval = null; let positionTitle = 0; let ownWrite = null; let showingAlert = false; const syncHostTitle = function () { if (document.title !== ownWrite) { hostTitle = document.title; showingAlert = false; } }; const writeTitle = function (value) { ownWrite = value; document.title = value; }; const scrollTitle = function () { if (!newTitle) { return; } writeTitle(newTitle.substring(positionTitle, newTitle.length) + newTitle.substring(0, positionTitle)); showingAlert = true; positionTitle += 3; if (positionTitle >= newTitle.length) { positionTitle = 0; } }; const restoreTitle = function () { writeTitle(hostTitle); showingAlert = false; }; return { change: function () { syncHostTitle(); if (!changedInterval) { changedInterval = setInterval(function () { syncHostTitle(); if (showingAlert) { restoreTitle(); } else { scrollTitle(); } }, 800); } }, default: function () { if (changedInterval) { clearInterval(changedInterval); changedInterval = null; positionTitle = 0; } if (showingAlert) { restoreTitle(); } }, setTitle: function (title) { newTitle = title; } };};\/* Is the visitor looking at the conversation right now? The first two checks are exactly what callbackReadMessage() requires before it will send a read receipt; the third is what keeps a receipt sent for a background tab from counting as a human having seen anything. *\/function smartbtnVisitorIsReadingChat() { const view = document.querySelector(\"#smartbtn_widget_view\"); if (!view || !view.classList.contains(\"new_smartbtn_widget_view--opened\")) { return false; } if (typeof currentTab !== \"undefined\" && currentTab !== \"chat\") { return false; } return document.hidden !== true;}\/* Coming back to the tab with the conversation open is the visitor seeing it. Without this the announcement would keep running until they happened to scroll the transcript, since the read receipt that normally stops it is only re-evaluated on scroll. callbackReadMessage() is called first so the server is told too, and default() is idempotent. *\/document.addEventListener(\"visibilitychange\", function () { if (document.hidden) { return; } if (typeof callbackReadMessage === \"function\") { callbackReadMessage(); } if (smartbtnVisitorIsReadingChat()) { changedTitle.default(); }});const changedTitle = changedTitleFn(smartbtnI18n(\"new_operator_message_title\"));var smartBtnWidgetCountPressMap = -1;var myTimerMessageHeart=null;function clickSeeMap() { var elementSmartBtnWidgetMap = document.querySelector(\".new_smartbtn_widget_view__map\"); var elementIconMap = document.querySelector(\"#newSmartbtnWidgetRouteMap\"); smartBtnWidgetCountPressMap = smartBtnWidgetCountPressMap + 1; if((smartBtnWidgetCountPressMap %2) === 0){ elementSmartBtnWidgetMap.style.display = \"flex\"; elementIconMap.classList.add(\"new_smartbtn_widget_route_close\"); }else{ elementSmartBtnWidgetMap.style.display = \"none\"; elementIconMap.classList.remove(\"new_smartbtn_widget_route_close\"); }}loadScript(\"https:\/\/api-maps.yandex.ru\/2.1\/?apikey=c90da2b4-73e7-4cb1-ae64-b57a3b25a025&lang=\" + (local === \"ru\" ? \"ru-RU\" : \"en_US\") + \"&loadByRequire=1\", function(){ ymaps.load(init);});var indexMap = -1;var comingPlacemark = JSON.parse(test);var myMap = null;function loadScript(url, callback){ var script = document.createElement(\"script\"); if (script.readyState){ script.onreadystatechange = function(){ if (script.readyState == \"loaded\" || script.readyState == \"complete\"){ script.onreadystatechange = null; callback(); } }; } else { script.onload = function(){ callback(); }; } script.src = url; script.type = \"text\/javascript\"; document.head.appendChild(script);}
16function init() { var countRout = comingPlacemark.length; var myPlacemark; var myPlacemarkArray = []; var geolocation = ymaps.geolocation; var listItemBox = []; var storageColor = [\"blue\", \"red\", \"night\", \"pink\", \"gray\", \"brown\", \"violet\", \"black\", \"yellow\", \"green\", \"orange\", \"olive\"]; var storageColorRGBA = [\"#0000FF\", \"#FF0000\", \"#800080\", \"#FFC0CB\", \"#808080\", \"#8B4513\", \"#EE82EE\", \"#000000\", \"#FFFF00\", \"#008000\", \"#FFA500\", \"#808000\"]; var ListBoxLayout = ymaps.templateLayoutFactory.createClass( \"<button id=\\'my-listbox-header\\' class=\\'btn btn-success dropdown-toggle\\' data-toggle=\\'dropdown\\'>\" + \"{{data.title}} <span class=\\'caret\\'><\/span>\" + \"<\/button>\" + \"<ul id=\\'my-listbox\\'\" + \" class=\\'dropdown-menu\\' role=\\'menu\\' aria-labelledby=\\'dropdownMenu\\'\" + \" style=\\'display: {% if state.expanded %}block{% else %}none{% endif %};\\'><\/ul>\", { build: function() { ListBoxLayout.superclass.build.call(this); this.childContainerElement = document.querySelector(\"#my-listbox\").get(0); this.events.fire(\"childcontainerchange\", { newChildContainerElement: this.childContainerElement, oldChildContainerElement: null }); }, getChildContainerElement: function () { return this.childContainerElement; }, clear: function () { this.events.fire(\"childcontainerchange\", { newChildContainerElement: null, oldChildContainerElement: this.childContainerElement }); this.childContainerElement = null; ListBoxLayout.superclass.clear.call(this); } }); var buttonLayout = ymaps.templateLayoutFactory.createClass([ \"<div class=\\'btn\\' title=\\'\" + smartbtnI18n(\"map_locate_title\") + \"\\' style=\\'background:blue; border-radius:5px; height:28px; width:155px; padding:5px; align-item:center; color:white; justify-content:center; display:flex;align-item:center;\\' >\", \"<span style=\\'cursor:pointer; \\'>\" + smartbtnI18n(\"map_locate_short\") + \"<\/span>\", \"<\/div>\" ].join(\"\")); myMap = createMap(); myMap.container.fitToViewport(); var cityList = createListbox(); var myPlacemarkItem; myPlacemark = createPlacemark(null); var buttonAddPoint = createButtonAddPoint(); var isSetCenter = getMyLocation(); for(var i = 0; i < countRout; i++){ var inputLat = comingPlacemark[i].lat; var inputLong = comingPlacemark[i].long; if (inputLat && inputLong){ myPlacemarkItem = createPlacemark([inputLat, inputLong]); if (!isSetCenter){ myMap.setCenter([inputLat, inputLong]); } } } function getMyLocation(){ var myCoord = null; geolocation.get({ provider: \"yandex\", mapStateAutoApply: true }) .then(function (result) { myCoord = result.geoObjects.position; if(myPlacemark){ myPlacemark.geometry.setCoordinates(myCoord); getAddressGeoObject(myPlacemark); myMap.setCenter(myCoord); myMap.setZoom(8); return true; } }); return false; } function getMyLocationDetail(){ geolocation.get({ provider: \"browser\", mapStateAutoApply: true }) .then(function (result) { myCoord = result.geoObjects.position; if (myPlacemark){ myPlacemark.geometry.setCo
16ordinates(myCoord); getAddressGeoObject(myPlacemark); myMap.setCenter(myCoord); myMap.setZoom(8); return true; } }); return false; } function keyPress() { let keyNum = null; if (window.event) { keyNum = window.event.keyCode; } return keyNum; } function createListbox(){ var newList = new ymaps.control.ListBox({ data: { content: smartbtnI18n(\"map_choose_route\"), title: smartbtnI18n(\"map_choose_route\"), }, items: listItemBox, options: { } }); newList.events.add([\"select\", \"deselect\"], function(e) { var listBoxItem = e.get(\"target\"); var countListItem = cityList.getAll(); var removeIndex = myPlacemarkArray.findIndex((value) => value.properties.get(\"index\") === listBoxItem.data.get(\"index\")); if (removeIndex == 0){ } if(listBoxItem.isSelected()){ if (removeIndex > -1){ var mRoure = createMultiRoute(myPlacemarkArray[0], myPlacemarkArray[removeIndex]); myMap.geoObjects.add(mRoure); myPlacemarkArray[removeIndex].properties.set(\"mRoute\", mRoure); } }else{ if (removeIndex > -1){ var mRoute = myPlacemarkArray[removeIndex].properties.get(\"mRoute\"); if (mRoute == null){ return; } myMap.geoObjects.remove(mRoute); myPlacemarkArray[removeIndex].properties.set(\"mRoute\", null); } } }); myMap.controls.add(newList, { floatIndex: 0 ,float: \"none\", position: { right: 5, top: 95 } }); return newList; } function addListBoxItem(content, indexMap){ var selectOnClick; if (indexMap == 0){ selectOnClick = false; }else{ selectOnClick = true; } var newItem = new ymaps.control.ListBoxItem({ data: { content: content, index: indexMap, multiroute: null, idItem: `id_${indexMap}`, }, state: { selected: false, selectOnClick: selectOnClick } }); if (indexMap == 0){ newItem.disable(); } cityList.add(newItem); return newItem; } function myPlacemarkDragend(geoObject){ geoObject.events.add(\"dragend\", function () { getAddressGeoObject(geoObject); myPlacemarkArray.forEach(function (value,index) { var mRoute = value.properties.get(\"mRoute\"); if (mRoute !== null){ myMap.geoObjects.remove(mRoute); var mRoure = createMultiRoute(myPlacemarkArray[0], value); myMap.geoObjects.add(mRoure); value.properties.set(\"mRoute\", mRoure); } }) }); } function myPlacemarkClick(geoObject){ geoObject.events.add(\"click\", function (e) { e.preventDefault(); }); } function createObjectHTML(indexMap){ var elementMap = document.querySelector(\"#new_smartbtn_widget_view__map_container\"); var disabled = \"disabled\"; if (document.querySelector(`#new_smartbtn_widget_mapObject_${indexMap}`)){ return } var prefixAdres = indexMap; if (indexMap == 0){ prefixAdres = smartbtnI18n(\"map_you\") + \" \"; } if (indexMap == 0){ disabled = \"\"; } var mapRow = document.createElement(\"div\"); mapRow.className = `new_smartbtn_widget_map_${indexMap}`; mapRow.id = `new_smartbtn_widget_map_${indexMap}`; mapRow.style.display = \"flex\"; var mapIndex = document.createElement(\"div\"); mapIndex.id = `new_smartbtn_widget_mapIndex_${indexMap}`; mapIndex.style.cssText = \"float:left;color:white;display:flex;margin-left:0;margin-right:auto\"; mapIndex.textContent = prefixAdres; var routeInput = document.createElement(\"input\"); routeInput.type = \"text\"; routeInput.className = `new_smartbtn_widget_mapObject new_smartbtn_widget_mapObject_${indexMap}`; routeInput.size = 60; routeInput.id = `new_smartbtn_widget_mapObject_${indexMap}`; routeInput.name = `map[${indexMap}][route]`; routeInput.style.cssText = \"display:flex;margin-left:15px;margin-right:auto\"; routeInput.disabled = disabled === \"disabled\"; var latInput = document.createElement(\"input\"); latInput.type = \"hidden\"; latInput.className = `new_smartbtn_widget_mapObject new_smartbtn_widget_mapObject_${indexMap}_lat`; latInput.id = `new_smartbtn_widget_mapObject_${indexMap}_lat`; latInput.name = `map[${indexMap}][lat]`; var longInput = document.createElement(\"input\"); longInput.type = \"hidden\"; longInput.className = `new_smartbtn_widget_mapObject new_smartbtn_widget_mapObject_${indexMap}_long`; longInput.id = `new_smartbtn_widget_mapObject_${indexMap}_long`; longInput.name = `map[${indexMap}][long]`; mapRow.appendChild(mapIndex); mapRow.appendChild(routeInput); mapRow.appendChild(latInput); mapRow.appendChild(longInput); elementMap.appendChild(mapRow); return } function getAddressGeoObject(myGeoObject, saveElement = true) { var coords = myGeoObject.geometry.getCoordinates(); ymaps.geocode(coords) .then(function (res) { var firstGeoObject = res.geoObjects.get(0); var myAdress = firstGeoObject.getAddressLine(); var prefixAdres = myGeoObject.properties.get(\"index\"); if (prefixAdres == 0){ prefixAdres = smartbtnI18n(\"map_you\") + \" \"; }else{ prefixAdres = `${myGeoObject.properties.get(\"index\")} `; } var chastAdress = firstGeoObject.properties.get(\"metaDataProperty\").GeocoderMetaData.Address.Components.map((item) => { return item.name; }); var newAdress = chastAdress.splice(-2, 2); newAdress = newAdress.join(\",\"); myGeoObject.properties .set({ iconCaption: [ firstGeoObject.getLocalities().length ? firstGeoObject.getLocalities() : firstGeoObject.getAdministrativeAreas(), firstGeoObject.getThoroughfare() || firstGeoObject.getPremise() ] .filter(Boolean).join(\", \"), balloonContent: myAdress, adress: myAdress, hintContent: myAdress, }); if (saveElement){ var strIndex = `#${myGeoObject.properties.get(\"classMap\")}`; var elementMap = document.querySelector(strIndex); elementMap.value = myAdress; } if (myGeoObject.properties.get(\"mControls\") == null){ var newItem = addListBoxItem(prefixAdres+newAdress,indexMap); myGeoObject.properties.set(\"mControls\", newItem); }else{ myGeoObject.properties.get(\"mControls\").data.set(\"content\",prefixAdres + newAdress); } if(coords){ var strIndex = `#${myGeoObject.properties.get(\"classMap\")}`; document.querySelector(`${strIndex}_lat`).value = coords[0]; document.querySelector(`${strIndex}_long`).value = coords[1]; } }); } function getCordGeoObject(valueAdress, myGeoObject) { var strIndex = `#${myGeoObject.properties.get(\"classMap\")}`; ymaps.geocode(valueAdress) .then(function (res) { var firstGeoObject = res.geoObjects.get(0); var coord = firstGeoObject.geometry.getCoordinates(); if(coord){ document.querySelector(`${strIndex}_lat`).value = coord[0]; document.querySelector(`${strIndex}_long`).value = coord[1];
16 myGeoObject.geometry.setCoordinates(coord); }else{ return; } getAddressGeoObject(myGeoObject,false); myPlacemarkArray.forEach(function (value,index) { var mRoute = value.properties.get(\"mRoute\"); if (mRoute !== null){ myMap.geoObjects.remove(mRoute); var mRoure = createMultiRoute(myPlacemarkArray[0], value); myMap.geoObjects.add(mRoure); value.properties.set(\"mRoute\", mRoure); } }); myMap.setBounds(res.geoObjects.getBounds()); }); } function createMultiRoute(myGeoObject_A, myGeoObject_B){ var coordA = myGeoObject_A.geometry.getCoordinates(); var coordB = myGeoObject_B.geometry.getCoordinates(); var indexColorMap = myGeoObject_B.properties.get(\"index\"); var mRoute = new ymaps.multiRouter.MultiRoute({ referencePoints: [ coordA, coordB ], params: { results: 1, } }, { routeStrokeColor: storageColorRGBA[(indexColorMap%12)], routeActiveStrokeColor: storageColorRGBA[(indexColorMap%12)], wayPointVisible: false, boundsAutoApply: true }); ymaps.modules.require([ \"MultiRouteColorizer\" ], function (MultiRouteColorizer) { new MultiRouteColorizer(mRoute); } ); return mRoute; } function eventsChangeEnable(geoObject, suggestView, elementInputString){ suggestView.state.events.add(\"change\", function () { var activeIndex = suggestView.state.get(\"activeIndex\"); if (typeof activeIndex == \"number\") { var activeItem = suggestView.state.get(\"items\")[activeIndex]; if (activeItem && activeItem.value != elementInputString.value) { if (keyPress() == 13){ elementInputString.value = activeItem.value; getCordGeoObject(activeItem.value, geoObject); } } }else{ if (keyPress() == 13){ getCordGeoObject(elementInputString.value, geoObject); } } }); } function includeInMapRoute(idElementHTML, geoObject){ var elementInputString = document.querySelector(`#${idElementHTML}`); var suggestView = new ymaps.SuggestView(idElementHTML, { offset: [15, 5] }); eventsChangeEnable(geoObject,suggestView,elementInputString); } function createPlacemark(coords) { if (coords == null){ coords = [45,45]; } indexMap = indexMap + 1; var dragPlacemark = true; var iconContent = `${indexMap}`; var presetIcon; if (indexMap>0){ dragPlacemark = false; presetIcon = \"islands#blackStretchyIcon\"; }else{ iconContent = \"-\" + smartbtnI18n(\"map_you\") + \"-\"; presetIcon = \"islands#blueStretchyIcon\"; } var stringColor = storageColor[(indexMap%12)]; var geoObject = new ymaps.GeoObject({ geometry: { type: \"Point\", content: smartbtnI18n(\"map_add_point\"), coordinates: coords }, properties: { iconContent: iconContent, hintContent: smartbtnI18n(\"map_drag_hint\"), iconCaption: smartbtnI18n(\"map_search\"), adress: smartbtnI18n(\"map_address\"), coordinates: coords, index: indexMap, classMap: `new_smartbtn_widget_mapObject_${indexMap}`, idMap: `new_smartbtn_widget_map_${indexMap}`, mRoute: null, mControls: null, } }, { preset: presetIcon, iconColor: stringColor, draggable: dragPlacemark }); myPlacemarkArray.push(geoObject); var newItem = addListBoxItem(smartbtnI18n(\"map_control_item\"), indexMap); geoObject.properties.set(\"mControls\", newItem); myPlacemarkDragend(geoObject); myPlacemarkClick(geoObject); createObjectHTML(indexMap); includeInMapRoute(`new_smartbtn_widget_mapObject_${indexMap}`, geoObject); getAddressGeoObject(geoObject); myMap.geoObjects.add(geoObject); return geoObject; } function createButtonAddPoint(){ var buttonAddPoint = new ymaps.control.Button({ data: { content: \"\", title: \"\" }, options: { layout: buttonLayout, selectOnClick: false } }); buttonAddPoint.events.add(\"click\", function () { getMyLocationDetail(); }); myMap.controls.add(buttonAddPoint, { float: \"none\", position: { right: 5, top: 50 }}); return buttonAddPoint; } function createMap(){ return new ymaps.Map(\"new_smartbtn_widget_map\", { center: [60, 80], zoom: 5, }, { searchControlProvider: \"yandex#search\", buttonMaxWidth: 300 }); } function deleteYandexoptions() { const getElement = document.getElementById(\"new_smartbtn_widget_mapObject_0\"); const getPreviuesElement = getElement.previousElementSibling; getPreviuesElement.remove(); } deleteYandexoptions();}var listinerPayment = [];var paymentIndex = -1;var arrayFiles = [];var arrayImages = [];let images = [];let openConsole = true;let Socket = null;let scrollWidget = 0;const AUTHOR_TYPE_CLIENT = 1;const AUTHOR_TYPE_OPERATOR = 2;const AUTHOR_TYPE_OPERATOR_FIRST_OPEN = 3;const TYPE_MESSAGE = 0;const TYPE_PAYMENT = 1;const TYPE_FILE = 2;const TYPE_CONSOLE = 4;const TYPE_CONSOLE_GET = 5;const TYPE_WIDGETCLOSE = 10;const TYPE_LOCATION_BACK = 12;const TYPE_SERVICE_ONLINE_OPERATORS = \"countOnlineOperators\";const TYPE_SERVICE_WIDGET_CLOSE = \"widgetClose\";const TYPE_SERVICE_OPERATOR_WRITE = \"operatorWrite\";const TYPE_CALLBACK = 25;const TYPE_SERVICE_CALLBACK = \"callBackWidget\";const TYPE_SERVICE_LOCATION = \"location\";const TYPE_SERVICE_INDICATOR_CLIENT_READY_MESSAGES = \"indicatorClientReadyMessages\";const TYPE_INDICATOR_CLIENT_READY_MESSAGES = 80;let getHistory = false;let myTimerMessageOperatorWrite = null;let myTimerOperatorOnline = null;const sound = new Audio(\"https:\/\/smartbtn.ru\/sounds\/notification.mp3\");let widgetLocation = {};let currentTab = \"chat\";let operatorsCount;let humanOperatorsCount = 0;let currentOperatorAvatar;let openWidget = JSON.parse(\"0\");let openOperatorWidgetRating = JSON.parse(\"300\");let input = document.querySelector(\"#js-smartbtn-message\");let inputNoOperator = document.querySelector(\"#js-chat-call-back-btn-message_no_operator\");let firstStaffMessage = 0;let hadPriorOperatorMessage = false;let clientHasHistory = false;let clientTypedMessage = \"\";function normalizeHumanOperatorsCount(value) { let count = Number(value); return Number.isFinite(count) && count > 0 ? count : 0;}\/* Optimistic-echo reconciliation queue (fix\/widget-optimistic-echo): FIFO of {localId, node} entries for the client's own text messages rendered instantly on send, before the server's WS echo confirms them. Consumed oldest-first in wsMessage() when the matching live text echo arrives. *\/let pendingClientEchoes = [];let operatorRatingStarsCount;let enableToShowRating = false;let avatarOperatorsOnline = [{\"name\":\"AI-\\u0430\\u0441\\u0441\\u0438\\u0441\\u0442\\u0435\\u043d\\u0442\",\"ava\":\"https:\\\/\\\/smartbtn.ru\\\/storage\\\/2331c204150c0fab02304984d6dc330a\\\/imageOperator\\\/10\\\/YfVkfiAy1EmIEjqj6phjWEInby6bOI34Y5f9G3E9.pngChatGPT_Image_Jul_11,_2026,_06_29_23_PM.png\",\"id\":10},{\"name\":\"\\u0415\\u0432\\u0433\\u0435\\u043d\\u0438\\u0439\",\"ava\":\"https:\\\/\\\/smartbtn.ru\\\/storage\\\/2331c204150c0fab02304984d6dc330a\\\/imageOperator\\\/1\\\/vKap8pGueFsfF2194JqrDmMaePNdsGQV9R5h5heV.pngChatGPT_Image_Jul_11,_2026,_06_15_49_PM.png\",\"id\":1}];let aiOperatorId = 10;\/* feat SB-FEAT-AI-SELECT: ids of ALL AI operators shown in the header (not just the first). Lets a click on any AI avatar be recognised as an AI request, and lets the client tell the server WHICH AI was chosen (selectedAiOperatorId below) so that specific assistant answers instead of the button default. *\/let aiOperatorIds = [10];if (!Array.isArray(aiOperatorIds)){ aiOperatorIds = []; }let selectedAiOperatorId = 0;let operatorAvatarById = {};let operatorPresenceById = {};avatarOperatorsOnline.forEach((candidate) => { if (candidate && candidate.id && String(candidate.id) !== \"0\" && candidate.ava){ operatorAvatarById[String(candidate.id)] = candidate.ava; }});\/* Messages and ratings must resolve the SAME operator's image. The latest writer's global avatar is not a fallback for another operator's identity. *\/function smartbtnResolveOperatorAvatar(operatorId, explicitAvatar){ if (explicitAvatar){ return explicitAvatar; } return operatorAvatarById[String(operatorId)] || \"https:\/\/smartbtn.ru\/assets\/smartbtn\/img\/default-avatar.png\";}function fSetWidgetOperatorPresence(slotImgElement, online){ const dot = slotImgElement.querySelector(\".smartbtn-chat-main__container-head-operators-one-operator-status\"); if (dot){ dot.style.display = typeof online === \"boolean\" ? \"\" : \"none\"; dot.classList.toggle(\"smartbtn-chat-main__container-head-operators-one-operator-status-online\", online === true); }}let lastOperatorId = 0;\/* Set when the client clicks an operator avatar in the header row; sent once on the next join so the server can try to route the room to that operator with priority, then cleared. 0 = no preference (also the fake-filler id, see the \"Fake fillers share id 0\" comment below). *\/let preferredOperatorId = 0;\/* REQ-3: set true when the client explicitly asks to reach a human operator (the \"call operator\" control, or picking a specific operator avatar). Sent as a boolean on the same frames that carry preferredOperatorId, then cleared. The server marks the room so the AI steps back and routes it to a human. *\/let humanRequested = false;\/* Symmetric counterpart to humanRequested: set true when the client clicks the AI's OWN avatar in the header row (explicitly re-choosing the AI, not just any operator). Sent once on the next frame so the server can give the AI immediate-reply priority instead of the human-wait fast path, then cleared. *\/let aiRequested = false;let myTimerRatingTitle = null;let messageGreetingElement = document.querySelector(\".new_smartbtn_widget_operator-message_greeting .new_smartbtn_widget_operator-message__message\");var messageGreeting = messageGreetingElement ? messageGreetingElement.textContent : \"\\u0414\\u043e\\u0431\\u0440\\u044b\\u0439 \\u0434\\u0435\\u043d\\u044c, \\u0447\\u0435\\u043c \\u043c\\u043e\\u0433\\u0443 \\u043f\\u043e\\u043c\\u043e\\u0447\\u044c\";let isLoadWidget = false;let isServerConnect = false;let widgetButtonOperatorIndicatorReady = \"1\";const INDICATOR_READY = `<svg width=\"27\" height=\"15\" viewBox=\"0 0 300 230\" fill=\"red\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"> <g transform=\"rotate(-45 50 150)\" stroke-width=\"2\" stroke-linejoin=\"round\"> <polygon points=\"40,110 40,210 240,210 240,180 70,180 70,110 40,110\" fill=\"red\" stroke=\"black\" \/> <polygon points=\"90,230 90,260 290,260 290,230 90,230 \" fill=\"red\" stroke=\"black\" \/> <\/g> <\/svg>`;const INDICATOR_NOT_READY = `<svg width=\"27\" height=\"15\" viewBox=\"0 0 300 230\" fill=\"red\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"> <g transform=\"rotate(-45 50 150)\" stroke-width=\"2\" stroke-linejoin=\"round\"> <polygon points=\"40,110 40,210 240,210 240,180 70,180 70,110 40,110\" fill=\"red\" stroke=\"black\" \/> <\/g> <\/svg>`;let workedOnce = false;\/* Websocket header values are cached only inside the current widget, locale and policy revision. This prevents one embedded widget from borrowing another widget's copy and makes every language switch deterministic. *\/let widgetHeaderFreshFromSocket = {greeting: false, name: false, signature: false};let widgetHeaderFieldNames = { greeting: \"widget_greeting\", name: \"
16widget_name\", signature: \"widget_signature\"};let myTimerStaleWidgetHeader = null;function fIsBrokenWidgetHeaderCache(value){ return (!value || value === \"undefined\" || value === \"null\" || String(value).trim() === \"\");}function smartbtnSetHeaderField(field, value){ if (fIsBrokenWidgetHeaderCache(value)) { return; } var selector = \"[data-smartbtn-text-field=\\\"\" + field + \"\\\"]\"; var element = document.querySelector(selector); if (element) { element.textContent = value; } if (field === \"widget_greeting\") { messageGreeting = value; \/* D-05: the assistant projection is never in this generic header cache (its key carries no assistant identity\/version), so every generic greeting rewrite -- socket header push, stale-cache drop, locale switch -- must reapply the current assistant's text right after. A no-op while no assistant has authority; see the smartbtnApplyTextFields() typeof note above for why this checks first. *\/ if (typeof smartbtnAssistantApplyProjection === \"function\") { smartbtnAssistantApplyProjection(); } }}Object.keys(widgetHeaderFieldNames).forEach(function (name) { var field = widgetHeaderFieldNames[name]; var cached = smartbtnReadHeaderCache(field, local, smartbtnLanguageRuntime.revision); if (!fIsBrokenWidgetHeaderCache(cached)) { smartbtnSetHeaderField(field, cached); }});function dropStaleWidgetHeaderCache(){ Object.keys(widgetHeaderFieldNames).forEach(function (name) { if (!widgetHeaderFreshFromSocket[name]) { var field = widgetHeaderFieldNames[name]; try { localStorage.removeItem(smartbtnHeaderCacheKey(field, local, smartbtnLanguageRuntime.revision)); } catch (smartbtnHeaderStorageError) { return; } smartbtnSetHeaderField(field, smartbtnResolveTextField(field, local)); } });}\/* Only operators confirmed online (countOnlineOperators socket event) are shown: the first countOperator slots become visible, the rest are hidden and the whole row collapses when nobody is online. Show is done with an empty inline display so the mobile\/short-screen media rules that hide the row keep working. *\/function fUpdateWidgetOperatorsRowVisibility(countOperator){ const rowElement = document.getElementById(\"smartbtn_widget_head_operators_row\"); if (!rowElement){ return; } const slotElements = rowElement.querySelectorAll(\".smartbtn-chat-main__container-head-operators-one-operator\"); \/* feat SB-FEAT-HEADER-SLOTS: every rendered slot is now a REAL operator flagged show_in_header=1 (no fake fillers), so when anyone is online we reveal them ALL and let the row scroll horizontally. The socket count is capped at 3 upstream and no longer bounds how many identities we show -- it only tells us whether at least one operator is online. The whole row still collapses when nobody is online. *\/ const anyoneOnline = !!countOperator && countOperator > 0; slotElements.forEach((slotElement) => { slotElement.style.display = anyoneOnline ? \"\" : \"none\"; }); rowElement.style.display = (anyoneOnline && slotElements.length > 0) ? \"\" : \"none\";}function fSetWidgetOperatorSlot(slotImgElement, operatorId, operatorAva, operatorName){ if (!slotImgElement || !slotImgElement.attributes || !slotImgElement.attributes.dataId){ return; } if (operatorId !== null && operatorId !== undefined){ slotImgElement.attributes.dataId.value = operatorId; } slotImgElement.style.backgroundImage = `url(\"${smartbtnResolveOperatorAvatar(operatorId, operatorAva)}\")`; fSetWidgetOperatorPresence(slotImgElement, operatorPresenceById[String(operatorId)]); if (operatorName){ const elementName = slotImgElement.parentElement ? slotImgElement.parentElement.querySelector(\".smartbtn-chat-main__container-head-operators-one-operator-name\") : null; if (elementName){ elementName.innerText = operatorName; } }}\/* Each of the up to 3 header slots is server-rendered with a dataId reflecting WidgetController's $onlineOperators build (the AI's real id in its own slot when available, real human ids in theirs, \"0\" for fake fillers). Given an operator-authored message's sender_id, find the slot that already represents that sender instead of always assuming slot 0 -- otherwise an AI message and a human message reaching the same room would fight over one slot and flicker between identities. *\/function fFindWidgetOperatorSlotIndex(elementImage, senderId){ const senderIdStr = String(senderId); \/* 1) A slot already showing this exact operator id -- the common case once the page has loaded: update that sender's own, stable slot. *\/ for (let i = 0; i < elementImage.length; i++){ const el = elementImage[i]; if (el && el.attributes && el.attributes.dataId && String(el.attributes.dataId.value) === senderIdStr){ return i; } } \/* 2) No slot currently represents this sender (a genuinely new participant not present in the initial snapshot -- e.g. a human operator coming online for the first time in a room that had zero online humans at page load
16): claim the first fake-filler slot (dataId \"0\"), safe to repurpose, rather than stomping a real slot. *\/ for (let i = 0; i < elementImage.length; i++){ const el = elementImage[i]; if (el && el.attributes && el.attributes.dataId && String(el.attributes.dataId.value) === \"0\"){ return i; } } \/* 3) Every slot is already a real, distinct operator and none match: -1 tells the caller to APPEND a brand-new slot (fAppendWidgetOperatorSlot) instead of overwriting an unrelated existing one -- SB-FEAT-HEADER-SLOTS removed the fake fillers this used to be able to repurpose, so the old \"update the last slot\" fallback would silently steal e.g. the AI's own avatar the first time a human writes in a room. *\/ return -1;}\/* Moves the subtle \"active operator\" ring (CSS box-shadow class) onto activeElement and off every sibling slot in elementImage -- shared by both the click handler (immediate feedback on an explicit pick) and the wsMessage routing below (follows whoever actually sends the next message, including automatic AI<->human handoffs). *\/function fSetWidgetOperatorActiveSlot(elementImage, activeElement){ elementImage.forEach((el) => { if (!el || !el.classList){ return; } el.classList.toggle(\"smartbtn-chat-main__container-head-operators-one-operator-img--active\", el === activeElement); });}\/* Clicking an avatar in the operator row remembers that operator as the client's preferred pick (real operators only - id 0 is the generic filler, see fSetWidgetOperatorSlot callers above) and switches to the chat tab by reusing the existing tab button exactly as a real click on it would - no separate open\/switch logic duplicated here. *\/function fWidgetOperatorSlotClickHandler(){ if (!this.attributes || !this.attributes.dataId){ return; } fSetWidgetOperatorActiveSlot( document.querySelectorAll(\".smartbtn-chat-main__container-head-operators-one-operator-img\"), this ); const clickedOperatorId = Number(this.attributes.dataId.value) || 0; if (clickedOperatorId){ if (aiOperatorIds.indexOf(clickedOperatorId) !== -1){ \/* Clicking ANY AI operator's avatar (feat SB-FEAT-AI-SELECT: the whole aiOperatorIds set now, not only the first AI id) is the symmetric opposite of picking a human: it must NOT set humanRequested\/preferredOperatorId (those route to the human-wait fast path server-side) -- it asks for the AI to answer now, and selectedAiOperatorId records WHICH AI so the server pins that specific assistant instead of the button default. *\/ aiRequested = true; selectedAiOperatorId = clickedOperatorId; } else { preferredOperatorId = clickedOperatorId; \/* REQ-3: picking a specific human operator IS \"choosing a human\" -- so imply an explicit human request. Carried on the next frame alongside preferredOperatorId. *\/ humanRequested = true; } } const chatTabButton = document.getElementById(\"smartbtn-chat-main__container-btns__btn_call__chat_widget\"); if (chatTabButton){ smartbtnOpenWindowAndBtn(chatTabButton); }}document.querySelectorAll(\".smartbtn-chat-main__container-head-operators-one-operator-img\").forEach((operatorSlotElement) => { operatorSlotElement.addEventListener(\"click\", fWidgetOperatorSlotClickHandler);});\/* Appends a brand-new header slot by cloning the FIRST existing slot's whole container (not just the inner image), so the mobile\/short-screen CSS rules that target the full class chain keep applying, then binds the same click handler page-load slots get. Returns the new slot's -img element, still unpopulated (caller fills id\/avatar\/name via fSetWidgetOperatorSlot) -- or null when there is no row, or no template slot to clone from, so a caller can fail safe and simply skip that operator. *\/function fAppendWidgetOperatorSlot(){ const rowElement = document.getElementById(\"smartbtn_widget_head_operators_row\"); if (!rowElement){ return null; } const templateSlot = rowElement.querySelector(\".smartbtn-chat-main__container-head-operators-one-operator\"); if (!templateSlot){ return null; } const newSlot = templateSlot.cloneNode(true); const newImg = newSlot.querySelector(\".smartbtn-chat-main__container-head-operators-one-operator-img\"); if (!newImg){ return null; } newImg.classList.remove(\"smartbtn-chat-main__container-head-operators-one-operator-img--active\"); const newStatusDot = newSlot.querySelector(\".smartbtn-chat-main__container-head-operators-one-operator-status\"); if (newStatusDot){ \/* avoid a duplicate element id in the document -- nothing reads this id, slots are toggled by class only (see setOnlineOperator). *\/ newStatusDot.removeAttribute(\"id\"); } rowElement.appendChild(newSlot); newImg.addEventListener(\"click\", fWidgetOperatorSlotClickHandler); return newImg;}\/* Live header-identity reconciliation (fix R3): the countOnlineOperators socket frame now carries an 'operators' array ({id, name, ava, online}, the same shape as the render-time avatarOperatorsOnline snapshot) built server-side by WidgetHeaderOperatorsService for everyone currently eligible+online, so an operator who comes online AFTER page load can still appear without a reload. Reconciled as an ID DIFF, never a full rebuild: an existing slot keeps its active ring while its identity\/presence is refreshed, a new id gets an appended slot, and an id no longer present is hidden (never removed). The AI's own slot and whichever slot currently holds the active-writer ring are never hidden, even if absent from the list -- but a protected slot without a fresh individual presence signal must not retain a green dot. *\/function fReconcileWidgetHeaderOperators(operatorsList){ if (!Array.isArray(operatorsList)){ return; } const rowElement = document.getElementById(\"smartbtn_widget_head_operators_row\"); if (!rowElement){ return; } operatorPresenceById = {}; const protectedIds = {}; aiOperatorIds.forEach((aiId) => { protectedIds[String(aiId)] = true; }); const activeImg = rowElement.querySelector(\".smartbtn-chat-main__container-head-operators-one-operator-img--active\"); if (activeImg && activeImg.attributes && activeImg.attributes.dataId){ protectedIds[String(activeImg.attributes.dataId.value)] = true; } const slotById = {}; rowElement.querySelectorAll(\".smartbtn-chat-main__container-head-operators-one-operator-img\").forEach((img) => { if (img && img.attributes && img.attributes.dataId){ slotById[String(img.attributes.dataId.value)] = img; } });
16 const keepIds = {}; operatorsList.forEach((entry) => { if (!entry || entry.id === null || entry.id === undefined){ return; } const entryId = String(entry.id); keepIds[entryId] = true; operatorPresenceById[entryId] = entry.online; if (entry.ava){ operatorAvatarById[entryId] = entry.ava; } let img = slotById[entryId]; if (!img){ img = fAppendWidgetOperatorSlot(); if (!img){ return; } slotById[entryId] = img; } fSetWidgetOperatorSlot(img, entry.id, entry.ava, (entry.name) ? entry.name.split(\" \", 1)[0] : \"\"); const container = img.closest ? img.closest(\".smartbtn-chat-main__container-head-operators-one-operator\") : null; if (container){ container.style.display = \"\"; } }); Object.keys(slotById).forEach((id) => { fSetWidgetOperatorPresence(slotById[id], operatorPresenceById[id]); if (keepIds[id] || protectedIds[id]){ return; } const img = slotById[id]; const container = img.closest ? img.closest(\".smartbtn-chat-main__container-head-operators-one-operator\") : null; if (container){ container.style.display = \"none\"; } });}let wsMessage = function(e){ wsWatchdogMarkActivity(); let counterForRating = 1; let data = null; try{ data = JSON.parse(e.data); }catch (err){ let x = 1; } if (data){ }else{ return; } if (data.type === \"error\" ) { return; } var buttonPhone = document.querySelector(\"#js-phone-btn\"); var ipWidget = buttonPhone.getAttribute(\"data-ipwidget\"); let newAvatar = (data.chatMessage && data.chatMessage.avatar && data.chatMessage.sender_type == AUTHOR_TYPE_OPERATOR) ? data.chatMessage.avatar : null; let isOperatorAuthoredMessage = data.chatMessage && data.chatMessage.sender_type == AUTHOR_TYPE_OPERATOR; \/* D-05: the SAME gate that already drives header-avatar authority (never avatar clicks, header order, preferred ids, client messages or service frames) is the sole post-boot assistant-identity authority too. (typeof guard: see the smartbtnApplyTextFields() note near the top of this file.) *\/ if (isOperatorAuthoredMessage && typeof smartbtnAssistantHandleAuthoredSender === \"function\") { smartbtnAssistantHandleAuthoredSender(data.chatMessage.sender_id); } if(newAvatar){ currentOperatorAvatar = newAvatar; if (data.chatMessage && data.chatMessage.sender_id !== null && data.chatMessage.sender_id !== undefined){ operatorAvatarById[String(data.chatMessage.sender_id)] = newAvatar; } } if(isOperatorAuthoredMessage){ const elementImage = document.querySelectorAll(\".smartbtn-chat-main__container-head-operators-one-operator-img\"); if (elementImage && elementImage.length > 0){ const newName = (data.chatMessage.operator_name) ? data.chatMessage.operator_name.split(\" \", 1)[0] : \"\"; \/* Route this message's identity update to the slot that already represents this sender instead of unconditionally stomping slot 0 -- an AI message and a human message must land in their own separate, stable slots instead of fighting over one (see fFindWidgetOperatorSlotIndex). SB-FEAT-HEADER-SLOTS removed the fake fillers this used to be able to repurpose: when nothing matches, append a brand-new slot instead of overwriting the last one (that used to silently steal e.g. the AI's own avatar the first time a human writes in a room). *\/ const writerSlotIndex = fFindWidgetOperatorSlotIndex(elementImage, data.chatMessage.sender_id); const writerImgElement = (writerSlotIndex !== -1) ? elementImage[writerSlotIndex] : fAppendWidgetOperatorSlot(); if (writerImgElement){ fSetWidgetOperatorSlot(writerImgElement, data.chatMessage.sender_id, newAvatar, newName); const writerContainer = writerImgElement.closest ? writerImgElement.closest(\".smartbtn-chat-main__container-head-operators-one-operator\") : null; if (writerContainer){ writerContainer.style.display = \"\"; } const freshElementImage = document.querySelectorAll(\".smartbtn-chat-main__container-head-operators-one-operator-img\"); fSetWidgetOperatorActiveSlot(freshElementImage, writerImgElement); \/* Refill the remaining (non-writer) slots from the server list, skipping the writer (compared by element, not index -- a just-appended writer slot has no stable original index) and any operator id already placed, so the same operator can not appear twice. *\/ if (avatarOperatorsOnline && avatarOperatorsOnline.length > 0){ let slotIndex = 0; const usedOperatorIds = {}; usedOperatorIds[String(data.chatMessage.sender_id)] = true; avatarOperatorsOnline.forEach((candidate) => { if (!candidate){ return; } while (slotIndex < freshElementImage.length && freshElementImage[slotIndex] === writerImgElement){ slotIndex = slotIndex + 1; } if (slotIndex >= freshElementImage.length){ return; } const candidateId = String(candidate.id); if (usedOperatorIds[candidateId] && candidateId !== \"0\"){ return; } usedOperatorIds[candidateId] = true; fSetWidgetOperatorSlot( freshElementImage[slotIndex], candidate.id, candidate.ava, (candidate.name) ? candidate.name.split(\" \", 1)[0] : \"\" ); slotIndex = slotIndex + 1; }); } } } } if (data.chatMessage && data.chatMessage.sender_type === AUTHOR_TYPE_OPERATOR && data.chatMessage.recipient_type === AUTHOR_TYPE_CLIENT && (!data.chatMessage.history) && (data.chatMessage.message_type === TYPE_MESSAGE || data.chatMessage.message_type === TYPE_FILE || data.chatMessage.message_type === TYPE_PAYMENT) ){ enableToShowRating = true; counterForRating+=1; } if (data.chatMessage && data.chatMessage.sender_type === AUTHOR_TYPE_OPERATOR && (data.chatMessage.message_type === TYPE_MESSAGE || data.chatMessage.message_type === TYPE_FILE || data.chatMessage.message_type === TYPE_PAYMENT) ){ lastOperatorId = data.chatMessage.sender_id; } if (data.chatMessage && data.chatMessage.sender_type === AUTHOR_TYPE_CLIENT && (!data.chatMessage.history) && (data.chatMessage.message_type === TYPE_MESSAGE || data.chatMessage.message_type === TYPE_FILE || data.chatMessage.message_type === TYPE_PAYMENT) ){ if (intervalForRating){ clearTimeout(intervalForRating); intervalForRating = null; } } if (enableToShowRating === true && counterForRating > 1){ if (intervalForRating == null && openedChatForRatingShow === true){ drawRatingMessageInterval(); } } if (data.type === \"command\" && data.command === \"clientID\") { SmartBtnClient = data.clientID; Cookies.set(\"SmartBtnClient\", SmartBtnClient, {\"max-age\": 100 * 31536e3}); fGetHistory(); }else if (data.type === TYPE_SERVICE_WIDGET_CLOSE ) { const xyzc = 1; }else if (data.type === TYPE_SERVICE_INDICATOR_CLIENT_READY_MESSAGES ) { setReadAtMessage(data.chatMessage); }else if(data.type === \"rating\"){ if (data.operator_id === null){ }else{ if (data.value !== null){ operatorRatingStarsCount = data.value; } } }else if (data.type === \"message\" && data.chatMessage.command === \"toggleButton\") { document.getElementById(\"js-phone-btn\").click(); }else if (data.type === \"message\" && data.chatMessage.command === \"showRating\") { \/* External-API rate-request push: show the existing star-rating UI right now instead of waiting for its own ambient timer. Reuses createRatingMessage() unchanged -- same function drawRatingMessageInterval() already calls above, and the same submit path (rateOperator() -> {type:'rating',...} WS message, handled server-side by the pre-existing handleNewRating()). *\/ enableToShowRating = true; if (openedChatForRatingShow === true) { createRatingMessage(local); } }else if (data.type === TYPE_SERVICE_INDICATOR_CLIENT_READY_MESSAGES ) { let xyz = 1; }else if (data.type === TYPE_SERVICE_ONLINE_OPERATORS){ operatorsCount = data.chatMessage.countMember; \/* countMember includes answering AI presence to keep AI-only chat available. Only the separately reported raw human count may gate copy that promises a specialist will join. Missing\/invalid values fail closed for c
16ompatibility during rolling deploys. *\/ humanOperatorsCount = normalizeHumanOperatorsCount(data.chatMessage.humanCount); \/* A count-only\/older frame cannot prove any individual's presence. *\/ operatorPresenceById = {}; \/* R3 fix: keep the render-time avatarOperatorsOnline snapshot in sync with the live server-side list (same {id, name, ava} shape) so both this list and the writer-attribution refill logic above see the same, current set of eligible operators. Absent on an older daemon mid-rolling-deploy (Array.isArray guards both reads) -- then this is a no-op and everything below falls back to exactly today's count-only, toggle-visibility behavior. *\/ if (Array.isArray(data.chatMessage.operators)){ avatarOperatorsOnline = data.chatMessage.operators; } if (myTimerStaleWidgetHeader === null){ myTimerStaleWidgetHeader = setTimeout(dropStaleWidgetHeaderCache, 4000); } if (operatorsCount > 0){ if (myTimerOperatorOnline){ clearTimeout(myTimerOperatorOnline); } setOnlineOperator(operatorsCount); fReconcileWidgetHeaderOperators(data.chatMessage.operators); clearWarningMessage(\"_no_online_operators\"); document.getElementById(\"js-smartbtn-send-message\").style.pointerEvents = \"\"; document.querySelector(\".smartbtn-chat-main__container-socials-and-post-message-new-message-svg-label\").style.pointerEvents = \"\"; document.getElementById(\"smartbtn-chat-main__container-btns__btn_call__chat_widget\").style.pointerEvents = \"\"; if (workedOnce === false){ isOnlineOperator = false; openChatWindow(); workedOnce = true; } }else{ if (myTimerOperatorOnline){ clearTimeout(myTimerOperatorOnline); } myTimerOperatorOnline = setTimeout(()=>{ workNoOperator(operatorsCount, clientHasHistory); },5000); workedOnce = false; isOnlineOperator = true; } let msgs = localStorage.getItem(\"notSendMessagesFromClient\"); if (msgs){ let newArrayOfMsgs = null; let newArrayOfMsgsFor =[]; try{ newArrayOfMsgs = JSON.parse(msgs); newArrayOfMsgsFor = JSON.parse(msgs); }catch (err){ let x = 1; } if (newArrayOfMsgs && newArrayOfMsgs.length && newArrayOfMsgs.length > 0){ newArrayOfMsgsFor.forEach((item,index) => { if (Socket.readyState === 1) { Socket.send(smartbtnSerializeClientFrame(item)); } if (Socket.readyState === 1) { let msgOnWidget = document.getElementById(`new_smartbtn_widget_client-message_waiting-${item.id}`); if(msgOnWidget){ msgOnWidget.remove(); }; newArrayOfMsgs.splice(index,1); localStorage.setItem(\"notSendMessagesFromClient\",JSON.stringify(newArrayOfMsgs)); } }); } } } else if (data.type === TYPE_SERVICE_LOCATION) { let connectMessage = { type: TYPE_SERVICE_LOCATION, widgetID: widgetID, body: window.location.href, clientID: SmartBtnClient, messageType: TYPE_LOCATION_BACK, statistic: widgetLocation, }; getLocation(Socket, connectMessage, ipWidget); } else if (data.type === TYPE_SERVICE_OPERATOR_WRITE) { openOperatorWrite(); } else if (data.type === \"buttonName\") { setButtonNameWidget(data); } else if (data.type === \"greeting\") { setGreetingWidget(data); } else if (data.type === \"widgetSignature\") { setSignatureWidget(data); } else if (data.type === \"console\") { if (data.chatMessage && data.chatMessage.message_type && data.chatMessage.message_type === TYPE_CONSOLE_GET ) { if (data.chatMessage.body === \"close\") { openConsole = false; } else { openConsole = true; let connectMessage = { type: \"console\", widgetID: widgetID, body: input.value, clientID: SmartBtnClient, messageType: TYPE_CONSOLE, }; Socket.send(smartbtnSerializeClientFrame(connectMessage)); } } } else { let msgFile = null; if(data.chatMessage && data.chatMessage.message_type === TYPE_CALLBACK){ const callBackWidget = JSON.parse(data.chatMessage.body); data.chatMessage.body = smartbtnCallbackSummary(callBackWidget, callBackWidget.email !== null); } let body = (data.chatMessage && data.chatMessage.body) ? data.chatMessage.body : \"\"; if (data.chatMessage && data.chatMessage.urlBody){ msgFile = { urlBody: data.chatMessage.urlBody, mimeType: (data.chatMessage.mimeType) ? data.chatMessage.mimeType : null, size: (data.chatMessage.size) ? (data.chatMessage.size) : (data.chatMessage.messages_files) ? data.chatMessage.messages_files.size :null } } if (data.chatMessage && data.chatMessage.path_file ){ msgFile = { urlBody: data.chatMessage.path_file, mimeType: null, size: data.chatMessage.messages_files.size } } let newMessageTimeString = data.chatMessage.created_at; try{ let strSplitDate = String(data.chatMessage.created_at).split(\" \"); let newMessageTimeTemp = new Date(`${strSplitDate[0]}T${strSplitDate[1]}`); var x = new Date(); var currentTimeZoneOffsetInHours = x.getTimezoneOffset(); newMessageTimeTemp.setMinutes(newMessageTimeTemp.getMinutes() - currentTimeZoneOffsetInHours - 180); let ye = new Intl.DateTimeFormat(\"en-US\", { year: \"numeric\" }).format(newMessageTimeTemp); let mo = new Intl.DateTimeFormat(\"en-US\", { month: \"2-digit\" }).format(newMessageTimeTemp); mo = `0${mo}`; mo = mo.slice(-2); let da = new Intl.DateTimeFormat(\"en-US\", { day: \"2-digit\" }).format(newMessageTimeTemp); da = `0${da}`; da = da.slice(-2); let ho = new Intl.DateTimeFormat(\"en-US\", { hour: \"numeric\", hour12: false }).format(newMessageTimeTemp); if(ho == \"24\"){ ho = \"00\"; } ho = `0${ho}`; ho = ho.slice(-2); let mi = new Intl.DateTimeFormat(\"en-US\", { minute: \"numeric\" }).format(newMessageTimeTemp); mi = `0${mi}`; mi = mi.slice(-2); let se = new Intl.DateTimeFormat(\"en-US\", { second: \"numeric\" }).format(newMessageTimeTemp); se = `0${se}`; se = se.slice(-2); let created_att = `${ye}-${mo}-${da} ${ho}:${mi}:${se}`; newMessageTimeString = created_att; }catch (e){ let x = 1; } \/* fix\/widget-optimistic-echo: FIFO reconciliation. This is the server's authoritative echo of a plain-text message (message_type TYPE_MESSAGE, no attached file) from the client's own connection -- whether it arrives live (data.history === 0) or, if the socket dropped between the optimistic render and the live echo, replayed later via history (data.history === 1) on reconnect. Either way, if we optimistically rendered a bubble for it on send (see the click handler above), drop that placeholder now so the authoritative newMsg() render below doesn't leave a stuck ghost bubble alongside a second, duplicate confirmed one (ws-history-dedup: newMsg()'s id-based check alone can't find this placeholder, since it was created under a client-generated local id, not the server's real messageId). Guarded to plain text only -- file\/payment\/etc. echoes also arrive as sender_type === AUTHOR_TYPE_CLIENT here but were never pushed onto pendingClientEchoes, and must not consume\/misfire a text placeholder that is still waiting for its own echo. *\/ if (data.chatMessage.sender_type === AUTHOR_TYPE_CLIENT && data.chatMessage.message_type === TYPE_MESSAGE && !msgFile && pendingClientEchoes.length > 0) { let reconciledEcho = pendingClientEchoes.shift(); if (reconciledEcho.node && reconciledEcho.node.parentNode) { reconciledEcho.node.parentNode.removeChild(reconciledEcho.node); } } newMsg( body, data.chatMessage.sender_type, newMessageTimeString, (data.chatMessage.operator_name) ? data.chatMessage.operator_name : smartbtnI18n(\"operator_fallback\"), data.chatMessage.avatar, data.history, data.chatMessage.message_type, msgFile, data.chatMessage.id, data.chatMessage.sender_id, data.chatMessage.read_at ); scrollToBottom(data.chatMessage.sender_type); }};function smartbtnApplySocketHeader(field, freshnessKey, rawValue, data) { var revisionValue = data.translationRevision; var hasFiniteIncomingRevision = (typeof revisionValue === \"number\" && Number.isFinite(revisionValue)) || (typeof revisionValue === \"string\" && revisionValue.trim() !== \"\" && Number.isFinite(Number(revisionValue))); var incomingRevision = hasFiniteIncomingRevision ? Number(revisionValue) : null; var currentRevision = Number(smartbtnLanguageRuntime.revision); if (hasFiniteIncomingRevision && Number.isFinite(currentRevision) && incomingRevision < currentRevision) { return; } var existingFieldRuntime = smartbtnLanguageRuntime.texts && typeof smartbtnLanguageRuntime.texts === \"object\" ? smartbtnLanguageRuntime.texts[field] : null; var existingMatrixIsUsable = Number.isFinite(currentRevision) && existingFieldRuntime && existingFieldRuntime.values && typeof existingFieldRuntime.values === \"object\" && Object.keys(existingFieldRuntime.values).some(function (locale) { return smartbtnSupportedLocale(locale) && typeof existingFieldRuntime.values[locale] === \"string\" && existingFieldRuntime.values[locale].trim() !== \"\"; }); var hasAdditiveTranslation = data.translation && typeof data.translation === \"object\" && !Array.isArray(data.translation) && data.translation.values && typeof data.translation.values === \"object\" && Object.keys(data.translation.values).some(function (locale) { return smartbtnSupportedLocale(locale) && typeof data.translation.values[locale] === \"string\" && data.translation.values[locale].trim() !== \"\"; }); if (existingMatrixIsUsable && (!hasFiniteIncomingRevision || !hasAdditiveTranslation)) { return; } widgetHeaderFreshFromSocket[freshnessKey] = true; var translationIsCurrent = hasAdditiveTranslation && (!hasFiniteIncomingRevision || incomingRevision >= currentRevision); if (hasFiniteIncomingRevision && incomingRevision >= 0 && incomingRevision >= currentRevision) { smartbtnLanguageRuntime.revision = incomingRevision; } if (!smartbtnLanguageRuntime.texts || typeof smartbtnLanguageRuntime.texts !== \"object\") { smartbtnLanguageRuntime.texts = {}; } if (translationIsCurrent) { smartbtnLanguageRuntime.texts[field] = data.translation; } else if (typeof rawValue === \"string\" && rawValue.trim() !== \"\") { var legacyValues = {}; legacyValues[local] = rawValue; smartbtnLanguageRuntime.texts[field] = {source: rawValue, custom: true, values: legacyValues}; } var fieldRuntime = smartbtnLanguageRuntime.texts[field]; if (fieldRuntime && fieldRuntime.values) { Object.keys(fieldRuntime.values).forEac
16h(function (locale) { var supportedLocale = smartbtnSupportedLocale(locale); if (supportedLocale) { smartbtnStoreHeaderCache(field, supportedLocale, smartbtnLanguageRuntime.revision, fieldRuntime.values[locale]); } }); } var resolved = smartbtnResolveTextField(field, local); smartbtnStoreHeaderCache(field, local, smartbtnLanguageRuntime.revision, resolved); smartbtnSetHeaderField(field, resolved);}function setGreetingWidget(data) { smartbtnApplySocketHeader(\"widget_greeting\", \"greeting\", data.greeting, data);}function setButtonNameWidget(data) { smartbtnApplySocketHeader(\"widget_name\", \"name\", data.buttonName, data);}function setSignatureWidget(data) { smartbtnApplySocketHeader(\"widget_signature\", \"signature\", data.widgetSignature, data);}function workNoOperator(operatorsCountN, clientHasHistoryN){ setOnlineOperator(operatorsCountN); if (clientHasHistoryN === true){ document.getElementById(\"smartbtn-chat-main__container-btns__btn_call__chat_widget\").style.pointerEvents = \"\"; document.getElementById(\"js-smartbtn-send-message\").style.pointerEvents = \"none\"; document.querySelector(\".smartbtn-chat-main__container-socials-and-post-message-new-message-svg-label\").style.pointerEvents = \"none\"; if (operatorsCountN === 0){ createWarningMessage(smartbtnI18n(\"no_active_operators\"), \"_no_online_operators\"); } }else{ document.getElementById(\"js-smartbtn-send-message\").style.pointerEvents = \"none\"; document.querySelector(\".smartbtn-chat-main__container-socials-and-post-message-new-message-svg-label\").style.pointerEvents = \"none\"; document.getElementById(\"smartbtn-chat-main__container-btns__btn_call__chat_widget\").style.pointerEvents = \"none\"; }}let wsError = function(e){ isServerConnect = false; console.log(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f\");};function wsRemoveListener(){ Socket.removeEventListener(\"open\", wsOpen); Socket.removeEventListener(\"message\", wsMessage); Socket.removeEventListener(\"error\", wsError);}let jsSmartbtnSendImage = function (e) { e.preventDefault(); document.querySelector(\"#attachment\").click();};document.querySelector(\"#js-smartbtn-chat-box\").addEventListener(\"scroll\", function (e) { scrollWidget = e.target.scrollHeight - e.target.scrollTop - e.target.offsetHeight;});document.querySelector(\"#js-smartbtn-send-image\").addEventListener(\"click\", jsSmartbtnSendImage);function smartbtnWithProviderStrip(callback) { const providerStrip = document.querySelector(\".smartbtn-chat-main__container-socials-and-post-message-socials .smartbtn-chat-main__container-socials-and-post-message-socials_flex\"); if (providerStrip && typeof callback === \"function\") { callback(providerStrip); }}document.querySelector(\"#js-smartbtn-send-message\").addEventListener(\"click\", function (e) { e.preventDefault(); \/* Files\/images picked for THIS send upload over HTTP and reach the chat as separate messages AFTER the text below. The count rides on the text frame (attachmentsPending) so the assistant waits for them and answers the text and the files once, instead of answering the text alone first. Counted before the arrays are cleared; only what inputChangeFile()\/ inputChangeImages() will actually upload. *\/ let smartbtnAttachmentsPending = 0; if (window.navigator.onLine === true){ smartbtnAttachmentsPending = arrayFiles.filter(function (item) { return checkFileSize(item.file.size); }).length + arrayImages.filter(function (item) { return checkFileSize(item.size); }).length; } if (window.navigator.onLine === true){ if (arrayImages.length > 0 || arrayFiles.length > 0){ inputChangeFile(); inputChangeImages(); arrayFiles = []; arrayImages = []; document.querySelector(\"#new_smartbtn_widget_message-area__files\").remove(); let usel = document.createElement(\"div\"); usel.setAttribute(\"id\", \"new_smartbtn_widget_message-area__files\"); usel.classList.add(\"new_smartbtn_widget_message-area__files_w\"); document.querySelector(\".new_smartbtn_widget_message-area_wrapper__textarea\").prepend(usel); }; };
16 Smartbtn_api.makeRequest(); let msg = document.querySelector(\"#js-smartbtn-message\").value; const lenStr = msg.length; const endSymbol = msg.charCodeAt(lenStr-1); if (endSymbol === 13 || endSymbol === 10){ let messageTemp = msg.slice(0, lenStr-1); msg = messageTemp; } if (msg.trim() === \"\" || operatorsCount === 0) { return; } let connectMessage = { type: \"console\", widgetID: widgetID, body: \"\", clientID: SmartBtnClient, messageType: TYPE_CONSOLE, }; if (Socket.readyState === 1) { Socket.send(smartbtnSerializeClientFrame(connectMessage)); } let message = { type: \"message\", widgetID: widgetID, body: msg, clientID: SmartBtnClient, messageType: TYPE_MESSAGE }; \/* fix\/widget-optimistic-echo: render the client's own bubble instantly instead of waiting for the server's WS echo (which previously left the client's own message invisible until it round-tripped, arriving late and often right alongside the AI\/operator reply
16). Only for the Socket-ready path -- the not-ready branch below (notSendMsgsToStorage) already renders its own \"sending\" placeholder via createClientMessageNoConnection, so adding a second bubble here would duplicate it. Placed BEFORE the firstStaffMessage flip further down so the one-time auto staff message (if any) still attaches after the reconciled\/authoritative bubble, exactly as before this fix. *\/ if (Socket.readyState === 1) { let optimisticLocalId = \"local-\" + Date.now() + \"-\" + Math.random().toString(36).slice(2); let optimisticNow = new Date(); let optimisticMo = `0${optimisticNow.getMonth() + 1}`.slice(-2); let optimisticDa = `0${optimisticNow.getDate()}`.slice(-2); let optimisticHo = `0${optimisticNow.getHours()}`.slice(-2); let optimisticMi = `0${optimisticNow.getMinutes()}`.slice(-2); let optimisticSe = `0${optimisticNow.getSeconds()}`.slice(-2); let optimisticCreatedAt = `${optimisticNow.getFullYear()}-${optimisticMo}-${optimisticDa} ${optimisticHo}:${optimisticMi}:${optimisticSe}`; createClientMessage(msg, optimisticCreatedAt, null, optimisticLocalId, -1); let optimisticLeftSide = document.getElementById(`new_smartbtn_widget_client-message__left-side_${optimisticLocalId}`); let optimisticNode = optimisticLeftSide ? optimisticLeftSide.parentElement : null; if (optimisticNode) { optimisticNode.style.opacity = \"0.6\"; optimisticNode.setAttribute(\"data-local-id\", optimisticLocalId); pendingClientEchoes.push({ localId: optimisticLocalId, node: optimisticNode }); } } \/* REQ-3: if the client picked an operator \/ asked for a human, carry that intent on this message so the server routes to a human with priority and the AI steps back. Reset after attaching (one-shot, mirrors join frames). *\/ if (preferredOperatorId){ message.preferredOperatorId = preferredOperatorId; preferredOperatorId = 0; } if (humanRequested){ message.humanRequested = true; humanRequested = false; } if (aiRequested){ message.aiRequested = true; aiRequested = false; } if (smartbtnAttachmentsPending > 0){ message.attachmentsPending = smartbtnAttachmentsPending; } \/* feat SB-FEAT-AI-SELECT: carry WHICH AI operator was picked so the server pins it as the room's answering assistant (one-shot, mirrors the flags). *\/ if (selectedAiOperatorId){ message.selectedAiOperatorId = selectedAiOperatorId; selectedAiOperatorId = 0; } if(firstStaffMessage === 0){ firstStaffMessage = 1; } if (Socket.readyState === 1) { Socket.send(smartbtnSerializeClientFrame(message)); }else{ notSendMsgsToStorage(message); } smartbtnWidgetApiEmit(\"messageSent\", { text: msg }); document.querySelector(\"#js-smartbtn-message\").value = \"\"; clientTypedMessage = \"\"; smartbtnWithProviderStrip(function (providerStrip) { providerStrip.classList.remove(\"smartbtn-chat-main__container-socials-and-post-message-socials_flex-none\"); });});input.oninput = handleInput;inputNoOperator.oninput = handleInputNoOperator;function handleInput(e) { clientTypedMessage = e.target.value; if(openConsole) { let connectMessage = { type: \"console\", widgetID: widgetID, body: e.target.value, clientID: SmartBtnClient, messageType: TYPE_CONSOLE, }; Socket.send(smartbtnSerializeClientFrame(connectMessage)); } if(input.value.length > 0) { smartbtnWithProviderStrip(function (providerStrip) { providerStrip.classList.add(\"smartbtn-chat-main__container-socials-and-post-message-socials_flex-none\"); }); } else { smartbtnWithProviderStrip(function (providerStrip) { providerStrip.classList.remove(\"smartbtn-chat-main__container-socials-and-post-message-socials_flex-none\"); }); }}function handleInputNoOperator(e){ clientTypedMessage = e.target.value;}document.querySelector(\"#attachment\").addEventListener(\"change\", (e) => { createClientFileNew(e);});document.querySelector(\"#js-smartbtn-message\").addEventListener(\"paste\", (e) => { createClientImageNew(e);});let jsSmartbtnSendMessage = function (e) { e.preventDefault(); if (e.key === \"Enter\") { document.querySelector(\"#js-smartbtn-send-message\").click(); smartbtnWithProviderStrip(function (providerStrip) { providerStrip.classList.remove(\"smartbtn-chat-main__container-socials-and-post-message-socials_flex-none\"); }); }};function setmetaWidget (){ if ( screen.width <= 480) { document.querySelector(\".new_smartbtn_widget-pseudo-scroll-9999999998\").classList.add(\"new_smartbtn_widget-pseudo-scroll-9999999998-active\"); \/* Keep the host page's viewport as the sole authority when it already has one. Adding a second meta makes iOS Safari rescale the visual viewport after the chat has opened, overlapping the first keyboard focus. Pages without a viewport keep the legacy 480px fallback; it is still our own removable node and the host head is never rewritten. *\/ var smartbtnHostViewportMeta = document.querySelector('meta[name=\"viewport\"]:not(#smartbtn-viewport-mobile)'); if (!smartbtnHostViewportMeta && !document.getElementById(\"smartbtn-viewport-mobile\")) { var smartbtnViewportMeta = document.createElement(\"meta\"); smartbtnViewportMeta.id = \"smartbtn-viewport-mobile\"; smartbtnViewportMeta.name = \"viewport\"; smartbtnViewportMeta.content = \"width=480, user-scalable=no\"; document.head.appendChild(smartbtnViewportMeta); } }}function unsetmetaWidget (){ if ( screen.width <= 480) { document.querySelector(\".new_smartbtn_widget-pseudo-scroll-9999999998\").classList.remove(\"new_smartbtn_widget-pseudo-scroll-9999999998-active\"); if(document.getElementById(\"smartbtn-viewport-mobile\")){ document.getElementById(\"smartbtn-viewport-mobile\").remove(); } }}document.querySelector(\"#js-back-view\").addEventListener(\"click\", function (e) { e.preventDefault(); \/* D-07: any user close consumes the device-profile auto-open timer permanently, whether or not the rating-prompt intercept below actually completes the close. (typeof guard: see the smartbtnApplyTextFields() note near the top of this file.) *\/ if (typeof smartbtnAutoOpenConsume === \"function\") { smartbtnAutoOpenConsume(); } if (closeInterceptPending) { \/* smartbtnCloseChat() (inline onclick, fires first on this same click) just intercepted the close to show the rating prompt. Do not also run the close\/disconnect logic below on this click. *\/ return; } smartbtnWidgetApiEmit(\"close\"); document.querySelector(\"#js-phone-btn\").removeEventListener(\"click\", jsSmartbtnSendMessage); document.querySelector(\"#js-smartbtn-chat-box\").removeEventListener(\"scroll\", throttle(callbackReadMessage, 500)); document.querySelector(\"#js-phone-btn\").classList.remove(\"new_smartbtn_widget_btn-hide\"); document.querySelector(\"#smartbtn_widget_view\").classList.remove(\"new_smartbtn_widget_view--opened\"); unsetmetaWidget(); let message = { type: TYPE_SERVICE_WIDGET_CLOSE, widgetID: widgetID, body: \"-1\", clientID: SmartBtnClient, messageType: TYPE_WIDGETCLOSE }; if (Socket.readyState === 1) { Socket.send(smartbtnSerializeClientFrame(message)); }});let clickPhoneBtn = function (){ var view = document.querySelector(\"#smartbtn_widget_view\"); if (view.classList.contains(\"new_smartbtn_widget_view--opened\")) { return; } \/* D-07: any user open consumes the device-profile auto-open timer permanently (harmless no-op when it was never armed). (typeof guard: see the smartbtnApplyTextFields() note near the top of this file.) *\/ if (typeof smartbtnAutoOpenConsume === \"function\") { smartbtnAutoOpenConsume(); } smartbtnLockHostScroll(); smartbtnWidgetApiEmit(\"open\"); setmetaWidget(); smartbtnResetViewportAnchor(); var smartbtnOpeningViewport = smartbtnViewportSnapshot(); smartbtnCaptureViewportBaseline(smartbtnOpeningViewport); var buttonPhone = document.querySelector(\"#js-phone-btn\"); var ipWidget = buttonPhone.getAttribute(\"data-ipwidget\"); this.classList.add(\"new_smartbtn_widget_btn-hide\"); view.classList.add(\"new_smartbtn_widget_view--opened\"); if (screen.width <= 480) { smartbtnAttachViewportListeners();
16 smartbtnRefreshViewportHeight(smartbtnOpeningViewport); } widgetLocation.ip = ipWidget; if (Socket.readyState === 1) { let connectMessage = { type: \"command\", command: \"connect\", widgetID: widgetID, clientID: SmartBtnClient, body: \"\", }; Socket.send(smartbtnSerializeClientFrame(connectMessage)); let message = { type: \"command\", command: \"join\", widgetID: widgetID, body: \"\", clientID: SmartBtnClient, }; if (preferredOperatorId){ message.preferredOperatorId = preferredOperatorId; preferredOperatorId = 0; } \/* REQ-3: carry an explicit human request on the join, same transport as preferredOperatorId (the server routes to a human + AI steps back). *\/ if (humanRequested){ message.humanRequested = true; humanRequested = false; } if (aiRequested){ message.aiRequested = true; aiRequested = false; } \/* feat SB-FEAT-AI-SELECT: carry the picked AI on the join frame too. *\/ if (selectedAiOperatorId){ message.selectedAiOperatorId = selectedAiOperatorId; selectedAiOperatorId = 0; } if (Socket.readyState === 1) { Socket.send(smartbtnSerializeClientFrame(message)); } let messageOpen = { type: TYPE_SERVICE_WIDGET_CLOSE, widgetID: widgetID, body: \"1\", clientID: SmartBtnClient, messageType: TYPE_WIDGETCLOSE }; if (Socket.readyState === 1) { Socket.send(smartbtnSerializeClientFrame(messageOpen)); } if (!getHistory){ getHistory = true; let messageHistory = { type: \"history\", widgetID: widgetID, body: \"\", clientID: SmartBtnClient, messageType: 14, }; if (Socket.readyState === 1) { Socket.send(smartbtnSerializeClientFrame(messageHistory)); } } let connectConsole = { type: \"console\", widgetID: widgetID, body: input.value, clientID: SmartBtnClient, messageType: TYPE_CONSOLE, }; if (Socket.readyState === 1) { Socket.send(smartbtnSerializeClientFrame(connectConsole)); } let locationMessage = { type: TYPE_SERVICE_LOCATION, widgetID: widgetID, body: window.location.href, clientID: SmartBtnClient, messageType: TYPE_LOCATION_BACK, statistic: widgetLocation, }; getLocation(Socket, locationMessage, ipWidget); } document.addEventListener(\"keyup\", jsSmartbtnSendMessage); document.querySelector(\"#js-smartbtn-chat-box\").addEventListener(\"scroll\", throttle(callbackReadMessage, 500)); scrollToBottom( AUTHOR_TYPE_OPERATOR_FIRST_OPEN );};\/* \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e \u0441\u0435\u043a\u0443\u043d\u0434\u0443 \u0434\u043b\u044f \u0441\u0442\u0440\u0430\u0445\u043e\u0432\u043a\u0438. \u
160418\u043a\u043e\u043d\u043a\u0430 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0441\u043e\u043a\u0435\u0442\u0443 \u0438 +1\u0441\u0435\u043a *\/\/* fix\/widget-late-injection: this body used to BE the \"load\" listener, and that was the whole defect. A site that appends our <script> from JavaScript -- a tag manager, or any SPA that inserts the snippet on a route change -- adds it AFTER window \"load\" has already fired. A listener registered at that point is never called, so isLoadWidget stayed false forever, the rendezvous with wsOpen() below never completed, and the launcher (hidden by the explicit display=\"none\" further down this file) never came back. Silently: no throw, nothing in the console, just no button. Reported from edme.pro, where the only workaround was forcing Next.js to strategy=\"beforeInteractive\". The dispatch now lives at the very END of this file -- see the document.readyState block there -- so the already-loaded case runs this body directly instead of waiting for an event that cannot come again. The counter is the re-entry guard: an early-injected page takes the listener path, and if anything ever calls this a second time (a second \"load\" in a bfcache-style restore, host code poking the global) the reveal timer is armed once and only once. Read smartbtnLauncherBootCount to see how many times it got through. *\/var smartbtnLauncherBootCount = 0;\/* D-07 one-shot launcher reveal. Absent\/invalid\/disabled device_profiles keep the exact legacy 1000ms delay below byte-semantically -- see smartbtnLauncherRevealDelayMs(). An enabled profile substitutes its current-breakpoint launcher_reveal_delay_sec (0\/30\/60\/90\/180s) for that constant only; the underlying isServerConnect && isLoadWidget gate (never reveal a launcher whose chat cannot yet connect) is unchanged either way. *\/var smartbtnLauncherRevealTimerId = null;var smartbtnLauncherRevealed = false;var smartbtnLauncherBooted = false;function smartbtnFireLauncherReveal() { smartbtnLauncherRevealTimerId = null; isLoadWidget = true; if (isServerConnect && isLoadWidget) { isLoadWidget = false; smartbtnLauncherRevealed = true; document.querySelector(\".new_smartbtn_widget_iphone-btn\").style.display = \"flex\"; }}\/* Cancels\/restarts the pending delay. A no-op before boot (nothing to arm yet) and after the launcher is actually visible (a revealed launcher is never hidden or re-armed) -- the two invariants D-07 requires around a breakpoint change. *\/function smartbtnArmLauncherReveal() { if (!smartbtnLauncherBooted || smartbtnLauncherRevealed) { return; } if (smartbtnLauncherRevealTimerId !== null) { clearTimeout(smartbtnLauncherRevealTimerId); } smartbtnLauncherRevealTimerId = setTimeout(smartbtnFireLauncherReveal, smartbtnLauncherRevealDelayMs());}function smartbtnBootLauncherReveal() { if (smartbtnLauncherBootCount > 0) { return; } smartbtnLauncherBootCount = smartbtnLauncherBootCount + 1; smartbtnLauncherBooted = true; smartbtnArmLauncherReveal();}let wsOpen = function(e){ wsWatchdogMarkActivity(); console.log(\"Connection established\"); isServerConnect = true; if (isServerConnect && isLoadWidget){ isServerConnect = false; document.querySelector(\".new_smartbtn_widget_iphone-btn\").style.display = \"flex\"; } if (Socket.readyState === 1) { let connectMessage = { type: \"command\", command: \"connect\", widgetID: widgetID, clientID: SmartBtnClient, body: \"\", }; newRating(connectMessage); Socket.send(smartbtnSerializeClientFrame(connectMessage)); let message = { type: \"command\", command: \"join\", widgetID: widgetID, body: \"\", clientID: SmartBtnClient, }; \/* Do NOT carry preferredOperatorId\/humanRequested\/aiRequested on this reconnect join frame. This function fires on EVERY WebSocket \"open\" event, including automatic reconnects (watchdog timeout, network blips, tab backgrounding) -- not just the first page-load connect. A join frame carries no chatMessage and never triggers maybeDispatchAiReply() server-side, so carrying these one-shot flags here accomplishes nothing for AI-dispatch -- it only risks a reconnect silently consuming (carry-and-reset) a preference the user set by clicking an operator avatar, before their next real chat message ships it. Confirmed live production race: room 2087, messages 521-529 (2026-07-11) -- an idle-triggered reconnect ate humanRequested between the client's avatar click and their next message, causing message 524 to get an AI reply instead of the requested human. The chat-message-send handler is the sole intended carrier for these flags. *\/ Socket.send(smartbtnSerializeClientFrame(message)); setTimeout(fGetHistory, 1000); } connectSocket();};function fGetHistory(){ if(SmartBtnClient){ if (!getHistory){ getHistory = true; let messageHistory = { type: \"history\", widgetID: widgetID, body: \"\", clientID: SmartBtnClient, messageType: 14, }; if (Socket.readyState === 1) { Socket.send(smartbtnSerializeClientFrame(messageHistory)); } } }}function connectSocket() { document.querySelector(\"#js-phone-btn\").addEventListener(\"click\", clickPhoneBtn);}function disConnectSocket() { document.querySelector(\"#js-phone-btn\").removeEventListener(\"click\", clickPhoneBtn);}\/* cluster-node-selector: client-side node selection + failover. Browsers are useless at multi-A-record failover (measured: Chrome waits 75-135s on a black-holed address, never remembers failures, and TLS\/5xx failures never fail over), so the widget picks its own serving node: it races GET <origin>\/api\/node-health across every configured node with a 2s abort, takes the FIRST 200 as the selected node, remembers dead nodes in localStorage for a 5-minute penalty box, and re-races on repeated WS loss or a failed runtime AJAX. [\"https:\\\/\\\/n1.smartbtn.ru\",\"https:\\\/\\\/n2.smartbtn.ru\",\"https:\\\/\\\/n1.smartbtn.me\",\"https:\\\/\\\/n2.smartbtn.me\"] is a server-controlled JSON array literal injected by WidgetController (json_encode of config services.cluster.nodes); an EMPTY array short-circuits every pathway here so behaviour is identical to the single-origin widget. Every function is wrapped so a selector bug can never break the widget worse than today: the fallback of each helper is the embed origin \/ the original URL. Deliberately does NOT touch pendingClientEchoes \/ smartbtnHandleEchoTimeout \/ smartbtnRetryPendingMessage \/ notSendMsgsToStorage -- the existing offline queue keeps messages safe during a failover gap. *\/var SMARTBTN_CLUSTER_NODES = [\"https:\\\/\\\/n1.smartbtn.ru\",\"https:\\\/\\\/n2.smartbtn.ru\",\"https:\\\/\\\/n1.smartbtn.me\",\"https:\\\/\\\/n2.smartbtn.me\"];var SMARTBTN_NODE_STATE_KEY = \"smartbtn_node_state\";var SMARTBTN_NODE_PROBE_TIMEOUT_MS = 2000;var SMARTBTN_NODE_PENALTY_MS = 300000;var SMARTBTN_NODE_ALLDEAD_RETRY_MS = 60000;var smartbtnClusterSelected = null;var smartbtnClusterFailures = {};var smartbtnClusterRaceInFlight = false;var smartbtnClusterLastRaceAt = 0;var smartbtnClusterWsCloseStreak = 0;var smartbtnClusterAllDeadTimer = null;function smartbtnClusterEnabled(){ try { return Array.isArray(SMARTBTN_CLUSTER_NODES) && SMARTBTN_CLUSTER_NODES.length > 0; } catch (smartbtnClusterError) { return false; }}
16function smartbtnClusterLoadState(){ try { var raw = window.localStorage.getItem(SMARTBTN_NODE_STATE_KEY); if (!raw) { return; } var state = JSON.parse(raw); if (!state || typeof state !== \"object\") { return; } if (state.failures && typeof state.failures === \"object\" && !Array.isArray(state.failures)) { smartbtnClusterFailures = state.failures; } } catch (smartbtnClusterError) { smartbtnClusterFailures = {}; }}function smartbtnClusterSaveState(){ try { window.localStorage.setItem(SMARTBTN_NODE_STATE_KEY, JSON.stringify({preferred: smartbtnClusterSelected, failures: smartbtnClusterFailures})); } catch (smartbtnClusterError) { \/* storage can throw (private mode, quota); operate stateless *\/ }}function smartbtnClusterOrigin(){ try { return smartbtnClusterEnabled() ? smartbtnClusterSelected : null; } catch (smartbtnClusterError) { return null; }}\/* Rewrites a widget runtime URL (built on the embed origin via the https:\/\/smartbtn.ru substitution) onto the selected node's origin. With no selection (feature dormant, or all-nodes-dead fallback) the URL is returned untouched -- current behaviour. *\/function smartbtnClusterUrl(url){ try { var origin = smartbtnClusterOrigin(); if (!origin || typeof url !== \"string\") { return url; } return url.replace(\/^https?:\\\/\\\/[^\\\/]+\/, origin); } catch (smartbtnClusterError) { return url; }}\/* WS endpoint for the selected node: scheme flipped to wss\/ws, host swapped to the node's, path kept from the configured base link (APP_WS, e.g. \/ws). No selection = the base link untouched. *\/function smartbtnClusterWsUrl(){ var base = \"wss:\/\/smartbtn.ru\/ws\"; try { var origin = smartbtnClusterOrigin(); if (!origin) { return base; } var match = base.match(\/^wss?:\\\/\\\/[^\\\/]+(\\\/.*)?$\/); var path = (match && match[1]) ? match[1] : \"\/ws\"; return origin.replace(\/^https:\\\/\\\/\/, \"wss:\/\/\").replace(\/^http:\\\/\\\/\/, \"ws:\/\/\") + path; } catch (smartbtnClusterError) { return base; }}function smartbtnClusterCandidates(){ var now = Date.now(); var candidates = []; for (var i = 0; i < SMARTBTN_CLUSTER_NODES.length; i++) { var candidateOrigin = SMARTBTN_CLUSTER_NODES[i]; var failedAt = smartbtnClusterFailures[candidateOrigin]; if (typeof failedAt === \"number\" && (now - failedAt) < SMARTBTN_NODE_PENALTY_MS) { continue; } candidates.push(candidateOrigin); } return candidates;}function smartbtnClusterMarkFailure(origin){ try { if (!origin) { return; } smartbtnClusterFailures[origin] = Date.now(); if (smartbtnClusterSelected === origin) { smartbtnClusterSelected = null; } smartbtnClusterSaveState(); } catch (smartbtnClusterError) { \/* never let bookkeeping break the widget *\/ }}function smartbtnClusterSelect(origin){ smartbtnClusterSelected = origin || null; if (origin) { smartbtnClusterWsCloseStreak = 0; } smartbtnClusterSaveState();}\/* True health race: fire all probes at once, first HTTP 200 wins (manual first-success semantics -- Promise.race would settle on the first FAILURE too). Losers that answer non-200 go to the penalty box; a loser aborted after the race has settled is NOT penalised (abort is our own timer, not evidence the node is dead). A hard outer timeout guards even the case where fetch hangs with no AbortController support. done(null) = nobody healthy. *\/function smartbtnClusterRace(done){ var settled = false; var finish = function (origin) { if (settled) { return; } settled = true; smartbtnClusterRaceInFlight = false; try { done(origin); } catch (smartbtnClusterError) { \/* callback must not kill the race *\/ } }; try { var candidates = smartbtnClusterCandidates(); if (candidates.length === 0) { finish(null); return; } smartbtnClusterRaceInFlight = true; smartbtnClusterLastRaceAt = Date.now(); var pending = candidates.length; var oneDone = function () { pending = pending - 1; if (pending <= 0) { finish(null); } }; setTimeout(function () { finish(null); }, SMARTBTN_NODE_PROBE_TIMEOUT_MS + 500); var probe = function (probeOrigin) { var controller = null; var abortTimer = null; var options = {method: \"GET\", cache: \"no-store\", mode: \"cors\"}; try { controller = new AbortController(); options.signal = controller.signal; abortTimer = setTimeout(function () { try { controller.abort(); } catch (smartbtnClusterError) {} }, SMARTBTN_NODE_PROBE_TIMEOUT_MS); } catch (smartbtnClusterError) { controller = null; } fetch(probeOrigin + \"\/api\/node-health\", options).then(function (response) { if (abortTimer) { clearTimeout(abortTimer); } if (response && response.status === 200) { finish(probeOrigin); } else { smartbtnClusterMarkFailure(probeOrigin); oneDone(); } }).catch(function (probeError) { if (abortTimer) { clearTimeout(abortTimer); } if (!settled) { smartbtnClusterMarkFailure(probeOrigin); } oneDone(); }); }; for (var probeIndex = 0; probeIndex < candidates.length; probeIndex++) { probe(candidates[probeIndex]); } } catch (smartbtnClusterError) { finish(null); }}\/* All-nodes-dead: fall back to the embed origin (selection = null = exactly today's behaviour) and clear the penalty box after 60s so the nodes get another chance. *\/function smartbtnClusterScheduleAllDeadRetry(){ if (smartbtnClusterAllDeadTimer !== null) { return; } smartbtnClusterAllDeadTimer = setTimeout(function () { smartbtnClusterAllDeadTimer = null; try { smartbtnClusterFailures = {}; smartbtnClusterSaveState(); smartbtnClusterReRace(); } catch (smartbtnClusterError) { \/* fallback path stays on the embed origin *\/ } }, SMARTBTN_NODE_ALLDEAD_RETRY_MS);}function smartbtnClusterReconnectIfNotOpen(){ try { if (Socket && Socket.readyState === 0) { Socket.close(); return; } if (Socket && Socket.readyState === 1) { return; } if (!Socket || Socket.readyState === 3) { initSocket(); } } catch (smartbtnClusterError) { \/* the 1s reconnect loop will pick the new node up anyway *\/ }}function smartbtnClusterReRace(){ try { if (!smartbtnClusterEnabled() || smartbtnClusterRaceInFlight) { return; } smartbtnClusterRace(function (origin) { if (origin) { smartbtnClusterSelect(origin); smartbtnClusterReconnectIfNotOpen(); } else { smartbtnClusterSelect(null); smartbtnClusterScheduleAllDeadRetry(); } }); } catch (smartbtnClusterError) { \/* selection stays as-is *\/ }}\/* WS hooks. A single close is normal churn (server restart, network blip) and stays on the existing close -> setTimeout(initSocket, 1000) path; TWO consecutive closes with no successful open in between mean the selected node is really unwell -> penalty box + re-race. The winner is picked up by the very next initSocket() call because initSocket builds its URL through smartbtnClusterWsUrl(). *\/function smartbtnClusterOnWsOpen(){ smartbtnClusterWsCloseStreak = 0;}function smartbtnClusterOnWsClose(){ try { if (!smartbtnClusterEnabled()) { return; } smartbtnClusterWsCloseStreak = smartbtnClusterWsCloseStreak + 1; if (smartbtnClusterWsCloseStreak < 2) { return; } smartbtnClusterWsCloseStreak = 0; if (smartbtnClusterSelected) { smartbtnClusterMarkFailure(smartbtnClusterSelected); } smartbtnClusterReRace(); } catch (smartbtnClusterError) { \/* existing reconnect chain continues regardless *\/ }}\/* Failed runtime AJAX against the selected node -> penalty box + re-race (throttled so a burst of failing uploads triggers ONE race). *\/function smartbtnClusterOnAjaxError(){ try { if (!smartbtnClusterEnabled()) { return; } if (Date.now() - smartbtnClusterLastRaceAt < 5000) { return; } if (smartbtnClusterSelected) { smartbtnClusterMarkFailure(smartbtnClusterSelected); } smartbtnClusterReRace(); } catch (smartbtnClusterError) { \/* never let telemetry break an upload *\/ }}\/* Boot: no nodes configured -> start the socket synchronously, exactly as before. Nodes configured -> restore the penalty box, race, then start the socket on the winner (or on the embed origin if nobody answered, with the 60s retry armed). startSocket is called exactly once on every path, including selector bugs. *\/function smartbtnClusterInit(startSocket){ try { if (!smartbtnClusterEnabled()) { startSocket(); return; }
16 smartbtnClusterLoadState(); smartbtnClusterRace(function (origin) { smartbtnClusterSelect(origin || null); if (!origin) { smartbtnClusterScheduleAllDeadRetry(); } try { startSocket(); } catch (smartbtnClusterError) { \/* initSocket reschedules itself *\/ } }); } catch (smartbtnClusterError) { try { startSocket(); } catch (smartbtnClusterInitError) { \/* nothing safer left to do *\/ } }}\/* ws-delivery-reliability: client-side connection watchdog. initSocket()'s existing reconnect logic is purely passive -- it only fires on the browser's native WS \"close\" event. A half-open connection (mobile network blip, backgrounded tab, a silently dropped connection with no FIN\/RST ever reaching this side) may not fire \"close\" for a long time. This watchdog tracks the last time ANY frame was received (the open handshake counts too) and, if nothing arrives for WS_WATCHDOG_TIMEOUT_MS, proactively closes the socket -- routing through the EXISTING close -> setTimeout(initSocket, 1000) reconnect codepath rather than duplicating it. Own function, own module-scope variables, deliberately kept separate from every other Socket-related variable so this merges cleanly regardless of other sibling WS changes to this same file. *\/const WS_WATCHDOG_CHECK_INTERVAL_MS = 10000;const WS_WATCHDOG_TIMEOUT_MS = 60000;let wsLastActivityAt = 0;let wsWatchdogTimer = null;function wsWatchdogMarkActivity(){ wsLastActivityAt = Date.now();}function wsWatchdogStart(){ wsWatchdogMarkActivity(); if (wsWatchdogTimer !== null){ return; } wsWatchdogTimer = setInterval(function(){ if (!Socket || Socket.readyState !== 1){ return; } if (Date.now() - wsLastActivityAt > WS_WATCHDOG_TIMEOUT_MS){ console.log(\"WS watchdog: no activity for \" + WS_WATCHDOG_TIMEOUT_MS + \"ms, forcing reconnect\"); Socket.close(); } }, WS_WATCHDOG_CHECK_INTERVAL_MS);}function initSocket(){ if (Socket === null || Socket.readyState === 3) { if(Socket){ wsRemoveListener(); } \/* ws-history-dedup: a synchronous constructor throw (malformed URL, mixed-content scheme mismatch) would otherwise abort this initSocket() call before the close listener below is ever attached, silently dropping the close -> setTimeout(initSocket) retry chain forever. Reschedule explicitly so an unconditional retry is guaranteed even on this rare path. *\/ try { Socket = new WebSocket(smartbtnClusterWsUrl()); } catch (e) { setTimeout(initSocket, 1000); return; } Socket.addEventListener(\"open\", wsOpen); Socket.addEventListener(\"open\", smartbtnClusterOnWsOpen); Socket.addEventListener(\"message\", wsMessage); Socket.addEventListener(\"error\", wsError); Socket.addEventListener(\"close\", function(e){ isServerConnect = false; console.log(\"\u0421\u0432\u044f\u0437\u044c \u043f\u043e\u0442\u0435\u0440\u044f\u043d\u0430!\"); document.querySelector(\".smartbtn-chat-main__container-socials-and-post-message-new-message-svg-label\").style.pointerEvents = \"none\"; wsRemoveListener(); if (e.code && e.code != 1000) { if ( ! navigator.onLine) { console.log(\"\u041d\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430 !!\"); }else{ console.log(\"\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c (\u0438\u043b\u0438 \u0441\u043e\u043a\u0435\u0442\u043e\u043c) !!\"); } } disConnectSocket(); \/* Re-arm the history fetch for the reconnect: without this, getHistory stays true from the very first fetch and every subsequent reconnect's fGetHistory() call is gated shut, so messages missed while disconnected never backfill. *\/ getHistory = false; \/* cluster-node-selector: count this close;
16 two in a row with no open in between = penalty-box the node and re-race. The 1s reconnect below then dials the new winner via smartbtnClusterWsUrl(). No-op when no cluster nodes are configured. *\/ smartbtnClusterOnWsClose(); setTimeout(initSocket, 1000); }, { once: true }); } wsWatchdogStart();}document.querySelector(\".new_smartbtn_widget_iphone-btn\").style.display = \"none\";\/* cluster-node-selector: with no nodes configured this calls initSocket() synchronously right here (current behaviour); with nodes it first races \/api\/node-health (2s cap) and then starts the socket on the winner. *\/smartbtnClusterInit(initSocket);function inputChangeFile(){ let files = [...arrayFiles]; const url = smartbtnClusterUrl(`https:\/\/smartbtn.ru\/api\/attachmentsimage`); for (let i = 0; i < files.length; i++) { const f = files[i].file; if (checkFileSize(f.size)) { const reader = new FileReader(); reader.onloadend = (event) => { let formData = new FormData(); formData.append(\"body\", event.target.result); formData.append(\"clientId\", SmartBtnClient); formData.append(\"widgetId\", widgetID); formData.append(\"file\", f); formData.append(\"type\", \"file\"); formData.append(\"name\", f.name); formData.append(\"size\", f.size); let xhr = new XMLHttpRequest(); xhr.open(\"POST\", url); xhr.send(formData); xhr.onload = function () { try { if (JSON.parse(xhr.response).id === null) { newMsg(smartbtnI18n(\"file_transfer_failed\"), AUTHOR_TYPE_OPERATOR, \"\", smartbtnI18n(\"operator_fallback\")); scrollToBottom(AUTHOR_TYPE_OPERATOR); return; } let message = { type: \"file\", widgetID: widgetID, body: JSON.parse(xhr.response).id, clientID: SmartBtnClient, mimeType: JSON.parse(xhr.response).mimeType, urlBody: JSON.parse(xhr.response).urlBody, messageType: TYPE_FILE, }; if (Socket.readyState === 1) { Socket.send(smartbtnSerializeClientFrame(message)); }else { notSendMsgsToStorage(message); } } catch (e) { let errorMessage = smartbtnI18n(\"file_too_large\"); newMsg(errorMessage, AUTHOR_TYPE_OPERATOR, \"\", smartbtnI18n(\"operator_fallback\")); scrollToBottom( AUTHOR_TYPE_OPERATOR ); } }; xhr.onerror = function () { smartbtnClusterOnAjaxError(); } }; reader.readAsDataURL(f); } else { let errorMessage = smartbtnI18n(\"file_too_large\"); newMsg(errorMessage, AUTHOR_TYPE_OPERATOR, \"\", smartbtnI18n(\"operator_fallback\")); scrollToBottom( AUTHOR_TYPE_OPERATOR ); } }}function inputChangeImages(){ let files = [...arrayImages]; const url = smartbtnClusterUrl(`https:\/\/smartbtn.ru\/api\/attachmentsimage`); for (let i = 0; i < files.length; i++) { const f = files[i]; if (checkFileSize(f.size)) { let formData = new FormData(); formData.append(\"body\", f.body); formData.append(\"clientId\", SmartBtnClient); formData.append(\"widgetId\", widgetID); formData.append(\"type\", \"image\"); formData.append(\"name\", f.name); formData.append(\"size\", f.size); formData.append(\"file\", null); let xhr = new XMLHttpRequest(); xhr.open(\"POST\", url); xhr.send(formData); xhr.onload = function () { try { if (JSON.parse(xhr.response).id === null){ let errorMessage = smartbtnI18n(\"file_transfer_failed\"); newMsg(errorMessage, AUTHOR_TYPE_OPERATOR, \"\", smartbtnI18n(\"operator_fallback\")); scrollToBottom(AUTHOR_TYPE_OPERATOR); }else{ let message = { type: \"file\", widgetID: widgetID, body: JSON.parse(xhr.response).id, clientID: SmartBtnClient, mimeType: JSON.parse(xhr.response).mimeType, urlBody: JSON.parse(xhr.response).urlBody, messageType: TYPE_FILE, }; if (Socket.readyState === 1) { Socket.send(smartbtnSerializeClientFrame(message)); } } } catch (e) { let errorMessage = smartbtnI18n(\"file_too_large\"); newMsg(errorMessage, AUTHOR_TYPE_OPERATOR, \"\", smartbtnI18n(\"operator_fallback\")); scrollToBottom(AUTHOR_TYPE_OPERATOR); } }; xhr.onerror = function () { smartbtnClusterOnAjaxError(); } } else { let errorMessage = smartbtnI18n(\"file_too_large\"); newMsg(errorMessage, AUTHOR_TYPE_OPERATOR, \"\", smartbtnI18n(\"operator_fallback\")); scrollToBottom(AUTHOR_TYPE_OPERATOR); } }}function checkFileSize(size){ if(size > 200097152){ return false; } return true;}function newRating(data) { const xyzc = 1;}function newMsg(msg, senderType, createdAt,operatorName, operatorAvatar = null, history, message_type = null, msgFile = null, messageId = null, senderId = null, read_at = -1) { let messageElem; let print = true; \/* ws-history-dedup: gate on whether THIS message was already rendered (by its own stable server-assigned id), not on a one-shot per-tab sessionStorage flag. The old flag flipped to \"yes\" permanently on the first live\/history_end frame and then silently dropped every history message on every later reconnect, even genuinely-missed ones, since nothing ever reset it back to \"no\". Checking the DOM directly for an existing element with this exact messageId is correct regardless of the history flag or reconnect count: already-shown messages (live or previously backfilled) are skipped, never-seen messages (missed while disconnected) still render. Falls back to always-render (print stays true)
16when messageId is falsy, so a payload ever missing an id is never silently dropped. *\/ if (messageId) { let existingId = (senderType === AUTHOR_TYPE_CLIENT) ? \"new_smartbtn_widget_client-message__message_\" + messageId : \"new_smartbtn_widget_operator-message__message_\" + messageId; if (document.getElementById(existingId)) { print = false; } } clientHasHistory = print; if(print) { if (senderType === AUTHOR_TYPE_CLIENT) { if (msgFile){ createClientMessageAddFile(msg, createdAt, msgFile, messageId, read_at) } else{ createClientMessage(msg, createdAt, null, messageId, read_at); } } else { if (messageId){ hadPriorOperatorMessage = true; } if (history == 0){ sound.play(); \/* \u041e\u0442\u0432\u0435\u0442 \u043d\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 \u0434\u043e\u0448\u0451\u043b -- \u0441\u043d\u0438\u043c\u0430\u0435\u043c \u0432\u0438\u0434\u0438\u043c\u044b\u0439 \u0437\u0430\u043c\u043e\u043a \u0441 \u0431\u044b\u0441\u0442\u0440\u044b\u0445 \u043a\u043d\u043e\u043f\u043e\u043a. \u0422\u043e\u043b\u044c\u043a\u043e \u0436\u0438\u0432\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f: \u0434\u043e\u043a\u0430\u0447\u043a\u0430 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 (history != 0) \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442. *\/ smartbtnReleaseQuickPhraseLock(); } let paymentElement = \"\"; if (message_type === TYPE_PAYMENT){ paymentIndex = paymentIndex + 1; paymentElement = `<div class=\"new_smartbtn_widget_operator-message__payment\" id=\"new_smartbtn_widget_operator-message__payment_${paymentIndex}\" data-paymentIDMsg=\"${paymentIndex}\"><span data-smartbtn-runtime-i18n=\"pay\"><\/span> <input class=\"new_smartbtn_widget_operator-message__payment_cena\" type=\"Number\" hidden id=\"new_smartbtn_widget_operator-message__payment_cena_${paymentIndex}\" value=\"${paymentIndex}\" \/> <\/div>`; } if (msgFile){ createOperatorMessageAddFile(msg, createdAt, operatorName, operatorAvatar, paymentElement, msgFile, messageId, senderId, read_at); } else{ createOperatorMessage(msg, createdAt, operatorName, operatorAvatar, paymentElement, null, messageId, senderId, read_at); } } if (message_type === 1){ listinerPayment[paymentIndex] = document.querySelector(`#new_smartbtn_widget_operator-message__payment_${paymentIndex}`).addEventListener(\"click\", function( event ) { let cena = document.querySelector(`#new_smartbtn_widget_operator-message__payment_cena_${event.target.dataset.paymentidmsg}`).value; let message = { type: \"message\", widgetID: widgetID, body: cena, clientID: SmartBtnClient, messageType: TYPE_PAYMENT, }; if (Socket.readyState === 1) { Socket.send(smartbtnSerializeClientFrame(message)); } }); } }}function paymentClick(idMsg){ let message = { type: \"command\", command: \"join\", widgetID: widgetID, body: \"\", clientID: SmartBtnClient, message_type: TYPE_PAYMENT, idMsg: idMsg, }; Socket.send(smartbtnSerializeClientFrame(message));}function createOperatorMessage(msg, createdAt, operatorName, avatar = null, paymentElement = \"\", msgFile, messageId, senderId, read_at) { sendNotification(smartbtnI18n(\"notification_new_message\"), { body: smartbtnEnvelopePlainText(msg), dir: \"auto\" }); messageOperator(msg, createdAt, operatorName, paymentElement, \"\", messageId, senderId, read_at, avatar); scrollToBottom(AUTHOR_TYPE_CLIENT); return;}function createOperatorMessageAddFile(msg, createdAt, operatorName, avatar = null, paymentElement = \"\", msgFile, messageId, senderId, read_at) { sendNotification(smartbtnI18n(\"notification_new_message\"), { body: msg, dir: \"auto\" }); let sizeFile = (msgFile.size) ? `${msgFile.size} ${smartbtnI18n(\"bytes_unit\")}` : \"\"; imageExists(msgFile.urlBody, function(exist){ if(exist){ let imageNode = smartbtnBuildAttachmentImage(msgFile.urlBody); if(imageNode && document.querySelector(`#new_smartbtn_widget_operator-message__message_${messageId}`)){ let element = document.querySelector(`#new_smartbtn_widget_operator-message__message_${messageId}`); element.textContent = \"\"; element.appendChild(imageNode); } }else{ let msgElement = smartbtnBuildAttachmentBlock(\"new_smartbtn_widget_message-area__files_object_chat_operator_not\", msg, msgFile.urlBody, sizeFile); if(document.querySelector(`#new_smartbtn_widget_operator-message__message_${messageId}`)){ let element = document.querySelector(`#new_smartbtn_widget_operator-message__message_${messageId}`); element.textContent = \"\"; element.appendChild(msgElement); } } scrollToBottom(AUTHOR_TYPE_CLIENT); return; }); messageOperator(\"\", createdAt, operatorName, \"\", \"\", messageId, senderId, read_at, avatar); scrollToBottom(AUTHOR_TYPE_CLIENT); return;}function messageOperator(msg, createdAt, operatorName = \"\", paymentElement = \"\", fileElement = \"\", messageId = null, senderId = null, read_at = -1, avatar = null){ let idElementSide = \"\"; let idElementMessage = \"\"; let dataReadAt = (read_at) ? (read_at === -1) ? \"-1\" : read_at : \"null\"; if (messageId){ idElementSide = ` id=\"new_smartbtn_widget_operator-message__right-side_${messageId}\" `; idElementMessage = ` id=\"new_smartbtn_widget_operator-message__message_${messageId}\" `; }
16 let createdAtSlice = createdAt.slice(11, 16); let operatorAvatar = smartbtnResolveOperatorAvatar(senderId, avatar); let createdAtSliceEl = (createdAtSlice) ? `<div class=\"new_smartbtn_widget_operator-message__time\"> ${createdAtSlice} <\/div>` : \"\"; let avatarEl = (operatorAvatar) ? `<div class=\"new_smartbtn_widget_operator-message__typing\"> <div class=\"new_smartbtn_widget_operator-message__ava\" style=\"background-image: url(${operatorAvatar}) \"><\/div> <\/div>` : \"\"; let message = `<div class=\"new_smartbtn_widget_operator-message__left-side\"> ${avatarEl} ${createdAtSliceEl} <\/div> <div class=\"new_smartbtn_widget_operator-message__right-side\" ${idElementSide}> <div class=\"new_smartbtn_widget_operator-message__info\"> <\/div> <div class=\"new_smartbtn_widget_operator-message__message\" dataReadAt=\"${dataReadAt}\" style=\"word-break: break-word;\" ${idElementMessage}><\/div> ${paymentElement} ${fileElement} <\/div>`; let elem = document.createElement(\"div\"); elem.classList.add(\"new_smartbtn_widget_operator-message\"); elem.innerHTML = message; elem.querySelectorAll(\"[data-smartbtn-runtime-i18n]\").forEach(function (node) { node.textContent = smartbtnI18n(node.getAttribute(\"data-smartbtn-runtime-i18n\")); }); elem.attributes.dataReadAt = dataReadAt; elem.attributes.messageId = messageId; \/* A message with buttons: its text goes through the same urlify() as any message, its buttons are appended under the bubble as DOM nodes. *\/ let messageEnvelope = smartbtnParseMessageEnvelope(msg); if (messageEnvelope) { msg = messageEnvelope.text; } msg = urlify(msg); let operatorBubble = elem.querySelector(\".new_smartbtn_widget_operator-message__message\"); operatorBubble.innerHTML = msg; if (messageEnvelope && messageEnvelope.buttons.length > 0) { operatorBubble.insertAdjacentElement(\"afterend\", smartbtnBuildEnvelopeButtons(messageEnvelope.buttons)); } document.querySelector(\"#js-smartbtn-chat-box\").append(elem); \/* Announce in the page title only when this message is actually unread and the visitor is not already looking at the conversation. dataReadAt carries the server's read state (\"-1\"\/\"null\" = unread), so replaying the transcript on load or after a reconnect no longer announces messages that were read long ago -- that unconditional announce is why the title used to blink on every widget load, and kept blinking after the visitor had read everything. A messageId is required because callbackReadMessage() skips bubbles that have none, so a locally-built bubble -- the canned staff greeting, the connection-error notices -- could start an announcement that the read receipt would then never be able to stop. Placed after the append on purpose: smartbtnVisitorIsReadingChat() and anything downstream should see the finished DOM. *\/ if (messageId && (dataReadAt === \"-1\" || dataReadAt === \"null\") && !smartbtnVisitorIsReadingChat()) { changedTitle.change(); } return;}function createWarningMessage(msg,id) { clearWarningMessage(id); let message = `<div class=\"new_smartbtn_widget_warning-message__message\" style=\"word-break: break-word;\"><\/div>`; let elem = document.createElement(\"div\"); elem.classList.add(\"new_smartbtn_widget_warning-message\"); elem.setAttribute(\"id\",`new_smartbtn_widget_warning-message${id}`); elem.innerHTML = message; elem.querySelector(\".new_smartbtn_widget_warning-message__message\").textContent = msg; document.querySelector(\"#js-smartbtn-chat-box\").append(elem);}function clearWarningMessage(id){ let warningMessage = document.querySelector(`#new_smartbtn_widget_warning-message${id}`); if (warningMessage){ warningMessage.remove(); }}function createClientMessageNoConnection(msg){ if (msg.type === \"message\"){ let {body,id} = msg; body = urlify(body); messageClientNoConnection(body,id); scrollToBottom(AUTHOR_TYPE_OPERATOR); }else if (msg.type === \"callBackWidget\"){ smartbtnAppendPendingCallback(m
16sg); changedTitle.default(); scrollToBottom(AUTHOR_TYPE_OPERATOR); }else{ let message = `<div class=\"new_smartbtn_widget_client-message__left-side\"> <div class=\"new_smartbtn_widget_client-message__time new_smartbtn_widget_client-spin_loader\"><\/div> <div class=\"new_smartbtn_widget_client-message__message\" style=\"word-break: break-word\"><\/div> <\/div> <div class=\"new_smartbtn_widget_client-message__right-side\" style=\"display: none;\"> <div class=\"new_smartbtn_widget_client-message__typing\"> <div class=\"new_smartbtn_widget_client-message__typing_three\"><\/div> <div class=\"new_smartbtn_widget_client-message__typing_two\"><\/div> <div class=\"new_smartbtn_widget_client-message__typing_one\"><\/div> <div class=\"new_smartbtn_widget_client-message__ava\"><\/div> <\/div> <\/div>`; let elem = document.createElement(\"div\"); elem.classList.add(\"new_smartbtn_widget_client-message\",\"new_smartbtn_widget_client-message-no-connection\"); elem.innerHTML = message; let fileBlock = document.createElement(\"div\"); fileBlock.classList.add(\"new_smartbtn_widget_client-message_file_socket_error\"); let loaderBlock = document.createElement(\"div\"); loaderBlock.classList.add(\"new_smartbtn_widget_client_file-error-send-loading__wrapper\"); loaderBlock.style.background = `url(\"${msg.urlBody}\")`; loaderBlock.style.backgroundSize = `cover`; loaderBlock.style.backgroundRepeat = `no-repeat`; let loadingIndicator = document.createElement(\"div\"); loadingIndicator.id = \"new_smartbtn_widget_client_file-error-send-loading\"; let removeLoading = document.createElement(\"div\"); removeLoading.className = \"new_smartbtn_widget_client_file-error-send-loading-x__button\"; removeLoading.dataset.file_body = JSON.stringify(msg.body); removeLoading.textContent = \"\u00d7\"; removeLoading.setAttribute(\"role\", \"button\"); removeLoading.setAttribute(\"tabindex\", \"0\"); removeLoading.setAttribute(\"aria-label\", smartbtnI18n(\"remove_attachment\")); removeLoading.addEventListener(\"click\", function () { removeWhenLoading(this); }); removeLoading.addEventListener(\"keydown\", function (event) { if (event.key === \"Enter\" || event.key === \" \" || event.key === \"Spacebar\") { event.preventDefault(); this.click(); } }); loaderBlock.appendChild(loadingIndicator); loaderBlock.appendChild(removeLoading); fileBlock.appendChild(loaderBlock); elem.querySelector(\".new_smartbtn_widget_client-message__message\").appendChild(fileBlock); changedTitle.default(); if (document.getElementById(\"smartbtn_widget_chat__box\")) { document.querySelector(\"#smartbtn_widget_chat__box\").style.display = \"none\"; } closeOperatorMessageHeart(); document.querySelector(\"#js-smartbtn-chat-box\").append(elem); } scrollToBottom(AUTHOR_TYPE_OPERATOR);}function removeWhenLoading(el){ let block = el.parentElement.parentElement.parentElement.parentElement.parentElement; let arr = JSON.parse(localStorage.getItem(\"notSendMessagesFromClient\")); let body = JSON.parse(el.dataset.file_body); let newArr = arr.filter(item => item.body !== body); localStorage.setItem(\"notSendMessagesFromClient\",JSON.stringify(newArr)); document.querySelector(\"#js-smartbtn-chat-box\").removeChild(block);}function createClientMessage(msg, createdAt, msgFile = null, messageId = null, read_at) { msg = urlify(msg); var elementAvatar = document.querySelector(\".new_smartbtn_widget_client-message__ava\"); elementAvatar.style.background = \"url(https:\/\/smartbtn.ru\/assets\/smartbtn\/img\/default-avatar.png) no-repeat\"; messageClient(msg, createdAt, \"\", messageId, read_at); scrollToBottom(AUTHOR_TYPE_OPERATOR); return;}function createClientMessageAddFile(msg, createdAt, msgFile, messageId, read_at) { let sizeFile = (msgFile.size) ? `${msgFile.size} ${smartbtnI18n(\"bytes_unit\")}` : \"\"; var elementAvatar = document.querySelector(\".new_smartbtn_widget_client-message__ava\"); elementAvatar.style.background = \"url(https:\/\/smartbtn.ru\/assets\/smartbtn\/img\/default-avatar.png) no-repeat\"; imageExists(msgFile.urlBody, function(exist){ if(exist){ let imageNode = smartbtnBuildAttachmentImage(msgFile.urlBody); if(imageNode && document.querySelector(`#new_smartbtn_widget_client-message__message_${messageId}`)){ let element = document.querySelector(`#new_smartbtn_widget_client-message__message_${messageId}`); element.textContent = \"\"; element.appendChild(imageNode); } }else{ let msgElement = smartbtnBuildAttachmentBlock(\"new_smartbtn_widget_message-area__files_object_chat_client_not\", msg, msgFile.urlBody, sizeFile); if(document.querySelector(`#new_smartbtn_widget_client-message__message_${messageId}`)){ let element = document.querySelector(`#new_smartbtn_widget_client-message__message_${messageId}`); element.textContent = \"\"; element.appendChild(msgElement); } } scrollToBottom(AUTHOR_TYPE_OPERATOR); return; }); messageClient(\"\", createdAt, \"\", messageId, read_at); scrollToBottom(AUTHOR_TYPE_OPERATOR); return;}let staffMessage = smartbtnI18n(\"operator_will_connect_30\");function messageClientNoConnection(msg,id) { let message = `<div class=\"new_smartbtn_widget_client-message__left-side\"> <div class=\"new_smartbtn_widget_client-message__time new_smartbtn_widget_client-spin_loader\"><\/div> <div class=\"new_smartbtn_widget_client-message__message\" style=\"word-break: break-word;\"><\/div> <\/div> <div class=\"new_smartbtn_widget_client-message__right-side\" style=\"display: none;\"> <div class=\"new_smartbtn_widget_client-message__typing\"> <div class=\"new_smartbtn_widget_client-message__typing_three\"><\/div> <div class=\"new_smartbtn_widget_client-message__typing_two\"><\/div> <div class=\"new_smartbtn_widget_client-message__typing_one\"><\/div> <div class=\"new_smartbtn_widget_client-message__ava\"><\/div> <\/div> <\/div>`; let elem = document.createElement(\"div\"); elem.classList.add(\"new_smartbtn_widget_client-message\",\"new_smartbtn_widget_client-message-no-connection\"); elem.setAttribute(\"id\",`new_smartbtn_widget_client-message_waiting-${id}`); elem.innerHTML = message; let getMessage = msg; let getMessageFilterHtml = document.createElement(\"p\");
16 getMessageFilterHtml.innerHTML = getMessage; getMessageFilterHtml.classList.add(\"new_smartbtn_widget_client-message_text\"); elem.querySelector(\".new_smartbtn_widget_client-message__message\").appendChild(getMessageFilterHtml); changedTitle.default(); if (document.getElementById(\"smartbtn_widget_chat__box\")) { document.querySelector(\"#smartbtn_widget_chat__box\").style.display = \"none\"; } closeOperatorMessageHeart(); document.querySelector(\"#js-smartbtn-chat-box\").append(elem);}function messageClient(msg, createdAt, fileElement = \"\", messageId = null, readAt = -1){ let idElement = \"\"; let dataReadAt = (readAt) ? (readAt === -1) ? \"-1\" : readAt : \"null\"; let idElementMessage = \"\"; if (messageId){ idElement = `id=\"new_smartbtn_widget_client-message__left-side_${messageId}\"`; idElementMessage = ` id=\"new_smartbtn_widget_client-message__message_${messageId}\" `; } let createdAtSlice = createdAt.slice(11, 16); let indicatorReady = fMessageIndicatorReady(\"111\", readAt, AUTHOR_TYPE_CLIENT); let message = `<div class=\"new_smartbtn_widget_client-message__left-side\" ${idElement}> <div class=\"new_smartbtn_widget_client-message__time\">${createdAtSlice} ${indicatorReady}<\/div> <div class=\"new_smartbtn_widget_client-message__message\" style=\"word-break: break-word\" ${idElementMessage}><\/div> ${fileElement} <\/div> <div class=\"new_smartbtn_widget_client-message__right-side\" style=\"display: none;\"> <div class=\"new_smartbtn_widget_client-message__typing\"> <div class=\"new_smartbtn_widget_client-message__typing_three\"><\/div> <div class=\"new_smartbtn_widget_client-message__typing_two\"><\/div> <div class=\"new_smartbtn_widget_client-message__typing_one\"><\/div> <div class=\"new_smartbtn_widget_client-message__ava\"><\/div> <\/div> <\/div>`; let elem = document.createElement(\"div\"); elem.classList.add(\"new_smartbtn_widget_client-message\"); elem.innerHTML = message; elem.attributes.dataReadAt = dataReadAt; elem.attributes.messageId = messageId; let getMessage = msg; \/* let getMessageFilter = getMessage.replace(\/.com\/g, `<smartbtnlink link=\".com\">.com<\/smartbtnlink>`); *\/ let getMessageFilterHtml = document.createElement(\"p\"); getMessageFilterHtml.innerHTML = getMessage; getMessageFilterHtml.classList.add(\"new_smartbtn_widget_client-message_text\"); elem.querySelector(\".new_smartbtn_widget_client-message__message\").appendChild(getMessageFilterHtml); changedTitle.default(); if (document.getElementById(\"smartbtn_widget_chat__box\")) { document.querySelector(\"#smartbtn_widget_chat__box\").style.display = \"none\"; } document.querySelector(\"#js-smartbtn-chat-box\").append(elem); functionForTesting(); if( firstStaffMessage === 1 && humanOperatorsCount > 0){ if (!hadPriorOperatorMessage){ messageOperator(staffMessage, \"\"); } firstStaffMessage = 2; } return;}function functionForTesting() { let smartbtnlink = document.querySelectorAll(\"smartbtnlink\");}function createClientFileNew(e){ let files = [...e.target.files]; for (let i = 0; i < files.length; i++) { const f = files[i]; const reader = new FileReader(); reader.onload = (event) => { let nameFile = `file${arrayFiles.length}`; let idElement = `new_smartbtn_widget_${nameFile}_${new Date().getTime()}`; let formData = {file: f, size: event.loaded, idElement: idElement}; arrayFiles.push(formData); let elem = smartbtnBuildAttachmentPreview(idElement, f.name, reader.result); document.querySelector(\"#new_smartbtn_widget_message-area__files\").append(elem); document.querySelector(`#close_${idElement}`).addEventListener(\"click\", function (event) { var idEl = this.getAttribute(\"data-id\"); let findRoom = arrayFiles.findIndex((item) => { return item.idElement === idEl}); if (findRoom !== undefined || findRoom > -1){ arrayFiles.splice(findRoom, 1); } document.querySelector(`#${idEl}`).remove(); }, {once: true}) };
16 reader.readAsDataURL(f); } e.target.value = \"\"; return}function createClientImageNew(e){ var items = (e.clipboardData || e.originalEvent.clipboardData).items; let paste = (e.clipboardData || window.clipboardData).getData(\"text\"); if (paste){ return }else{ e.preventDefault(); } for (let index in items) { var item = items[index]; if (item.kind === \"file\") { var blob = item.getAsFile(); var reader = new FileReader(); reader.onload = (event) => { let nameImages = `images${arrayImages.length}`; let idElement = `new_smartbtn_widget_${nameImages}_${new Date().getTime()}`; let formData = {body: event.target.result, name: `${nameImages}.png`, size: event.loaded, idElement: idElement}; arrayImages.push(formData); let elem = smartbtnBuildAttachmentPreview(idElement, `${nameImages}.png`, event.target.result); document.querySelector(\"#new_smartbtn_widget_message-area__files\").append(elem); document.querySelector(`#close_${idElement}`).addEventListener(\"click\", function (event) { var idEl = this.getAttribute(\"data-id\"); let findRoom = arrayImages.findIndex((item) => { return item.idElement === idEl}); if (findRoom !== undefined || findRoom > -1){ arrayImages.splice(findRoom, 1); } document.querySelector(`#${idEl}`).remove(); }, {once: true}) }; reader.readAsDataURL(blob); } } return}function scrollToBottom(senderType) { if (((scrollWidget < 50) && (senderType === AUTHOR_TYPE_OPERATOR)) || (senderType === AUTHOR_TYPE_OPERATOR_FIRST_OPEN)){ let div = document.querySelector(\"#js-smartbtn-chat-box\"); if (div) { div.scrollTop = div.scrollHeight * 2; callbackReadMessage(); } }}function newLog(msg) { let p = document.createElement(\"p\"); p.innerHTML = msg; document.querySelector(\"#js-smartbtn-chat-box\").append(p);}function sendNotification(title, options) { return 0; if (!(\"Notification\" in window)) { } else if (Notification.permission === \"granted\") { let notification = new Notification(title, options); function clickFunc() { alert(smartbtnI18n(\"notification_clicked\")); } notification.onclick = clickFunc; } else if (Notification.permission !== \"denied\") { Notification.requestPermission(function (permission) { if (permission === \"granted\") { let notification = new Notification(title, options); } else { alert(smartbtnI18n(\"notification_denied\")); } }); } else { }}function closeOperatorMessageHeart(){ let ratingMessageTitleOnWidget = document.querySelectorAll(\".new_smartbtn_widget_chat__raiting-title\"); let operatorRaiting = document.querySelectorAll(\".new_smartbtn_widget_chat__raiting\"); operatorRaiting.forEach(item => { item.style.display = \"none\"; }); ratingMessageTitleOnWidget.forEach(textItem => { textItem.textContent = smartbtnI18n(\"rating_thanks\"); textItem.style.marginBottom = 0; }); myTimerRatingTitle = setTimeout(() => { const elementRateWrapper = document.querySelectorAll(\".new_smartbtn_widget_rating-message\"); if(elementRateWrapper){ elementRateWrapper.forEach(rateWrapper => { rateWrapper.remove(); }); } },5000);}function openOperatorMessageHeart(){ documentRaiting = document.querySelector(\".new_smartbtn_widget_chat__raiting\"); if(documentRaiting){ myTimerMessageHeart = setTimeout(()=>{ documentRaiting.style.display = \"flex\"; scrollToBottom(AUTHOR_TYPE_CLIENT); }, 15000); }}
16function closeOperatorWrite(){ documentOperatorWrite = document.querySelector(\"#js-smartbtn-operator-write\"); if(documentOperatorWrite){ documentOperatorWrite.style.display = \"none\"; }}function openOperatorWrite(){ documentOperatorWrite = document.querySelector(\"#js-smartbtn-operator-write\"); if(documentOperatorWrite){ if (myTimerMessageOperatorWrite){ clearInterval(myTimerMessageOperatorWrite); } documentOperatorWrite.style.display = \"flex\"; myTimerMessageOperatorWrite = setTimeout(()=>{ closeOperatorWrite(); }, 15000); }}function paymentClick(e){ const xyzc = 1;}function imageExists(url, callback) { var img = new Image(); img.onload = function() { callback(true); }; img.onerror = function() { callback(false); }; img.src = url;}function getLocation(Socket, message, myIpAdress) { var xhr = new XMLHttpRequest(); var uriIp = \"https:\/\/api.sypexgeo.net\/json\/\" + myIpAdress; if (window.location.protocol == \"http:\"){ uriIp = \"http:\/\/api.sypexgeo.net\/json\/\" + myIpAdress; } xhr.open(\"GET\", uriIp, true); xhr.onload = function (oEvent) { message.statistic.geoPosition = this.responseText; message.statistic.ip = myIpAdress; message.statistic.location = window.location.href; widgetLocation.geoPosition = this.responseText; widgetLocation.location = window.location.href; Socket.send(smartbtnSerializeClientFrame(message)); }; xhr.send(null);}function jsChatCallBackBtnSubmit() { const name = document.querySelector(\"#js-chat-call-back-btn-name\").value; const number = document.querySelector(\"#js-chat-call-back-btn-number\").value; if(name.trim().length > 0 && number.trim().length > 0) { let messages = { type: TYPE_SERVICE_CALLBACK, widgetID: widgetID, body: \"\", name: name, number: number, email: null, clientID: SmartBtnClient, messageType: TYPE_CALLBACK }; if (Socket.readyState === 1) { Socket.send(smartbtnSerializeClientFrame(messages)); }else { notSendMsgsToStorage(messages); } document.querySelector(\"#js-chat-call-back-btn-name\").value = \"\"; document.querySelector(\"#js-chat-call-back-btn-number\").value = \"\"; document.querySelector(\"#js-chat-call-back-btn-name\").classList.remove(\"smartbtn-chat-main__container-chat-call__input-active\"); document.querySelector(\"#js-chat-call-back-btn-number\").classList.remove(\"smartbtn-chat-main__container-chat-call__input-active\"); const callBell = document.getElementById(\"smartbtn-chat-main__container-btns__btn_call__chat_widget\"); smartbtnOpenWindowAndBtn(callBell); } else if(name.trim().length === 0 || number.trim().length === 0) { document.querySelector(\"#js-chat-call-back-btn__container-errors\").classList.add(\"new_smartbtn_widget-call-back-btn__container-errors-block\"); function displayNoneTime() { document.querySelector(\"#js-chat-call-back-btn__container-errors\").classList.remove(\"new_smartbtn_widget-call-back-btn__container-errors-block\"); }; setTimeout(displayNoneTime, 5000); }}function jsChatCallBackBtnSubmitNoOperators(el) { const name = document.querySelector(\"#js-chat-call-back-btn-name_no_operator\").value; const number = document.querySelector(\"#js-chat-call-back-btn-number_no_operator\").value; const email = document.querySelector(\"#js-chat-call-back-btn-email_no_operator\").value; const message = document.querySelector(\"#js-chat-call-back-btn-message_no_operator\").value; if(number.trim().length > 0) { let messages = { type: TYPE_SERVICE_CALLBACK, widgetID: widgetID, body: message, name: name, number: number, email: email, clientID: SmartBtnClient, messageType: TYPE_CALLBACK }; if (Socket.readyState === 1) { Socket.send(smartbtnSerializeClientFrame(messages)); }else { notSendMsgsToStorage(messages); } document.querySelector(\"#js-chat-call-back-btn-name_no_operator\").value = \"\"; document.querySelector(\"#js-chat-call-back-btn-number_no_operator\").value = \"\"; document.querySelector(\"#js-chat-call-back-btn-email_no_operator\").value = \"\"; document.querySelector(\"#js-chat-call-back-btn-message_no_operator\").value = \"\"; document.querySelector(\"#js-chat-call-back-btn-name_no_operator\").classList.remove(\"smartbtn-chat-main__container-chat-call__input-active\"); document.querySelector(\"#js-chat-call-back-btn-number_no_operator\").classList.remove(\"smartbtn-chat-main__container-chat-call__input-active\"); document.querySelector(\"#js-chat-call-back-btn-email_no_operator\").classList.remove(\"smartbtn-chat-main__container-chat-call__input-active\"); document.querySelector(\"#js-chat-call-back-btn-message_no_operator\").classList.remove(\"smartbtn-chat-main__container-chat-call__input-active\"); let successMessageBlock = document.querySelector(\".smartbtn-call-success-message-no-operators\"); if (operatorsCount !== 0){ const callBell = document.getElementById(\"smartbtn-chat-main__container-btns__btn_call__chat_widget\"); smartbtnOpenWindowAndBtn(callBell); }else{ el.disabled = \"true\"; successMessageBlock.style.position = \"fixed\"; successMessageBlock.style.zIndex = 9; successMessageBlock.style.opacity = 1; successMessageBlock.style.bottom = \"180px\"; setTimeout(function (){ successMessageBlock.style.position = \"\"; successMessageBlock.style.zIndex = -9; successMessageBlock.style.opacity = 0; successMessageBlock.style.bottom = 0; el.removeAttribute(\"disabled\"); },5000); }; } else if(number.trim().length === 0) { el.parentElement.children[5].classList.add(\"new_smartbtn_widget-call-back-btn__container-errors-block\"); function displayNoneTime() { el.parentElement.children[5].classList.remove(\"new_smartbtn_widget-call-back-btn__container-errors-block\"); }; setTimeout(displayNoneTime, 5000); }}function errorHandler(err) { console.log(\"Error\", err.code);}function jsSmartbtnToggleSocialsContainer(e) { \/* document.getElementById(\"smartbtn-chat-main-arrow\").classList.toggle(\"smartbtn-chat-main__container-socials-and-post-message-socials-svg-active\");*\/ \/* document.getElementById(\"smartbtn-chat-main__container-socials\").classList.toggle(\"smartbtn-chat-main__container-socials-and-post-message-socials-l
16inks-active\");*\/ if (e){ if (e.classList.contains(\"smartbtn-chat-main__container-socials-and-post-message-socials-links_info\")){ console.log(\"000000 element = \"); e.classList.add(\"smartbtn-chat-main__container-socials-and-post-message-socials-links_info-disable\"); document.getElementById(\"smartbtn-chat-main__container-socials\").classList.add(\"smartbtn-chat-main__container-socials-and-post-message-socials-links-active\"); }else{ console.log(\"111111 element = \"); document.getElementById(\"smartbtn-chat-main__container-socials\").classList.remove(\"smartbtn-chat-main__container-socials-and-post-message-socials-links-active\"); const element = document.querySelector(\".smartbtn-chat-main__container-socials-and-post-message-socials-links_info-disable\"); console.log(\"00 element = \", element); element.classList.remove(\"smartbtn-chat-main__container-socials-and-post-message-socials-links_info-disable\"); console.log(\"01 element = \", element); } } const getElements = document.querySelectorAll(\".new_smartbtn_widget_view-shadow-for-socials-and-smiles\"); getElements.forEach(el => { el.classList.toggle(\"new_smartbtn_widget_view-shadow-for-socials-and-smiles-active\"); }); smartbtnWithProviderStrip(function (providerStrip) { providerStrip.classList.remove(\"smartbtn-chat-main__container-socials-and-post-message-socials_flex-none\"); });};var saveWidthWidget;var saveWidthHeight;var smartbtnGetPageYOffset;var openedChat = false;var openedChatForRatingShow = false;var isOnlineOperator = false;var mReg = new RegExp(\"(android|bb\\\\d+|meego).+mobile|avantgo|bada\\\\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|Android|Silk|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\\\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\\\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino\",\"i\");var mReg2 = new RegExp(\"1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\\\-(n|u)|c55\\\\\/|capi|ccwa|cdm\\\\-|cell|chtm|cldc|cmd\\\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\\\-|_)|g1 u|g560|gene|gf\\\\-5|g\\\\-mo|go(\\\\.w|od)|gr(ad|un)|haie|hcit|hd\\\\-(m|p|t)|hei\\\\-|hi(pt|ta)|hp( i|ip)|hs\\\\-c|ht(c(\\\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\\\-(20|go|ma)|i230|iac( |\\\\-|\\\\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\\\\/)|klon|kpt |kwc\\\\-|kyo(c|k)|le(no|xi)|lg( g|\\\\\/(k|l|u)|50|54|\\\\-[a-w])|libw|lynx|m1\\\\-w|m3ga|m50\\\\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\\\-2|po(ck|rt|se)|prox|psio|pt\\\\-g|qa\\\\-a|qc(07|12|21|32|60|\\\\-[2-7]|i\\\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\\\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\\\-|oo|p\\\\-)|sdk\\\\\/|se(c(\\\\-|0|1)|47|mc|nd|ri)|sgh\\\\-|shar|sie(\\\\-|m)|sk\\\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\\\-|v\\\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\\\-|tdg\\\\-|tel(i|m)|tim\\\\-|t\\\\-mo|to(pl|sh)|ts(70|m\\\\-|m3|m5)|tx\\\\-9|up(\\\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\\\-|your|zeto|zte\\\\-\",\"i\");if(mReg.test(navigator.userAgent) || mReg2.test(navigator.userAgent.
16substr(0,4))) { openedChat = true;}let intervalForRating = null;\/* True for exactly one click after the close (\"X\") button has intercepted a click to show the rating prompt instead of closing the widget; the very next click on #js-back-view then closes unconditionally and this flag is cleared. Read (not reset) by the \"#js-back-view\" click listener so both close-click handlers stay coordinated on the same click. See smartbtnCloseChat() below. *\/let closeInterceptPending = false;function smartbtnAnimatePanel(){ if (screen.width <= 480) { return; } var view = document.querySelector(\".new_smartbtn_widget_view\"); view.classList.add(\"new_smartbtn_widget_view-animation\"); setTimeout(function () { view.classList.remove(\"new_smartbtn_widget_view-animation\"); }, 300);}function smartbtnOpenChat() { openedChat = true; openedChatForRatingShow = true; if (enableToShowRating === true){ drawRatingMessageInterval(); } smartbtnAnimatePanel(); document.getElementById(\"smartbtn-chat-main-animation-spiralAnim-none\").classList.add(\"smartbtn-chat-main-animation-spiralAnim-none\"); \/* Remember the launcher's real size ONLY while it still has one. This function hides the launcher by writing \"0\" and smartbtnCloseChat() restores whatever was remembered here -- so a second open() before a close (a site that calls smartbtn_widget_api.open() twice, an auto-open timer racing a click, any double invocation) used to remember \"0\" and then \"restore\" the launcher to zero size on close. The button was still in the DOM, still clickable by script, but 0x0 for a mouse: the visitor could never reopen the chat without reloading the page. Measured on edme.pro 13.09.2026. *\/ var smartbtnLauncherEl = document.getElementById(\"smartbtn-chat-main-animation-spiralAnim-none\"); var smartbtnLauncherWidth = smartbtnLauncherEl.style.width; if (smartbtnLauncherWidth !== \"0\" && smartbtnLauncherWidth !== \"0px\") { saveWidthWidget = smartbtnLauncherWidth; saveWidthHeight = smartbtnLauncherEl.style.height; } smartbtnLauncherEl.style.width = \"0\"; smartbtnLauncherEl.style.height = \"0\"; document.getElementById(\"smartbtn-chat-main-animation-spiralAnim-none\").setAttribute(\"tabindex\", \"-1\"); if(document.getElementById(\"smartbtn-chat-main__container-active\")){ document.getElementById(\"smartbtn-chat-main__container-active\").classList.add(\"smartbtn-chat-main__container-active\"); }};function smartbtnCloseChat() { clearTimeout(intervalForRating); if (closeInterceptPending) { \/* Second click on the close button: consume the pending state and fall through to the normal close below, unconditionally. *\/ closeInterceptPending = false; } else if (enableToShowRating === true && alreadyShowedRatingMessage === 1) { \/* First click while a rating is owed and not yet shown: show the rating prompt instead of closing; the widget-close listener below reads closeInterceptPending on this same click and skips its own close logic too. *\/ showRatingMessage(); closeInterceptPending = true; return; } var focusedElement = document.activeElement; if (smartbtnKeyboardEligibleElement(focusedElement) && typeof focusedElement.blur === \"function\") { focusedElement.blur(); } smartbtnDetachViewportListeners(); smartbtnResetViewportAnchor(); smartbtnRestoreViewportStyles(); smartbtnUnlockHostScroll(); smartbtnAnimatePanel(); document.getElementById(\"smartbtn-chat-main-animation-spiralAnim-none\").classList.remove(\"smartbtn-chat-main-animation-spiralAnim-none\"); document.getElementById(\"smartbtn-chat-main-animation-spiralAnim-none\").style.width = saveWidthWidget; document.getElementById(\"smartbtn-chat-main-animation-spiralAnim-none\").style.height = saveWidthHeight; document.getElementById(\"smartbtn-chat-main-animation-spiralAnim-none\").setAttribute(\"tabindex\", \"0\"); if(document.getElementById(\"smartbtn-chat-main__container-active\")){ document.getElementById(\"smartbtn-chat-main__container-active\").classList.remove(\"smartbtn-chat-main__container-active\"); }};function newSmartbtnWidgetSetHeightMapDevice(availableContentHeight, keyboardVisible){ if (document.querySelector(\"#js-smartbtn-map-box\").classList.contains(\"smartbtn-chat-main__container-active-box\")){ }else { return; } let heightSender = 0; if (keyboardVisible){ heightSender = 80; document.querySelector(\"#new_smartbtn_widget_view__map_container\").style.height = \"80px\"; }else{ heightSender = 130; document.querySelector(\"#new_smartbtn_widget_view__map_container\").style.height = \"\"; } const heightMap = availableContentHeight; const newSmartbtnWidgetMap = heightMap - heightSender; document.querySelector(\"#js-smartbtn-map-box\").style.height = heightMap + \"px\"; document.querySelector(\"#new_smartbtn_widget_map\").style.height = `${newSmartbtnWidgetMap}px`; myMap.container.fitToViewport();}function smartbtnOpenWindowAndBtn(e) { if(screen.width <= 480){ if (smartbtnKeyboardIsVisible()){ return; } if (e.attributes.dataBtn.value !== \"chat\"){ document.querySelector(\".smartbtn-chat-main__container-socials-and-post-message-new-message-svg\").style.display = \"none\"; document.querySelector(\"#new_smartbtn_widget_message-area\").style.display = \"none\"; }else { document.querySelector(\".smartbtn-chat-main__container-socials-and-post-message-new-message-svg\").style.display = \"\"; document.querySelector(\"#new_smartbtn_widget_message-area\").style.display = \"\"; } } const constForCheckOnMap = e.attributes.dataBtn.value; smartbtnWithProviderStrip(function (providerStrip) { if(constForCheckOnMap == \"map\" || constForCheckOnMap == \"price\") { if (!providerStrip.classList.contains(\"smartbtn-chat-main__container-socials-and-post-message-socials_flex-display-none\")){ providerStrip.classList.add(\"smartbtn-chat-main__container-socials-and-post-message-socials_flex-display-none\"); } } else { if (providerStrip.classList.contains(\"smartbtn-chat-main__container-socials-and-post-message-socials_flex-display-none\")){ providerStrip.classList.remove(\"smartbtn-chat-main__container-socials-and-post-message-socials_flex-display-none\"); } } }); const getElements = document.querySelectorAll(\".smartbtn-chat-main__container-btns__btn\");
16 getElements.forEach(el => { el.classList.remove(\"smartbtn-chat-main__container-btns__btn-active\"); }); e.classList.add(\"smartbtn-chat-main__container-btns__btn-active\"); const getAttr = e.attributes.dataBtn.value; currentTab = getAttr; const getElementsContainer = document.querySelectorAll(\".smartbtn-chat-main__container-chat\"); getElementsContainer.forEach(el => { el.classList.remove(\"smartbtn-chat-main__container-active-box\"); const getAttrContainer = el.attributes.dataBtnContainer.value; if(getAttr == getAttrContainer) { el.classList.add(\"smartbtn-chat-main__container-active-box\"); } }); setCSSInitWidget(e);};function smartbtnToggleWindowEmoji() { document.getElementById(\"js-smartbtn-chat-main__container-socials-and-post-message-new-message-svg-emoji\").classList.toggle(\"smartbtn-chat-main__container-socials-and-post-message-new-message-svg-emoji-active\"); const getElements = document.querySelectorAll(\".new_smartbtn_widget_view-shadow-for-socials-and-smiles\"); getElements.forEach(el => { el.classList.add(\"new_smartbtn_widget_view-shadow-for-socials-and-smiles-active\"); });};function smartbtnAddEmoji(e) { let emoji = \"\"; if(e.innerHTML !== e.innerText){ let imgEmoji = e.firstChild; emoji = imgEmoji.getAttribute(\"alt\"); }else{ emoji = e.innerText; } const getElenemt = emoji; const textAreaElement = document.getElementById(\"js-smartbtn-message\"); const cursolColumn = textAreaElement.selectionStart; const getContentTexarea = document.getElementById(\"js-smartbtn-message\").value; const newSenderBegin = getContentTexarea.slice(0,cursolColumn); const newSenderEnd = getContentTexarea.slice(cursolColumn); const constructorText = `${newSenderBegin} ${getElenemt} ${newSenderEnd}`; document.getElementById(\"js-smartbtn-message\").value = constructorText; document.getElementById(\"js-smartbtn-message\").focus();}function smartbtnFocusInput(e) { if (mReg.test(navigator.userAgent) && !navigator.userAgent.includes(\"iPhone\")){ document.querySelector(\".new_smartbtn_widget_view_width\").style.top = 0; document.querySelector(\".new_smartbtn_widget_view__header\").style.display = \"none\"; document.querySelector(\".smartbtn-chat-main__container-btns\").style.minHeight = \"33px\"; smartbtnWithProviderStrip(function (providerStrip) { providerStrip.style.opacity = \"0.1\"; }); } e.classList.remove(\"smartbtn-chat-main__container-chat-call__input-active\");}function smartbtnBlurInput(e) { if (mReg.test(navigator.userAgent) && !navigator.userAgent.includes(\"iPhone\")){ document.querySelector(\".new_smartbtn_widget_view_width\").style.height = \"100%\"; document.querySelector(\".new_smartbtn_widget_view__header\").style.display = \"\"; document.querySelector(\".smartbtn-chat-main__container-btns\").style.minHeight = \"\"; smartbtnWithProviderStrip(function (providerStrip) { providerStrip.style.opacity = \"1\"; }); } const getValue = e.value; if(getValue.length !== 0) { e.classList.add(\"smartbtn-chat-main__container-chat-call__input-active\"); } else { e.classList.remove(\"smartbtn-chat-main__container-chat-call__input-active\"); }}function setOnlineOperator(countOperator){ fUpdateWidgetOperatorsRowVisibility(countOperator); \/* Aggregate chat availability cannot establish individual presence, especially in display mode \"all\". Unknown\/older payloads hide the dot. *\/ const smartbtnOperatorsRow = document.getElementById(\"smartbtn_widget_head_operators_row\"); const smartbtnStatusImages = smartbtnOperatorsRow ? smartbtnOperatorsRow.querySelectorAll(\".smartbtn-chat-main__container-head-operators-one-operator-img\") : []; const smartbtnSetDotsOnline = function(isOnline){ smartbtnStatusImages.forEach(function(img){ const operatorId = img.attributes.dataId ? String(img.attributes.dataId.value) : \"0\"; fSetWidgetOperatorPresence(img, isOnline ? operatorPresenceById[operatorId] : false); }); }; if (countOperator === 0){ input.disabled = true; getInputText(); inputNoOperator.value = clientTypedMessage; callBellYesChildren = document.getElementById(\"smartbtn-chat-main__container-chat-call_bell__operator_online_widget\"); if(!callBellYesChildren.classList.contains(\"smartbtn-chat-main__container-chat-call__no_active\")){ callBellYesChildren.classList.add(\"smartbtn-chat-main__container-chat-call__no_active\"); } callBellNoChildren = document.getElementById(\"smartbtn-chat-main__container-chat-call_bell__no_operator_online_widget\"); if(callBellNoChildren.classList.contains(\"smartbtn-chat-main__container-chat-call__no_active\")){ callBellNoChildren.classList.remove(\"smartbtn-chat-main__container-chat-call__no_active\"); } smartbtnSetDotsOnline(false); callBell = document.getElementById(\"smartbtn-chat-main__container-btns__btn_call__bell_widget\"); if(currentTab === \"chat\"){ currentTab = \"call\"; smartbtnOpenWindowAndBtn(callBell); } }else{ input.disabled = false; input.value = clientTypedMessage; callBellYesChildren = document.getElementById(\"smartbtn-chat-main__container-chat-call_bell__operator_online_widget\"); if(callBellYesChildren.classList.contains(\"smartbtn-chat-main__container-chat-call__no_active\")){ callBellYesChildren.classList.remove(\"smartbtn-chat-main__container-chat-call__no_active\"); } callBellNoChildren = document.getElementById(\"smartbtn-chat-main__container-chat-call_bell__no_operator_online_widget\"); if(!callBellNoChildren.classList.contains(\"smartbtn-chat-main__container-chat-call__no_active\")){ callBellNoChildren.classList.add(\"smartbtn-chat-main__container-chat-call__no_active\"); } smartbtnSetDotsOnline(true); }}function smartbtnWidgetOver() { if(screen.width >= 1024) { }}function smartbtnWidgetOut() { if(screen.width >= 1024) { }}function smartbtnWidgetCloseModals() { const getElements = document.querySelectorAll(\".new_smartbtn_widget_view-shadow-for-socials-and-smiles\");
16 getElements.forEach(el => { el.classList.remove(\"new_smartbtn_widget_view-shadow-for-socials-and-smiles-active\"); }); document.getElementById(\"js-smartbtn-chat-main__container-socials-and-post-message-new-message-svg-emoji\").classList.remove(\"smartbtn-chat-main__container-socials-and-post-message-new-message-svg-emoji-active\"); \/* document.getElementById(\"smartbtn-chat-main-arrow\").classList.remove(\"smartbtn-chat-main__container-socials-and-post-message-socials-svg-active\");*\/ const providerLinks = document.getElementById(\"smartbtn-chat-main__container-socials\"); if (providerLinks) { providerLinks.classList.remove(\"smartbtn-chat-main__container-socials-and-post-message-socials-links-active\"); } const disabledProviderInfo = document.querySelector(\".smartbtn-chat-main__container-socials-and-post-message-socials-links_info-disable\"); if (disabledProviderInfo) { disabledProviderInfo.classList.remove(\"smartbtn-chat-main__container-socials-and-post-message-socials-links_info-disable\"); }}function throttle(fn, wait) { var time = Date.now(); return function () { if ((time + wait - Date.now()) < 0) { fn(); time = Date.now(); } } } function callbackReadMessage() { if(document.querySelector(\"#smartbtn_widget_view\").classList.contains(\"new_smartbtn_widget_view--opened\")){ }else{ return; } if ( currentTab !== \"chat\"){ return; } const nbox = document.querySelector(\"#js-smartbtn-chat-box\"); let countChild = -1; if(nbox.children && nbox.children.length){ countChild = nbox.children.length; }else{ return; } let offsetHeight = nbox.offsetHeight; let scrollHeight = nbox.scrollHeight; let scrollTop = nbox.scrollTop; let scrollWidget = scrollHeight - scrollTop - offsetHeight; for (let i = countChild - 1; i >= 0; i--){ const operatorMessageElement = nbox.children[i]; if (operatorMessageElement.className === \"new_smartbtn_widget_operator-message\"){ if (operatorMessageElement.attributes.dataReadAt === \"-1\" || operatorMessageElement.attributes.dataReadAt === \"null\"){ }else{ break; } const raznost = scrollHeight - scrollWidget + 130 - operatorMessageElement.offsetTop; const bodyM = (operatorMessageElement.attributes && operatorMessageElement.attributes.messageId) ? operatorMessageElement.attributes.messageId : null; if (bodyM == null){ continue; } if(raznost > 0){ let messages = { type: TYPE_SERVICE_INDICATOR_CLIENT_READY_MESSAGES, widgetID: widgetID, body: bodyM, clientID: SmartBtnClient, messageType: TYPE_INDICATOR_CLIENT_READY_MESSAGES }; if (Socket.readyState === 1) { Socket.send(smartbtnSerializeClientFrame(messages)); operatorMessageElement.attributes.dataReadAt = \"read\"; \/* The receipt has gone out: the visitor has seen the newest incoming message, so the title must stop announcing it. Guarded on visibility because this function also runs for a background tab, and a receipt sent to a tab nobody is looking at is not somebody reading. *\/ if (document.hidden !== true) { changedTitle.default(); } } break; } } }} function fMessageIndicatorReady(classOperator, readAt, senderType){ if(classOperator === \"\"){ return \"\"; } if(widgetButtonOperatorIndicatorReady == \"0\"){ return \"\"; } const indicatorReady = (readAt == -1 || readAt == null ) ? INDICATOR_NOT_READY : INDICATOR_READY; if (senderType === AUTHOR_TYPE_CLIENT ){ return `<span class=\"main-section-smartbtn-chat__container-chat-scroll__container-open-room-messages-not-open-message-indicator_ready_left\" >${indicatorReady} <\/span>`; } return \"\"; } function setReadAtMessage(payload){ let messageId = Number(payload.body); const element = document.querySelector(`#new_smartbtn_widget_client-message__left-side_${messageId}`); const nbox = document.querySelector(\"#js-smartbtn-chat-box\"); if(element){ let countChild = -1; if(nbox.children && nbox.children.length){ countChild = nbox.children.length; }else{ return; } const elementIndicator = fMessageIndicatorReady(\"--\", payload.read_at, AUTHOR_TYPE_CLIENT); for (let i = countChild - 1; i >= 0; i--){ const clientMessageElement = nbox.children[i]; if (clientMessageElement.className === \"new_smartbtn_widget_client-message\"){ if (clientMessageElement.attributes.dataReadAt === \"-1\" || clientMessageElement.attributes.dataReadAt === \"null\"){ }else{ break; } elementMessageId = Number(clientMessageElement.attributes.messageId); if (elementMessageId <= messageId){ clientMessageElement.attributes.dataReadAt.value = payload.read_at; clientMessageElement.children[0].children[0].children[0].remove(); clientMessageElement.children[0].children[0].insertAdjacentHTML(\"beforeend\", elementIndicator); } } } } }function getInputText(){ let string = \"\";
16 if(operatorsCount === 0 ) { string = smartbtnI18n(\"no_operator_input\"); } input.value = string;}function setLocale(e){ var requestedLocale = e && typeof e.value === \"string\" ? e.value : local; smartbtnApplyLocale(requestedLocale, true); staffMessage = smartbtnI18n(\"operator_will_connect_30\"); changedTitle.setTitle(smartbtnI18n(\"new_operator_message_title\")); getInputText();}function setTranslate(){ smartbtnApplyLocale(local, false);}\/* REQ-3: dedicated \"call operator \/ connect me with a human\" control. Injected once (raw DOM, no framework\/build) above the chat message input. On click it sends a message frame carrying humanRequested:true (and the preferred operator id, if the client picked an avatar) so the server marks the room human_requested \u2014 the AI steps back \u2014 and routes it to a human with priority; if none is online the room waits for the next human. Placed at the end of the file so `local`\/`Socket`\/`widgetID`\/`SmartBtnClient`\/`humanRequested` are already defined (no temporal-dead-zone on `let local`). *\/(function initRequestOperatorControl(){ \/* Temporarily disabled: shipped without an admin on\/off toggle, showing unconditionally on every widget -- re-enable once gated behind a proper Button.data setting. *\/ return; let anchor = document.getElementById(\"new_smartbtn_widget_message-area\"); if (!anchor || !anchor.parentElement){ return; } if (document.getElementById(\"js-smartbtn-request-operator\")){ return; } let requestOperatorBtn = document.createElement(\"div\"); requestOperatorBtn.id = \"js-smartbtn-request-operator\"; requestOperatorBtn.setAttribute(\"role\", \"button\"); requestOperatorBtn.style.cssText = \"cursor:pointer;text-align:center;font-size:12px;line-height:1.3;padding:6px 10px;margin:4px 8px 0;color:#4a4a68;text-decoration:underline;user-select:none;\"; requestOperatorBtn.textContent = smartbtnI18n(\"request_operator_control\"); requestOperatorBtn.addEventListener(\"click\", function(){ \/* Explicit human request: works even with no operator online (queues). *\/ humanRequested = true; let message = { type: \"message\", widgetID: widgetID, body: smartbtnI18n(\"request_operator_message\"), clientID: SmartBtnClient, messageType: TYPE_MESSAGE, humanRequested: true }; if (preferredOperatorId){ message.preferredOperatorId = preferredOperatorId; preferredOperatorId = 0; } humanRequested = false; if (typeof Socket !== \"undefined\" && Socket.readyState === 1){ Socket.send(smartbtnSerializeClientFrame(message)); } }); anchor.parentElement.insertBefore(requestOperatorBtn, anchor);})();\/* ------------------------------------------------------------------ * Public JS Widget API (roadmap-external-api-webhooks.md W7) -- v1 * subset of third-party widget-JS parity (S4.1 JV-JS-M-01..21 \/ JV-JS-CB-01..13). * Covers: open\/close chat, send a message, set contact info \/ custom * data, and onOpen\/onClose\/onMessageSent callbacks. NOT full parity * (52 methods\/callbacks in the reference third-party API) -- explicitly out of scope for this pass * per the roadmap's own W7 effort estimate. * * [DECISION] Named `smartbtn_widget_api` rather than `smartbtn_api`: * this file already declares an internal `Smartbtn_api` const above * (client-data POST helper, unrelated feature -- syncs contact info to * the server). The two identifiers differ only by case, which is a * ready-made source of confusion\/bugs, so the public, customer-facing * object gets a clearly distinct name. It reuses that internal helper's * validated logic (setClientInfo\/setClientCustomData\/makeRequest) for * setContactInfo\/setCustomData rather than duplicating it. * * [DECISION] `sendMessage` has no equivalent in the reference third-party * widget API -- that API does NOT expose a sendMessage method (verified * absent, roadmap U-16, anti-hallucination note under W7). It is included * here only because the task spec explicitly asked for it as a native * SmartBtn capability, not as a claimed parity point. * * Exposed on `window` (not `const`\/`let`) so the customer's own inline * <script> tags -- which run in the same document, after this widget * script's content has been injected via document.body.appendChild in * widget-v2\/layout.blade.php -- can read\/call it. * ------------------------------------------------------------------ *\/var smartbtnWidgetApiListeners = { open: [], close: [], messageSent: [] };function smartbtnWidgetApiEmit(eventName, payload) { var callbacks = smartbtnWidgetApiListeners[eventName]; if (!callbacks || callbacks.length === 0) { return; } for (var i = 0; i < callbacks.length; i++) { try { callbacks[i](payload); } catch (smartbtnWidgetApiCallbackError) { console.log(\"smartbtn_widget_api callback error\", smartbtnWidgetApiCallbackError); } }}window.smartbtn_widget_api = { \/* Opens the chat window. Reuses the same #js-phone-btn click path the widget itself already uses for server-triggered \"toggle\" (see the TYPE_SERVICE_WIDGET_CLOSE\/\"toggleButton\" handling above) rather than duplicating clickPhoneBtn's socket\/connect logic. *\/ open: function () { var launcher = document.querySelector(\"#js-phone-btn\"); var view = document.querySelector(\"#smartbtn_widget_view\"); if (!launcher || !view) { return false; } if (view.classList.contains(\"new_smartbtn_widget_view--opened\")) { return true; } launcher.click(); return true; }, \/* Closes the chat window via the existing #js-back-view click path. *\/ close: function () { var closeBtn = document.querySelector(\"#js-back-view\"); var view = document.querySelector(\"#smartbtn_widget_view\"); if (!closeBtn || !view) { return false; } if (!view.classList.contains(\"new_smartbtn_widget_view--opened\")) { return true; } closeBtn.click(); return true; }, \/* Sends a message as the visitor via the existing send-button path (preserves all existing validation: empty text, no operators online, offline-queueing via notSendMsgsToStorage, etc.). *\/ sendMessage: function (text) { var messageInput = document.querySelector(\"#js-smartbtn-message\"); var sendBtn = document.querySelector(\"#js-smartbtn-send-message\"); if (!messageInput || !sendBtn || typeof text !== \"string\" || text.trim() === \"\") { return false; } messageInput.value = text; sendBtn.click(); return true; }, \/* {name, email, phone, description} -- forwards to the existing internal Smartbtn_api client-data sync (gated by the same button.api feature flag\/kill-switch as that internal helper). *\/ setContactInfo: function (data) { if (!data || typeof data !== \"object\") { return false; } Smartbtn_api.setClientInfo(data);
16 Smartbtn_api.makeRequest(); return true; }, \/* Array of {title, content, link} -- forwards to the existing internal Smartbtn_api client-data sync. *\/ setCustomData: function (data) { if (!Array.isArray(data)) { return false; } Smartbtn_api.setClientCustomData(data); Smartbtn_api.makeRequest(); return true; }, onOpen: function (callback) { if (typeof callback === \"function\") { smartbtnWidgetApiListeners.open.push(callback); } }, onClose: function (callback) { if (typeof callback === \"function\") { smartbtnWidgetApiListeners.close.push(callback); } }, onMessageSent: function (callback) { if (typeof callback === \"function\") { smartbtnWidgetApiListeners.messageSent.push(callback); } }};\/* =========================================================================== * D-06\/D-07 responsive device profiles + D-05 assistant identity\/locale. * * Every function below is inert for a legacy\/non-target tenant: * smartbtnDeviceProfileRuntime.enabled is false and * smartbtnAssistantLocalePayload is the empty {assistants:{},operators:{}, * unique_eligible_target:null} shape, so no listener is attached, no * element is touched beyond what already ran above, and * smartbtnAssistantApplyProjection() is a same-value rewrite of whatever the * generic greeting logic already put on the page. * ======================================================================== *\/var SMARTBTN_LAUNCHER_POSITION_CSS = { \"smartbtn-position-widget-in-page-bottom-left\": function (x, y) { return \"bottom:\" + y + \"px; left:\" + x + \"px; top:auto; right:auto;\"; }, \"smartbtn-position-widget-in-page-bottom-right\": function (x, y) { return \"bottom:\" + y + \"px; right:\" + x + \"px; top:auto; left:auto;\"; }, \"smartbtn-position-widget-in-page-top-left\": function (x, y) { return \"top:\" + y + \"px; left:\" + x + \"px; bottom:auto; right:auto;\"; }, \"smartbtn-position-widget-in-page-top-right\": function (x, y) { return \"top:\" + y + \"px; right:\" + x + \"px; bottom:auto; left:auto;\"; }};\/* Opposite-edge-zero anchored insets for the MOBILE chat panel (D-07). Each entry returns {top,left,right,bottom} CSS length strings; the two edges NOT on the launcher's own corner are always \"0px\". *\/var SMARTBTN_CHAT_MOBILE_INSET = { \"smartbtn-position-widget-in-page-bottom-right\": function (x, y) { return {top: \"0px\", left: \"0px\", right: x + \"px\", bottom: y + \"px\"}; }, \"smartbtn-position-widget-in-page-bottom-left\": function (x, y) { return {top: \"0px\", right: \"0p
16x\", left: x + \"px\", bottom: y + \"px\"}; }, \"smartbtn-position-widget-in-page-top-right\": function (x, y) { return {bottom: \"0px\", left: \"0px\", right: x + \"px\", top: y + \"px\"}; }, \"smartbtn-position-widget-in-page-top-left\": function (x, y) { return {bottom: \"0px\", right: \"0px\", left: x + \"px\", top: y + \"px\"}; }};function smartbtnDeviceProfileIsMobile() { return !!(smartbtnDeviceProfileMql && smartbtnDeviceProfileMql.matches);}\/* The two profile objects the server sends are already fully resolved (legacy\/default fallbacks applied server-side, D-07) -- this only picks which one the current breakpoint uses. *\/function smartbtnDeviceProfileSelect() { var profile = smartbtnDeviceProfileIsMobile() ? smartbtnDeviceProfileRuntime.mobile : smartbtnDeviceProfileRuntime.desktop; return (profile && typeof profile === \"object\") ? profile : {};}function smartbtnDeviceProfileNumber(value, fallback) { return typeof value === \"number\" && isFinite(value) ? value : fallback;}function smartbtnDeviceProfilePosition(profile) { return Object.prototype.hasOwnProperty.call(SMARTBTN_LAUNCHER_POSITION_CSS, profile.position) ? profile.position : \"smartbtn-position-widget-in-page-bottom-right\";}\/* Legacy 1000ms unless an enabled profile substitutes its current-breakpoint launcher_reveal_delay_sec (D-07) -- the ONLY thing this changes about the existing reveal gate. *\/function smartbtnLauncherRevealDelayMs() { if (!smartbtnDeviceProfileRuntime.enabled) { return 1000; } return smartbtnDeviceProfileNumber(smartbtnDeviceProfileSelect().launcher_reveal_delay_sec, 0) * 1000;}function smartbtnDeviceProfileApplyLauncherGeometry(profile) { var launcher = document.querySelector(\"[data-smartbtn-device-profile-launcher]\"); if (!launcher) { return; } var position = smartbtnDeviceProfilePosition(profile); var offsetX = smartbtnDeviceProfileNumber(profile.launcher_offset_x_px, 20); var offsetY = smartbtnDeviceProfileNumber(profile.launcher_offset_y_px, 20); var size = smartbtnDeviceProfileNumber(profile.launcher_size_px, 100); launcher.style.cssText = SMARTBTN_LAUNCHER_POSITION_CSS[position](offsetX, offsetY) + \" width:\" + size + \"px; height:\" + size + \"px;\";}\/* Desktop keeps its bottom-right chat anchor and normal dimensions while honoring the selected profile's offsets. Mobile uses four-corner insets to shrink its full-screen panel. Clear obsolete properties when crossing the breakpoint so mobile dimensions cannot stretch the desktop panel. *\/function smartbtnDeviceProfileApplyChatGeometry(profile) { var chat = document.querySelector('[data-smartbtn-device-profile-root=\"chat\"]'); if (!chat) { return; } var isMobile = smartbtnDeviceProfileIsMobile(); if (!smartbtnDeviceProfileRuntime.enabled) { [\"top\", \"left\", \"right\", \"bottom\", \"width\", \"height\"].forEach(function (prop) { chat.style.removeProperty(prop); }); return; } var position = smartbtnDeviceProfilePosition(profile); var offsetX = smartbtnDeviceProfileNumber(profile.chat_offset_x_px, 0); var offsetY = smartbtnDeviceProfileNumber(profile.chat_offset_y_px, 0); if (!isMobile) { [\"top\", \"left\", \"width\", \"height\"].forEach(function (prop) { chat.style.removeProperty(prop); }); chat.style.setProperty(\"right\", offsetX + \"px\", \"important\"); chat.style.setProperty(\"bottom\", offsetY + \"px\", \"important\"); return; } var inset = SMARTBTN_CHAT_MOBILE_INSET[position](offsetX, offsetY); [\"top\", \"left\", \"right\", \"bottom\"].forEach(function (edge) { chat.style.setProperty(edge, inset[edge], \"important\"); }); \/* The base mobile rule marks width\/height 100% !important; only an equally-important inline declaration can win that cascade. *\/ chat.style.setProperty(\"width\", \"auto\", \"important\"); chat.style.setProperty(\"height\", \"auto\", \"important\");}function smartbtnDeviceProfileApplyVisibility(profile) { var logo = document.querySelector(\"[data-smartbtn-profile-logo]\"); var signature = document.querySelector(\"[data-smartbtn-profile-signature]\"); if (!smartbtnDeviceProfileRuntime.enabled) { return; } if (logo) { logo.style.display = (profile.show_logo === false) ? \"none\" : \"\"; } if (signature) { signature.style.display = (profile.show_signature === false) ? \"none\" : \"\"; }}function smartbtnDeviceProfileApply() { if (!smartbtnDeviceProfileRuntime.enabled) { return; } var profile = smartbtnDeviceProfileSelect(); smartbtnDeviceProfileApplyLauncherGeometry(profile); smartbtnDeviceProfileApplyChatGeometry(profile); smartbtnDeviceProfileApplyVisibility(profile);}\/* ---- one tracked, cancellable\/consumable auto-open timer (D-07) -------- *\/var smartbtnAutoOpenTimerId = null;var smartbtnAutoOpenConsumed = false;function smartbtnAutoOpenCancel() { if (smartbtnAutoOpenTimerId !== null) { clearTimeout(smartbtnAutoOpenTimerId); smartbtnAutoOpenTimerId = null; }}\/* Consumed permanently by firing, or by any user open\/close -- see the smartbtnAutoOpenConsume() call sites in clickPhoneBtn and the #js-back-view click handler. *\/function smartbtnAutoOpenConsume() { smartbtnAutoOpenConsumed = true; smartbtnAutoOpenCancel();}function smartbtnAutoOpenFire() { smartbtnAutoOpenTimerId = null; if (smartbtnAutoOpenConsumed) { return; } smartbtnAutoOpenConsumed = true; if (!smartbtnDeviceProfileRuntime.enabled) { return; } var launcher = document.querySelector(\"[data-smartbtn-device-profile-launcher]\"); if (launcher) { launcher.click(); }}\/* A breakpoint change cancels\/restarts using the CURRENT desktop\/mobile profile. Zero disables scheduling without consuming an unfired timer. Only absent\/disabled profiles retain the legacy openChatWindow() path. *\/function smartbtnAutoOpenArm() { smartbtnAutoOpenCancel(); if (smartbtnAutoOpenConsumed || !smartbtnDeviceProfileRuntime.enabled) { return; } var seconds = smartbtnDeviceProfileNumber(smartbtnDeviceProfileSelect().auto_open_delay_sec, 0); if (seconds <= 0) { return; } smartbtnAutoOpenTimerId = setTimeout(smartbtnAutoOpenFire, seconds * 1000);}function smartbtnDeviceProfileHandleBreakpointChange() { smartbtnDeviceProfileApply(); smartbtnArmLauncherReveal(); smartbtnAutoOpenArm();}\/* One idempotent matchMedia(\"(max-width: 480px)\") listener, attached only when a profile is actually enabled -- a disabled\/absent envelope adds nothing new here (D-07: \"enabled profiles select with one ... listener\"), so this whole module is a no-op for every tenant that has not opted in. *\/function smartbtnDeviceProfileInit() { if (!smartbtnDeviceProfileRuntime.enabled) { return; } smartbtnDeviceProfileMql = window.matchMedia(\"(max-width: 480px)\"); var listener = function () { smartbtnDeviceProfileHandleBreakpointChange(); }; if (typeof smartbtnDeviceProfileMql.addEventListener === \"function\") { smartbtnDeviceProfileMql.addEventListener(\"change\", listener); } else if (typeof smartbtnDeviceProfileMql.addListener === \"function\") { \/* Safari < 14 \/ older WebViews. *\/ smartbtnDeviceProfileMql.addListener(listener); } smartbtnDeviceProfileApply(); smartbtnAutoOpenArm();}\/* ---- D-05 assistant identity\/locale ------------------------------------ *\/function smartbtnAssistantResolveOperator(sen
16derId) { var key = String(senderId); var operators = smartbtnAssistantLocalePayload.operators; return (operators && typeof operators === \"object\" && Object.prototype.hasOwnProperty.call(operators, key)) ? operators[key] : null;}\/* The ONLY authority transition after boot: a genuine operator-authored socket chatMessage.sender_id, resolved through operators[id]. An unknown\/stale id or a human\/operator-without-AI-mapping event clears to generic and never falls back to the initial unique target again -- once authorityEstablished is true, smartbtnAssistantState.assistantId is authoritative on its own. *\/function smartbtnAssistantHandleAuthoredSender(senderId) { smartbtnAssistantState.authorityEstablished = true; var mapping = smartbtnAssistantResolveOperator(senderId); var nextAssistantId = (mapping && typeof mapping === \"object\" && typeof mapping.assistant_id === \"number\") ? mapping.assistant_id : null; if (nextAssistantId === smartbtnAssistantState.assistantId) { return; } smartbtnAssistantState.assistantId = nextAssistantId; smartbtnAssistantApplyProjection();}function smartbtnAssistantCurrent() { if (smartbtnAssistantState.assistantId === null) { return null; } var key = String(smartbtnAssistantState.assistantId); var assistants = smartbtnAssistantLocalePayload.assistants; return (assistants && typeof assistants === \"object\" && Object.prototype.hasOwnProperty.call(assistants, key)) ? assistants[key] : null;}\/* Value order (D-05): current resolved locale -> configured fallback locale -> this same assistant's legacy scalar\/list -> generic. *\/function smartbtnAssistantResolveGreeting(assistant) { var map = assistant.greeting_i18n; if (map && typeof map === \"object\") { if (typeof map[local] === \"string\" && map[local].trim() !== \"\") { return map[local]; } var fallbackLocale = smartbtnFallbackLocale(); if (typeof map[fallbackLocale] === \"string\" && map[fallbackLocale].trim() !== \"\") { return map[fallbackLocale]; } } if (typeof assistant.greeting === \"string\" && assistant.greeting.trim() !== \"\") { return assistant.greeting; } return smartbtnResolveTextField(\"widget_greeting\", local);}function smartbtnAssistantResolveQuickPhrases(assistant) { var map = assistant.quick_phrases_i18n; if (map && typeof map === \"object\") { if (Array.isArray(map[local]) && map[local].length > 0) { return map[local]; } var fallbackLocale = smartbtnFallbackLocale(); if (Array.isArray(map[fallbackLocale]) && map[fallbackLocale].length > 0) { return map[fallbackLocale]; } } if (Array.isArray(assistant.quick_phrases) && assistant.quick_phrases.length > 0) { return assistant.quick_phrases; } return [];}\/* \u0411\u044b\u0441\u0442\u0440\u044b\u0435 \u043a\u043d\u043e\u043f\u043a\u0438: \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430\u0436\u0430\u0442\u0438\u0439. \u041a\u0430\u0436\u0434\u043e\u0435 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u0440\u0430\u043d\u044c\u0448\u0435 \u0443\u0445\u043e\u0434\u0438\u043b\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u043c, \u0438 \u043d\u0430 \u0441\u0435\u0440\u0438\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0439 \u043a\u043b\u0438\u0435\u043d\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u043b \u043e\u0434\u0438\u043d \u043e\u0442\u0432\u0435\u0442: \u043d\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u0440\u0435\u043f\u043b\u0438\u043a\u0443 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0441\u0432\u043e\u0439 AiReplyJob, \u0438 \u0432\u0441\u0435, \u043a\u0440\u043e\u043c\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e, \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u043d\u0430 \u0413\u0435\u0439\u0442\u0435 \u21160 (AiReplyJob:: supersededByNewerClientTurn). \u041f\u0440\u043e\u0434, \u043a\u043e\u043c\u043d\u0430\u0442\u0430 18421, 21.09 11:40:27-11:40:42: 14 \u043d\u0430\u0436\u0430\u0442\u0438\u0439 (\u0446\u0435\u043d\u0430, \u043b\u043e\u043a\u0430\u0446\u0438\u0438, \u00ab\u043d\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f\u00bb, \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430) -- \u043e\u0434\u0438\u043d \u043e\u0442\u0432\u0435\u0442 11:40:50 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e \u0446\u0435\u043d\u0443, \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043a\u043b\u0438\u0435\u043d\u0442 \u043f\u043e\u0442\u0435\u0440\u044f\u043b. \u0417\u0434\u0435\u0441\u044c \u0434\u0432\u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u0430. \u041d\u0430\u0436\u0430\u0442\u0438\u044f \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u043f\u0430\u0443\u0437\u044b COALESCE \u0441\u043a\u043b\u0435\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u041e\u0414\u041d\u041e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 -- \u044d\u0442\u043e \u043e\u0434\u0438\u043d \u0432\u043e\u043f\u0440\u043e\u0441 \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u0442\u0440\u043e\u043a, \u043d\u0430 \u043d\u0435\u0433\u043e \u043c\u043e\u0434\u0435\u043b\u044c \u0438 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0446\u0435\u043b\u0438\u043a\u043e\u043c. \u041f\u043e\u043a\u0430 \u043e\u0442\u0432\u0435\u0442 \u0432 \u0440\u0430\u0431\u043e\u0442\u0435, \u043a\u043d\u043e\u043f\u043a\u0438 \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u0412\u0418\u0414\u0418\u041c\u041e (\u043a\u043b\u0430\u0441\u0441 \u043d\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 + disabled), \u0430 \u043d\u0435 \u043c\u043e\u043b\u0447\u0430 \u043f\u0440\u043e\u0433\u043b\u0430\u0442\u044b\u0432\u0430\u044e\u0442 \u043d\u0430\u0436\u0430\u0442\u0438\u0435. \u0417\u0430\u043c\u043e\u043a \u0441\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u0435\u0440\u0432\u044b\u0439 \u0436\u0435 \u0436\u0438\u0432\u043e\u0439 \u043e\u0442\u0432\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430\/\u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u0430 (ne
16wMsg) \u043b\u0438\u0431\u043e \u0441\u0442\u0440\u0430\u0445\u043e\u0432\u043e\u0447\u043d\u044b\u0439 \u0442\u0430\u0439\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u043e\u0442\u0432\u0435\u0442\u0430 \u0442\u0430\u043a \u0438 \u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e -- \u0438\u043d\u0430\u0447\u0435 \u043e\u0434\u043d\u0430 \u043f\u043e\u0442\u0435\u0440\u044f\u043d\u043d\u0430\u044f \u0440\u0435\u043f\u043b\u0438\u043a\u0430 \u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0430 \u0431\u044b \u043a\u043d\u043e\u043f\u043a\u0438 \u043c\u0451\u0440\u0442\u0432\u044b\u043c\u0438 \u0434\u043e \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b. *\/var SMARTBTN_QUICK_PHRASE_COALESCE_MS = 700;var SMARTBTN_QUICK_PHRASE_REPLY_TIMEOUT_MS = 45000;var smartbtnQuickPhraseQueue = [];var smartbtnQuickPhraseFlushTimer = null;var smartbtnQuickPhraseAwaitingReply = false;var smartbtnQuickPhraseReplyTimer = null;\/* \u041e\u0434\u043d\u043e \u043c\u0435\u0441\u0442\u043e, \u0433\u0434\u0435 \u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f, \u0432\u0438\u0434\u043d\u044b \u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c\u044b\u043c\u0438. \u041a\u043b\u0430\u0441\u0441 \u0432\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u041a\u041e\u041d\u0422\u0415\u0419\u041d\u0415\u0420, \u0430 \u043d\u0435 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0438: \u0434\u0435\u043b\u0435\u0433\u0430\u0442 \u043d\u0438\u0436\u0435 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 className \u043a\u043d\u043e\u043f\u043a\u0438 \u0441\u0442\u0440\u043e\u043a\u043e\u0439 \u0446\u0435\u043b\u0438\u043a\u043e\u043c, \u0438 \u043b\u0438\u0448\u043d\u0438\u0439 \u043a\u043b\u0430\u0441\u0441 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0435 \u043e\u0442\u0432\u044f\u0437\u0430\u043b \u0431\u044b \u0435\u0439 \u043d\u0430\u0436\u0430\u0442\u0438\u0435. *\/function smartbtnApplyQuickPhraseLock() { var container = document.querySelector(\"[data-smartbtn-assistant-quick-phrases]\"); if (!container) { return; } var locked = (smartbtnQuickPhraseAwaitingReply === true); if (locked) { container.classList.add(\"smartbtn-widget-quick-phrases--waiting\"); } else { container.classList.remove(\"smartbtn-widget-quick-phrases--waiting\"); } var children = container.children || []; for (var index = 0; index < children.length; index++) { children[index].disabled = locked; }}\/* \u0421\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0438 (\u043f\u0435\u0440\u0435)\u0437\u0430\u0432\u043e\u0434\u0438\u0442 \u043f\u0430\u0443\u0437\u0443 \u0441\u043a\u043b\u0435\u0439\u043a\u0438. \u
160412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 false, \u0435\u0441\u043b\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043d\u0435 \u043f\u0440\u0438\u043d\u044f\u0442\u043e -- \u0437\u0430\u043c\u043e\u043a \u0438\u043b\u0438 \u043f\u0443\u0441\u0442\u043e\u0439 \u0442\u0435\u043a\u0441\u0442. *\/function smartbtnQueueQuickPhrase(text) { if (typeof text !== \"string\" || text.trim() === \"\") { return false; } if (smartbtnQuickPhraseAwaitingReply === true) { return false; } \/* \u041e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0432\u043e\u043f\u0440\u043e\u0441, \u043d\u0430\u0436\u0430\u0442\u044b\u0439 \u0434\u0432\u0430\u0436\u0434\u044b, -- \u044d\u0442\u043e \u0448\u0443\u043c, \u0430 \u043d\u0435 \u0432\u0442\u043e\u0440\u043e\u0439 \u0432\u043e\u043f\u0440\u043e\u0441. *\/ if (smartbtnQuickPhraseQueue.indexOf(text) === -1) { smartbtnQuickPhraseQueue.push(text); } if (smartbtnQuickPhraseFlushTimer !== null) { clearTimeout(smartbtnQuickPhraseFlushTimer); } smartbtnQuickPhraseFlushTimer = setTimeout(smartbtnFlushQuickPhraseQueue, SMARTBTN_QUICK_PHRASE_COALESCE_MS); return true;}\/* \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u0441\u044e \u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u043d\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043e\u0434\u043d\u0438\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u043c \u0438 \u0441\u0442\u0430\u0432\u0438\u0442 \u0437\u0430\u043c\u043e\u043a. *\/function smartbtnFlushQuickPhraseQueue() { smartbtnQuickPhraseFlushTimer = null; if (smartbtnQuickPhraseQueue.length === 0) { return false; } var body = smartbtnQuickPhraseQueue.join(\"\\n\"); \/* sendMessage() \u043a\u043b\u0430\u0434\u0451\u0442 \u0442\u0435\u043a\u0441\u0442 \u0432 \u043f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u0438 \u0436\u043c\u0451\u0442 \u00ab\u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c\u00bb (smartbtn_widget_api.sendMessage). \u041f\u043e\u043a\u0430 \u0438\u0434\u0451\u0442 \u043f\u0430\u0443\u0437\u0430 \u0441\u043a\u043b\u0435\u0439\u043a\u0438, \u043a\u043b\u0438\u0435\u043d\u0442 \u043c\u043e\u0433 \u043d\u0430\u0447\u0430\u0442\u044c \u043f\u0435\u0447\u0430\u0442\u0430\u0442\u044c \u0441\u0432\u043e\u0451 -- \u0435\u0433\u043e \u0447\u0435\u0440\u043d\u043e\u0432\u0438\u043a \u043d\u0435\u043b\u044c\u0437\u044f \u043d\u0438 \u0437\u0430\u0442\u0435\u0440\u0435\u0442\u044c, \u043d\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u043e \u043d\u0430\u0436\u0430\u0442\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c \u043f\u043e\u043b\u0435 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043a\u0430\u043a \u0431\u044b\u043b\u043e. *\/ var messageInput = document.querySelector(\"#js-smartbtn-message\"); var fieldText = function () { return messageInput ? String(messageInput.value || \"\") : \"\"; }; var draft = fieldText(); \/* \u0410 \u0432\u043e\u0442 \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442 \u043b\u0438 \u043f\u043e\u043b\u0435 \u0447\u0435\u0440\u043d\u043e\u0432\u0438\u043a \u043a\u043b\u0438\u0435\u043d\u0442\u0430 -- \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441, \u0438 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u043d\u0435\u0433\u043e \u00ab\u043d\u0435\u0442\u00bb, \u043a\u043e\u0433\u0434\u0430 \u043d\u0438\u043a\u043e\u0433\u043e \u043d\u0435\u0442 online: setOnlineOperator(0) \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043f\u043e\u043b\u0435 \u0438 getInputText() \u043a\u043b\u0430\u0434\u0451\u0442 \u0432 \u043d\u0435\u0433\u043e \u0421\u041e\u0411\u0421\u0422\u0412\u0415\u041d\u041d\u0423\u042e \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0432\u0438\u0434\u0436\u0435\u0442\u0430 (smartbtnI18n(\"no_operator_input\")), \u0430 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0442\u0435\u043a\u0441\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0436\u0438\u0432\u0451\u0442 \u0432 clientTypedMessage \u0438 \u0432 \u043f\u043e\u043b\u0435 \u0437\u0430\u044f\u0432\u043a\u0438 (inputNoOperator). \u041f\u043e\u043b\u0435 \u043c\u044b \u0438 \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u0435\u0440\u043d\u0451\u043c \u043a\u0430\u043a \u0431\u044b\u043b\u043e -- \u0442\u0435\u043a\u0441\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u0438\u0437 \u043d\u0435\u0433\u043e \u043d\u0430\u0434\u043e \u0443\u0431\u0440\u0430\u0442\u044c, -- \u043d\u043e clientTypedMessage \u0442\u0440\u043e\u0433\u0430\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f: \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0437\u0430\u0442\u0451\u0440\u043b\u0430 \u0431\u044b \u0447\u0435\u0440\u043d\u043e\u0432\u0438\u043a \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0438 \u0443\u0435\u0445\u0430\u043b\u0430 \u0431\u044b \u043a \u043d\u0435\u043c\u0443 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u043f\u0440\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u0440\u0435\u0436\u0438\u043c\u0430 \u0432\u0432\u043e\u0434\u0430 (input.value \/ inputNoOperator.value = clientTypedMessage), \u0430 \u043d\u0430\u0436\u043c\u0438 \u043e\u043d \u00ab\u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c\u00bb -- \u0443\u0448\u043b\u0430 \u0431\u044b \u043a\u0430\u043a \u0435\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435. *\/ var fieldHoldsClientDraft = (messageInput !== null && messageInput.disabled !== true && operatorsCount !== 0); var sent = false; if (window.smartbtn_widget_api && typeof window.smartbtn_widget_api.sendMessage === \"function\") { sent = (window.smartbtn_widget_api.sendMessage(body) !== false); } \/* \u0423\u0448\u043b\u043e \u043b\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435. sendMessage() \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 false \u0422\u041e\u041b\u
16042c\u041a\u041e \u043a\u043e\u0433\u0434\u0430 \u043d\u0435\u0442 \u043f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430\/\u043a\u043d\u043e\u043f\u043a\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0438\u043b\u0438 \u043a\u043e\u0433\u0434\u0430 \u0442\u0435\u043a\u0441\u0442 \u043f\u0443\u0441\u0442; \u0430 \u0432\u043e\u0442 \u0435\u0441\u043b\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a #js-smartbtn-send-message \u0432\u044b\u0448\u0435\u043b \u0440\u0430\u043d\u044c\u0448\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 (\u043d\u0438\u043a\u043e\u0433\u043e \u043d\u0435\u0442 online, operatorsCount === 0), \u043e\u043d\u0430 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0432\u0435\u0440\u043d\u0451\u0442 true -- \u0438 \u043d\u0430\u0448 \u0442\u0435\u043a\u0441\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u043b\u0435\u0436\u0430\u0442\u044c \u0432 \u043f\u043e\u043b\u0435. \u041f\u0440\u0438\u0437\u043d\u0430\u043a \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u043e\u0434\u0438\u043d: \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0437\u0430\u0431\u0440\u0430\u043b \u0442\u0435\u043a\u0441\u0442 \u0438\u0437 \u043f\u043e\u043b\u044f (\u043e\u043d \u043e\u0447\u0438\u0449\u0430\u0435\u0442 \u0435\u0433\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435\u043c). *\/ var accepted = (sent && fieldText() !== body); \/* \u041f\u043e\u043b\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0440\u043e\u0432\u043d\u043e \u0432 \u0442\u043e\u043c \u0432\u0438\u0434\u0435, \u0432 \u043a\u0430\u043a\u043e\u043c \u0435\u0433\u043e \u0437\u0430\u0441\u0442\u0430\u043b\u0438: \u043f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043e\u0447\u0438\u0441\u0442\u0438\u043b \u0435\u0433\u043e (\u0432\u0435\u0440\u043d\u0451\u043c \u0447\u0435\u0440\u043d\u043e\u0432\u0438\u043a), \u043f\u043e\u0441\u043b\u0435 \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u043e\u0439 \u0442\u0430\u043c \u043b\u0435\u0436\u0438\u0442 \u0442\u0435\u043a\u0441\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 (\u0443\u0431\u0435\u0440\u0451\u043c \u0435\u0433\u043e). \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0447\u0435\u0440\u043d\u043e\u0432\u0438\u043a\u0430 (clientTypedMessage) \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u0432 \u043f\u043e\u043b\u0435 \u0438 \u0431\u044b\u043b \u0447\u0435\u0440\u043d\u043e\u0432\u0438\u043a -- \u0441\u043c. \u0432\u044b\u0448\u0435. *\/ if (messageInput && fieldText() !== draft) { messageInput.value = draft; if (fieldHoldsClientDraft) { clientTypedMessage = draft; } } if (!accepted) { \/* \u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c (\u043d\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 online, \u043d\u0435\u0442 \u043f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430, \u043f\u0443\u0441\u0442\u043e\u0439 \u0442\u0435\u043a\u0441\u0442) -- \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043d\u0430 \u043c\u0435\u0441\u0442\u0435, \u0437\u0430\u043c\u043e\u043a \u043d\u0435 \u0441\u0442\u0430\u0432\u0438\u043c: \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043d\u0435 \u043f\u043e\u0442\u0435\u0440\u044f\u043d\u043e, \u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u0436\u0438\u0432\u044b\u043c\u0438. *\/ return false; } smartbtnQuickPhraseQueue = []; smartbtnQuickPhraseAwaitingReply = true; if (smartbtnQuickPhraseReplyTimer !== null) { clearTimeout(smartbtnQuickPhraseReplyTimer); } smartbtnQuickPhraseReplyTimer = setTimeout(smartbtnReleaseQuickPhraseLock, SMARTBTN_QUICK_PHRASE_REPLY_TIMEOUT_MS); smartbtnApplyQuickPhraseLock(); return true;}\/* \u041e\u0442\u0432\u0435\u0442 \u043f\u0440\u0438\u0448\u0451\u043b (\u0438\u043b\u0438 \u0441\u0442\u0440\u0430\u0445\u043e\u0432\u043e\u0447\u043d\u044b\u0439 \u0442\u0430\u0439\u043c\u0435\u0440) -- \u043a\u043d\u043e\u043f\u043a\u0438 \u0441\u043d\u043e\u0432\u0430 \u0436\u0438\u0432\u044b\u0435. *\/function smartbtnReleaseQuickPhraseLock() { if (smartbtnQuickPhraseReplyTimer !== null) { clearTimeout(smartbtnQuickPhraseReplyTimer); smartbtnQuickPhraseReplyTimer = null; } if (smartbtnQuickPhraseAwaitingReply !== true) { return; } smartbtnQuickPhraseAwaitingReply = false; smartbtnApplyQuickPhraseLock();}\/* Clears old phrases first, then renders once with textContent (D-05) -- never innerHTML, never sibling content. *\/function smartbtnAssistantRenderQuickPhrases(
16phrases) { var container = document.querySelector(\"[data-smartbtn-assistant-quick-phrases]\"); if (!container) { return; } while (container.firstChild) { container.removeChild(container.firstChild); } phrases.forEach(function (phrase) { if (typeof phrase !== \"string\" || phrase.trim() === \"\") { return; } var button = document.createElement(\"button\"); button.type = \"button\"; button.className = \"smartbtn-widget-quick-phrase\"; button.textContent = phrase; container.appendChild(button); }); \/* \u041f\u0435\u0440\u0435\u0440\u0438\u0441\u043e\u0432\u043a\u0430 (\u0441\u043c\u0435\u043d\u0430 \u044f\u0437\u044b\u043a\u0430\/\u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u0430) \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0432\u043e\u0441\u043a\u0440\u0435\u0448\u0430\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0438, \u043f\u043e\u043a\u0430 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0443\u0436\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 \u0435\u0449\u0451 \u043d\u0435 \u043f\u0440\u0438\u0448\u0451\u043b. *\/ smartbtnApplyQuickPhraseLock();}\/* One delegated listener for the whole container (D-05), bound once and surviving every clear-then-rerender across target\/locale changes. *\/function smartbtnAssistantBindQuickPhraseDelegate() { var container = document.querySelector(\"[data-smartbtn-assistant-quick-phrases]\"); if (!container || container.getAttribute(\"data-smartbtn-delegate-bound\") === \"1\") { return; } container.setAttribute(\"data-smartbtn-delegate-bound\", \"1\"); container.addEventListener(\"click\", function (event) { var target = event.target; if (!target || target.className !== \"smartbtn-widget-quick-phrase\") { return; } \/* \u041d\u0435 sendMessage() \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e: \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u0438\u0434\u0451\u0442 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043a\u043b\u0435\u0438\u0442 \u0441\u0435\u0440\u0438\u044e \u0432 \u043e\u0434\u043d\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442 \u0432\u0438\u0434\u0438\u043c\u044b\u0439 \u0437\u0430\u043c\u043e\u043a \u043d\u0430 \u0432\u0440\u0435\u043c\u044f \u043e\u0442\u0432\u0435\u0442\u0430. *\/ smartbtnQueueQuickPhrase(target.textContent); });}\/* Idempotent, single source of truth: fully re-derives the greeting\/phrases from the CURRENT target and locale every time, so it is safe to call after any generic header-cache\/socket rewrite (D-05) without knowing whether that rewrite just happened or an authority change just happened. *\/function smartbtnAssistantApplyProjection() { smartbtnAssistantBindQuickPhraseDelegate(); var greetingNode = document.querySelector(\"[data-smartbtn-assistant-greeting]\"); var assistant = smartbtnAssistantCurrent(); if (!assistant) { if (greetingNode) { greetingNode.textContent = smartbtnResolveTextField(\"widget_greeting\", local); messageGreeting = greetingNode.textContent; } smartbtnAssistantRenderQuickPhrases([]); return; } if (greetingNode) { greetingNode.textContent = smartbtnAssistantResolveGreeting(assistant); messageGreeting = greetingNode.textContent; } smartbtnAssistantRenderQuickPhrases(smartbtnAssistantResolveQuickPhrases(assistant));}\/* D-06\/D-07: sets up the sole matchMedia breakpoint listener and applies the current profile's geometry\/visibility once, synchronously. Deliberately placed HERE rather than up with the language bootstrap near the top of this file: every symbol it touches (SMARTBTN_LAUNCHER_POSITION_CSS and the rest of this module) is a plain top-level `var`\/`function` textually ABOVE this line, so by the time this statement runs every one of them is already initialized -- a `var`'s hoisting only reserves the binding, not its value, so calling into this module any earlier in the file (before its own initializer
16s have run) would read those constants as `undefined`. The widget's whole markup is already in the document by the time this file runs regardless (layout.blade.php inserts it, then appends this <script>), so nothing is lost by initializing this module last. A disabled\/absent envelope attaches no listener and touches no element (see smartbtnDeviceProfileInit()). *\/try { smartbtnDeviceProfileInit();} catch (smartbtnDeviceProfileBootstrapError) { \/* Never let a device-profile defect take the widget down; the launcher\/ chat simply keep their pre-existing legacy geometry. *\/}\/* fix\/widget-late-injection: the launcher-reveal dispatch. Deliberately the LAST statement in this file, because that is the precondition the old \"load\" listener always had -- by the time load fired, the whole file had been evaluated. Running the already-loaded path from here reproduces that exact state instead of running the body halfway through the file. readyState \"complete\" is the one value that means load has fired (or is about to, in this same task); \"loading\" and \"interactive\" both still have a load event coming, so those keep the listener and behave exactly as before for every site that pastes the snippet into its markup. *\/if (document.readyState === \"complete\") { smartbtnBootLauncherReveal();} else { window.addEventListener(\"load\", smartbtnBootLauncherReveal);}"; 17document.body.appendChild(JSscript); 18var JSdownload = document.createElement('script'); 19JSdownload.type = 'text/javascript'; 20JSdownload.innerText = "\/* Export only the customer-visible messages already loaded in this widget. * This never requests history, reads cookies or serializes transport envelopes. *\/function createChatArchive(chatContainer) { if (!chatContainer || chatContainer.id !== \"js-smartbtn-chat-box\" || !chatContainer.closest(\"#smartbtn_widget_view\")) { return \"\"; } var messageSelector = \".new_smartbtn_widget_operator-message, .new_smartbtn_widget_client-message\"; function excluded(node) { if (!node || node.nodeType !== 1) { return false; } if (node.matches(\"[hidden], [aria-hidden='true'], [data-private], [data-smartbtn-private], script, style, input, textarea, select, iframe, object, .new_smartbtn_widget_client-message-no-connection, .new_smartbtn_widget_client-message_file_socket_error\")) { return true; } var style = window.getComputedStyle(node); return style.display === \"none\" || style.visibility === \"hidden\" || style.visibility === \"collapse\"; } function readable(node, message) { if (node.nodeType === 3) { return node.nodeValue || \"\"; } if (node.nodeType !== 1 || excluded(node) || (node !== message && node.matches(messageSelector))) { return \"\"; } if (node.tagName === \"BR\") { return \"\\n\"; } if (node.tagName === \"IMG\") { return \"[\" + smartbtnI18n(\"archive_attachment\") + \"]\"; } var text = Array.prototype.map.call(node.childNodes, function (child) { return readable(child, message); }).join(\"\"); return \/^(P|DIV|LI|PRE|BLOCKQUOTE)$\/.test(node.tagName) ? text + \"\\n\" : text; } var lines = []; Array.prototype.forEach.call(chatContainer.children, function (message) { if (!message.matches(messageSelector) || excluded(message)) { return; } var isOperator = message.classList.contains(\"new_smartbtn_widget_operator-message\"); var bubbleClass = isOperator ? \".new_smartbtn_widget_operator-message__message\" : \".new_smartbtn_widget_client-message__message\"; var parts = []; message.querySelectorAll(bubbleClass + \", .smartbtn-widget-message-button\").forEach(function (bubble) { \/* Do not cross a nested message boundary or hidden\/private wrapper. *\/ if (bubble.closest(messageSelector) !== message) { return; } var ancestor = bubble; while (ancestor && ancestor !== chatContainer) { if (excluded(ancestor)) { return; } ancestor = ancestor.parentElement; } var text = readable(bubble, message).replace(\/\\r\\n?\/g, \"\\n\").replace(\/[ \\t]+\\n\/g, \"\\n\").trim(); if (text) { parts.push(text); } }); if (parts.length) { lines.push((isOperator ? smartbtnI18n(\"archive_operator\") : smartbtnI18n(\"archive_you\")) + \": \" + parts.join(\"\\n\")); } }); return lines.join(\"\\n\\n\");}(function () { document.addEventListener(\"click\", function (event) { var button = event.target.closest && event.target.closest(\"[data-smartbtn-chat-download]\"); if (!button) { return; } var root = button.closest(\"#smartbtn_widget_view\"); var chat = root && root.querySelector(\"#js-smartbtn-chat-box\"); if (!chat || !chat.contains(button)) { return; } var status = chat.querySelector(\"[data-smartbtn-chat-download-status]\"); var text = createChatArchive(chat); if (!text) { if (status) { status.textContent = smartbtnI18n(\"archive_empty\"); } return; } var url = null;
20 try { \/* A fixed basename contains no customer data, paths or control characters. *\/ url = URL.createObjectURL(new Blob([text + \"\\n\"], {type: \"text\/plain;charset=utf-8\"})); var link = document.createElement(\"a\"); link.href = url; link.download = \"smartbtn-chat.txt\"; root.appendChild(link); link.click(); link.remove(); if (status) { status.textContent = smartbtnI18n(\"archive_saved\"); } } catch (error) { if (status) { status.textContent = smartbtnI18n(\"archive_failed\"); } } finally { if (url) { window.setTimeout(function () { URL.revokeObjectURL(url); }, 1000); } } });})();const HEIGHT_HEADER_D = 100;const HEIGHT_SENDER_D = 130;const HEIGHT_SENDER_SMALL_D = 35;const HEIGHT_TAB_D = 43;function clickMoreBtn() { chatbox = document.querySelector(\"#smartbtn_widget_chat__box\"); let elementChat = document.querySelector(\"#js-smartbtn-chat-box\"); if(chatbox.style.display == \"none\"){ chatbox.style.display = \"flex\"; if (elementChat) { elementChat.scrollTop = 0; } }else{ chatbox.style.display = \"none\"; if (elementChat) { elementChat.scrollTop = elementChat.scrollHeight * 2; } }}function new_smartbtn_widget_phone_f() { const getPhoneNumber = document.getElementById(\"new_smartbtn_widget_phone\").attributes.dataphone.value; window.open(\"tel:\" + getPhoneNumber,\"_self\",\"\",false);}function delScrollDocument(deviceSmartbtn){ if(deviceSmartbtn === \"desktop\"){ var elementSmartBtnWidget = document.querySelector(\"#smartbtn_widget_view\"); var leftWidget = elementSmartBtnWidget.offsetLeft; document.querySelector(\".new_smartbtn_widget_view\").addEventListener(\"mouseenter\", function( event ) { }); document.querySelector(\".new_smartbtn_widget_view\").addEventListener(\"mouseleave\", function( event ) { }); }else{ let heightDocument = document.querySelector(\".new_smartbtn_widget_view\").offsetHeight; document.querySelector(\"#smartbtn_widget_view\").style.height =\"100%\"; }}function newSmartbtnWidgetSetHeightMapDeviceD(heightChat = null){ if (document.querySelector(\"#js-smartbtn-map-box\").classList.contains(\"smartbtn-chat-main__container-active-box\")){ }else { return; } const elWidget = document.querySelector(\"#smartbtn_widget_view\"); if (elWidget.classList.contains(\"new_smartbtn_widget_view--opened\")){ }else{ return; } let heightHeader = 0; let heightSender = 0; if ((screen.height - getviewPortHeightD()) > 150){ heightSender = 80; document.querySelector(\"#new_smartbtn_widget_view__map_container\").style.height = \"80px\"; heightHeader = 0; }else{ heightSender = 130; document.querySelector(\"#new_smartbtn_widget_view__map_container\").style.height = \"\"; heightHeader = HEIGHT_HEADER_D; } const heightMap = getviewPortHeightD() - HEIGHT_TAB_D - heightHeader - HEIGHT_SENDER_SMALL_D; const newSmartbtnWidgetMap = heightMap - heightSender; document.querySelector(\"#js-smartbtn-map-box\").style.height = heightMap + \"px\"; document.querySelector(\"#new_smartbtn_widget_map\").style.height = `${newSmartbtnWidgetMap}px`; document.querySelector(\".new_smartbtn_widget_view__map\").style.height = heightMap + \"px\"; myMap.container.fitToViewport();}function newSmartbtnWidgetSetHeightMap(){ const elWidget = document.querySelector(\"#smartbtn_widget_view\"); if (elWidget.classList.contains(\"new_smartbtn_widget_view--opened\")){ }else{ return; } let header = document.querySelector(\".new_smartbtn_widget_view__header\"); let sender = document.querySelector(\".smartbtn-chat-main__container-socials-and-post-message\"); let childSender = document.querySelector(\".smartbtn-chat-main__container-socials-and-post-message-new-message-svg\"); let heightHeader = 0; if (header.style.display != \"none\"){ heightHeader = HEIGHT_HEADER_D; } let heightSender = 0; if (childSender.style.display != \"none\"){ heightSender = HEIGHT_SENDER_D; } const heightWidget = document.querySelector(\".new_smartbtn_widget_view\").getBoundingClientRect().height; const heightMap = heightWidget - heightHeader - HEIGHT_TAB_D - heightSender; document.querySelector(\"#js-smartbtn-map-box\").style.height = heightMap + \"px\"; document.querySelector(\"#new_smartbtn_widget_map\").style.minHeight = heightMap + \"px\"; document.querySelector(\"#new_smartbtn_widget_map\").style.maxHeight = heightMap + \"px\";}var textBox = null;var myTimer = null;function detectBrowser() { var chrome = \/chrome\/.test(navigator.userAgent.toLowerCase()); var safari = \/safari\/.test(navigator.userAgent.toLowerCase()); var firefox = \/firefox\/.test(navigator.userAgent.toLowerCase()); var opera = \/opr\/.test(navigator.userAgent.toLowerCase()); var msie = \/msie\/.test(navigator.userAgent.toLowerCase()) || \/trident\/.test(navigator.userAgent.toLowerCase()) || \/.net\/.test(navigator.userAgent.toLowerCase()); var edge = \/edge\/.test(navigator.userAgent.toLowerCase()); var yandex = \/yabrowser\/.test(navigator.userAgent.toLowerCase()); if(yandex){ return \"yandex\"; } if(opera){ return \"opera\"; } if(edge){ return \"edge\"; } if(chrome){ return \"chrome\"; } if(safari){ return \"safari\"; } if(firefox){ return \"firefox\"; } if(msie){ return \"msie\"; } return \"noname\";}if(screen.width <= 480) { document.querySelector(\"#js-smartbtn-message\").addEventListener(\"focus\", (e) => { smartbtnWithProviderStrip(function (providerStrip) { providerStrip.style.opacity = \"0.1\"; }); }); document.querySelector(\"#js-smartbtn-message\").addEventListener(\"focusout\", (e) => { smartbtnWithProviderStrip(function (providerStrip) { providerStrip.style.opacity = \"1\"; }); const element = document.getElementById(\"js-smartbtn-send-message\"); if (element.parentNode.matches(\":hover\")) { element.click(); } });}else{ document.querySelector(\"#js-smartbtn-message\").addEventListener(\"focus\", (e) => { smartbtnWithProviderStrip(function (providerStrip) { providerStrip.style.opacity = \"0.1\"; }); }); document.querySelector(\"#js-smartbtn-message\").addEventListener(\"focusout\", (e) => { smartbtnWithProviderStrip(function (providerStrip) { providerStrip.style.opacity = \"1\"; }); });}smartbtnWithProviderStrip(function (providerStrip) { providerStrip.style.opacity = \"1\";});
20function getviewPortHeightD(){ if (window.visualViewport && window.visualViewport.height){ return window.visualViewport.height; }else{ return window.innerHeight; }}function setCSSInitWidgetD(e = null){ const elWidget = document.querySelector(\"#smartbtn_widget_view\"); if (elWidget.classList.contains(\"new_smartbtn_widget_view--opened\")){ }else{ return; } \/* The single source of truth is setCSSInitWidget() in script.js (tab bar counted only when rendered, panel follows visualViewport.offsetTop, history kept at its end). This copy stays only as a fallback for the case that script.js is not loaded, which the served blob never produces. *\/ if (typeof setCSSInitWidget === \"function\"){ setCSSInitWidget(e); return; } let header = document.querySelector(\".new_smartbtn_widget_view__header\"); let chat = document.querySelector(\"#js-smartbtn-chat-box\"); let btns = chat.previousElementSibling; let sender = document.querySelector(\".smartbtn-chat-main__container-socials-and-post-message\"); let childSender = document.querySelector(\".smartbtn-chat-main__container-socials-and-post-message-new-message-svg\"); let heightChat = 0; if (screen.width <= 480){ if ((screen.height - getviewPortHeightD()) > 150){ \/** \u044d\u0442\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u0430 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0430 *\/ header.style.display = \"none\"; }else{ header.style.display = \"flex\"; } document.querySelector(\"#smartbtn_widget_view\").style.top = 0; document.querySelector(\"#smartbtn_widget_view\").style.height = getviewPortHeightD() + \"px\"; document.querySelector(\".new_smartbtn_widget_view_width\").style.height = getviewPortHeightD() + \"px\"; sender.style.height = `${HEIGHT_SENDER_D}px`; header.style.height = `${HEIGHT_HEADER_D}px`; btns.style.height = `${HEIGHT_TAB_D}px`; let heightHeader = 0; if (header.style.display != \"none\"){ heightHeader = HEIGHT_HEADER_D; } let heightSender = 0; if (childSender.style.display != \"none\"){ heightSender = HEIGHT_SENDER_D; sender.style.height = `${HEIGHT_SENDER_D}px`; }else{ heightSender = HEIGHT_SENDER_SMALL_D; sender.style.height = `${HEIGHT_SENDER_SMALL_D}px`; } heightChat = getviewPortHeightD() - heightSender - HEIGHT_TAB_D - heightHeader; elementS = document.querySelectorAll(\".smartbtn-chat-main__container-chat\"); if (e){ elementS.forEach((el) => { let heightEl = heightChat; if (e.attributes.dataBtn.value == el.attributes.dataBtnContainer.value && el.attributes.dataBtnContainer.value !== \"map\"){ el.style.height = heightEl + \"px\"; } }); }else{ elementS.forEach(el => { let heightEl = heightChat; if (el.classList.contains(\"smartbtn-chat-main__container-active-box\") && el.attributes.dataBtnContainer.value !== \"map\"){ el.style.height = heightEl + \"px\"; } }); } newSmartbtnWidgetSetHeightMapDeviceD(); }}var documentRaiting = null;var clickMenu = 0;var clickMenuParent = 0;let ticking = false;const elWidgetGlobal = document.querySelector(\"#smartbtn_widget_view\");\/* fix\/widget-late-injection: same defect as smartbtnBootLauncherReveal() in script.js, and it has to be fixed here too or the fix there is useless. This body is what wires the launcher's click handler, the mobile back button, the more-menu and the resize\/scroll bookkeeping. On a page that injects our <script> after window \"load\" (tag manager, SPA route change) it never ran, so even a launcher that was made visible would have been a dead pixel. Dispatch lives at the END of this file; the counter is the re-entry guard, and it matters more here than in script.js: this body calls addEventListener on real elements, so a second run would double-bind every one of them (one click toggling the menu open and shut again). Read smartbtnChatUiBootCount. *\/var smartbtnChatUiBootCount = 0;function smartbtnBootChatUi() { if (smartbtnChatUiBootCount > 0) { return; } smartbtnChatUiBootCount = smartbtnChatUiBootCount + 1; var deviceSmartbtn = \"mobile\"; let mobileDocument = document.querySelector(\"#smartbtn_widget_view\"); if (\/Android|webOS|iPhone|iPad|iPod|BlackBerry|BB|PlayBook|IEMobile|Windows Phone|Kindle|Silk|Opera Mini\/i.test(navigator.userAgent) || screen.width <= 480) { deviceSmartbtn = \"mobile\"; document.querySelector(\"#js-back-view\").addEventListener(\"click\", function (e) { e.preventDefault(); \/* smartbtnCloseChat() (inline onclick, runs first on this same click) may intercept the close to show the rating prompt and set closeInterceptPending; script.js's own close listener then keeps the panel open. This listener must not hide the panel in that case: doing so left the fullscreen wallpaper overlay (cleared only by script.js's listener via unsetmetaWidget) with
20nothing to tap. *\/ if (typeof closeInterceptPending !== \"undefined\" && closeInterceptPending){ return; } mobileDocument.style.display = \"none\"; }); document.querySelector(\"#js-phone-btn\").addEventListener(\"click\", function () { mobileDocument.style.marginLeft = \"0px\"; mobileDocument.style.display = \"flex\"; }); } else { deviceSmartbtn = \"desktop\"; delScrollDocument(deviceSmartbtn); newSmartbtnWidgetSetHeightMap(); window.addEventListener(\"resize\", function( event ) { delScrollDocument(deviceSmartbtn); setCSSInitWidgetD(); }); } documentRaiting = document.querySelector(\".new_smartbtn_widget_chat__raiting\"); if (document.querySelector(\"#new_smartbtn_widget_more-btn_menu\")){ document.querySelector(\"#new_smartbtn_widget_more-btn_menu\").addEventListener(\"click\", function (e) { let documentMenu = document.querySelector(\"#new_smartbtn_widget_more-btn_hide_menu\"); if(clickMenu === 0 && clickMenuParent === 0){ clickMenu = 1; documentMenu.style.display = \"flex\"; }else{ clickMenu = 0; documentMenu.style.display = \"none\"; } }); } document.querySelector(\"#smartbtn_widget_view\").addEventListener(\"click\", function (e) { let documentMenu = document.querySelector(\"#new_smartbtn_widget_more-btn_hide_menu\"); if(documentMenu){ documentMenu.style.display = \"none\"; } if(clickMenu === 0){ clickMenuParent = 0; }else{ clickMenuParent = 1; } clickMenu = 0; },{capture: true});}function operatorMessageHeart(){ if(documentRaiting){ documentRaiting.style.display = \"flex\"; isSeeRating = true; if (myTimer){ clearInterval(myTimer); } myTimer = setTimeout(()=>{ documentRaiting.style.display = \"none\"; },15000); }}function moveCaretToStart(el) { if (typeof el.selectionStart == \"number\") { el.selectionStart = el.selectionEnd = 0; } else if (typeof el.createTextRange != \"undefined\") { el.focus(); var range = el.createTextRange(); range.collapse(true); range.select(); }}function windowCheckOnOrientation() { var getDevice = navigator.userAgent.toLowerCase(); const iPhone = getDevice.includes(\"iphone\"); const android = getDevice.includes(\"android\"); let getHeightWindow = window.innerHeight; let getHeight = screen.height; if(iPhone == true) { if(getHeightWindow > 480) { document.getElementById(\"js-new_smartbtn_widget_view-shadow-for-mobiles\").classList.add(\"new_smartbtn_widget_view-shadow-for-mobiles-active\"); } else { document.getElementById(\"js-new_smartbtn_widget_view-shadow-for-mobiles\").classList.remove(\"new_smartbtn_widget_view-shadow-for-mobiles-active\"); } } else if(android == true) { if(getHeight <= 480) { document.getElementById(\"js-new_smartbtn_widget_view-shadow-for-mobiles\").classList.add(\"new_smartbtn_widget_view-shadow-for-mobiles-active\"); } else { document.getElementById(\"js-new_smartbtn_widget_view-shadow-for-mobiles\").classList.remove(\"new_smartbtn_widget_view-shadow-for-mobiles-active\"); } } else { if(getHeight <= 480) { document.getElementById(\"js-new_smartbtn_widget_view-shadow-for-mobiles\").classList.add(\"new_smartbtn_widget_view-shadow-for-mobiles-active\"); } else { document.getElementById(\"js-new_smartbtn_widget_view-shadow-for-mobiles\").classList.remove(\"new_smartbtn_widget_view-shadow-for-mobiles-active\"); } }}window.addEventListener(\"orientationchange\", function() { doOnOrientationChange();});function doOnOrientationChange() { switch(window.orientation) { case -90: case 90: document.getElementById(\"js-new_smartbtn_widget_view-shadow-for-mobiles\").classList.add(\"new_smartbtn_widget_view-shadow-for-mobiles-active\"); break; default: document.getElementById(\"js-new_smartbtn_widget_view-shadow-for-mobiles\").classList.remove(\"new_smartbtn_widget_view-shadow-for-mobiles-active\"); break; }}function createRatingMessage(local, operatorId = lastOperatorId, operatorAvatar = null, nodeElementOperator = null){ const elementRateWrapper = document.querySelectorAll(\".new_smartbtn_widget_rating-message\"); if(intervalForRating){ clearTimeout(intervalForRating); } if(myTimerRatingTitle){ clearTimeout(myTimerRatingTitle); } if(elementRateWrapper){ elementRateWrapper.forEach(rateWrapper => { rateWrapper.remove(); }); } operatorAvatar = smartbtnResolveOperatorAvatar(operatorId, operatorAvatar); const elementInsert = document.createElement(\"div\"); elementInsert.className = \"new_smartbtn_widget_rating-message\"; const ratingMessage = document.createElement(\"div\"); ratingMessage.className = \"new_smartbtn_widget_rating-message__message\"; ratingMessage.style.wordBreak = \"break-word\"; const title = document.createElement(\"p\"); title.className = \"new_smartbtn_widget_chat__raiting-title\"; title.textContent = smartbtnI18n(\"rating_prompt\"); const ratingRow = document.createElement(\"div\"); ratingRow.className = \"new_smartbtn_widget_chat__raiting\"; ratingRow.style.cssText = \"display:flex;flex-direction:row\"; const avatarWrapper = document.createElement(\"div\"); avatarWrapper.className = \"new_smartbtn_widget_operator-message__typing\"; avatarWrapper.style.marginTop = \"-10px\"; const avatar = document.createElement(\"div\"); avatar.className = \"new_smartbtn_widget_operator-message__ava\"; if (operatorAvatar) { avatar.style.backgroundImage = `url(\"${operatorAvatar}\")`; } avatarWrapper.appendChild(avatar); const ratingInputs = document.createElement(\"div\"); ratingInputs.className = \"new_smartbtn_widget_rate\";
20 ratingInputs.setAttribute(\"datasenderid\", String(operatorId)); for (let value = 5; value >= 1; value--) { const input = document.createElement(\"input\"); input.className = \"new_smartbtn_widget_approve\"; input.type = \"radio\"; input.id = `star${value}`; input.name = \"rate\"; input.value = String(value); input.addEventListener(\"click\", function () { rateOperator(this); }); const label = document.createElement(\"label\"); label.setAttribute(\"for\", input.id); const starLabel = smartbtnI18n(\"rating_star_label\", {value: value}); label.title = starLabel; label.setAttribute(\"aria-label\", starLabel); label.textContent = \"\u2605\"; ratingInputs.appendChild(input); ratingInputs.appendChild(label); } ratingRow.appendChild(avatarWrapper); ratingRow.appendChild(ratingInputs); ratingMessage.appendChild(title); ratingMessage.appendChild(ratingRow); elementInsert.appendChild(ratingMessage); if (!nodeElementOperator){ document.querySelector(\"#js-smartbtn-chat-box\").appendChild(elementInsert); }else{ nodeElementOperator.parentElement.parentElement.insertAdjacentElement(\"afterend\", elementInsert); } \/* document.querySelector(\".new_smartbtn_widget_rating-message\").scrollIntoView(true);*\/ let target = document.querySelector(\".new_smartbtn_widget_rating-message\"); target.parentNode.scrollTop = target.offsetTop + 90;}function rateOperator(el){ const operatorId = el.parentElement.attributes.datasenderid.value; let message = { type: \"rating\", widgetID: widgetID, body: parseInt(el.value), operatorId: operatorId, clientID: SmartBtnClient, }; if (Socket.readyState === 1) { Socket.send(JSON.stringify(message)); } if(intervalForRating){ clearTimeout(intervalForRating); } closeOperatorMessageHeart();}let alreadyShowedRatingMessage = 1;function showRatingMessage(){ if (alreadyShowedRatingMessage === 1){ if (enableToShowRating===true){ createRatingMessage(local); alreadyShowedRatingMessage+=1; } }}\/* fix\/widget-late-injection: the chat-UI wiring dispatch, last statement in the file for the same reason as in script.js -- smartbtnBootChatUi() calls delScrollDocument(), newSmartbtnWidgetSetHeightMap() and setCSSInitWidgetD(), which are all declared further down than the old listener was. Under the old \"load\" gate the whole file was always evaluated first; dispatching from the end keeps that true on the immediate path too. *\/if (document.readyState === \"complete\") { smartbtnBootChatUi();} else { window.addEventListener(\"load\", smartbtnBootChatUi);}"; 21document.body.appendChild(JSdownload); 22var visitorScript = document.createElement('script'); 23visitorScript.type = 'text/javascript'; 24visitorScript.innerText = "(function (config) {\n 'use strict';\n try {\n \/* The track endpoint accepts only the hosts in config.hosts (VisitorMetadata::allowedHosts).\n On any other page every request is a guaranteed 403, so do nothing at all: no request,\n no timer, no listener, no beacon. No line comments in this file: the widget inlines it\n with innerText, which drops the newlines. *\/\n if (!config || !hostAllowed(config.hosts)) { return; }\n var installed = window.__smartbtnVisitors || (window.__smartbtnVisitors = {});\n if (installed[config.widget]) { return; }\n installed[config.widget] = true;\n var tab = randomId(), pageId = randomId(), sentPage = false, lastLocation = '', pending = [], sending = false, retryAt = 0, stopped = false, initial = 0, heartbeat = 0;\n function hostAllowed(hosts) {\n var host = String(window.location.hostname || '').toLowerCase(), i;\n if (!host || !Array.isArray(hosts)) { return false; }\n if (\/[^\\x00-\\x7f]\/.test(host)) { host = new URL('http:\/\/' + host + '\/').hostname; }\n for (i = 0; i < hosts.length; i++) { if (typeof hosts[i] === 'string' && hosts[i].toLowerCase() === host) { return true; } }\n return false;\n }\n function stop() {\n stopped = true;\n pending = [];\n window.clearInterval(initial);\n window.clearInterval(heartbeat);\n }\n function randomId() {\n var bytes = new Uint8Array(16), result = '', i;\n if (window.crypto && window.crypto.getRandomValues) { window.crypto.getRandomValues(bytes); }\n else { for (i = 0; i < bytes.length;
24 i++) { bytes[i] = Math.floor(Math.random() * 256); } }\n for (i = 0; i < bytes.length; i++) { result += ('0' + bytes[i].toString(16)).slice(-2); }\n return result;\n }\n function identity() {\n var value = null, match;\n try { if (typeof SmartBtnClient !== 'undefined') { value = SmartBtnClient; } } catch (ignore) {}\n if (!value) { try { match = document.cookie.match(\/(?:^|;\\s*)SmartBtnClient=([^;]+)\/); value = match ? decodeURIComponent(match[1]) : null; } catch (ignore) {} }\n return typeof value === 'string' && \/^[a-zA-Z0-9_-]{16,64}$\/.test(value) ? value : null;\n }\n function cleanUrl(value) {\n try { var url = new URL(value); return \/^(http:|https:)$\/.test(url.protocol) && !url.username && !url.password ? url.origin + url.pathname : ''; } catch (ignore) { return ''; }\n }\n function locationKey() { return window.location.pathname + window.location.search + window.location.hash; }\n function event(kind) {\n return { guid: identity(), tab_id: tab, event_id: kind === 'page' ? pageId : randomId(), kind: kind, visible: !document.hidden, url: cleanUrl(window.location.href), title: (document.title || '').slice(0, 1024), referrer: cleanUrl(document.referrer), language: (navigator.language || '').slice(0, 35) };\n }\n function drain() {\n if (stopped || sending || !pending.length || Date.now() < retryAt) { return; }\n var item = pending[0];\n if (!item.guid) { item.guid = identity(); }\n if (!item.guid) { return; }\n sending = true;\n var xhr = new XMLHttpRequest();\n xhr.open('POST', config.endpoint, true);\n xhr.setRequestHeader('Content-Type', 'text\/plain;charset=UTF-8');\n xhr.timeout = 8000;\n function done(success, retry) {\n sending = false;\n if (success || !retry) { pending.shift(); }\n if (retry) { retryAt = Date.now() + 15000; }\n else { drain(); }\n }\n \/* 403 = this page may not report for this widget; asking again cannot change that. *\/\n xhr.onload = function () { if (xhr.status === 403) { sending = false; stop(); return; } done(xhr.status >= 200 && xhr.status < 300, xhr.status === 0 || xhr.status === 429 || xhr.status >= 500); };\n xhr.onerror = xhr.ontimeout = function () { done(false, true); };\n try { xhr.send(JSON.stringify(item)); } catch (ignore) { done(false, true); }\n }\n function enqueue(kind) {\n if (stopped || !identity()) { return; }
24\n var item = event(kind);\n if (pending.length >= 12) { pending.splice(1, 1); }\n pending.push(item);\n drain();\n }\n function checkPage() {\n if (stopped || !identity()) { return; }\n var current = locationKey();\n if (!sentPage || current !== lastLocation) {\n pageId = randomId(); lastLocation = current; sentPage = true; enqueue('page');\n }\n }\n function navigation() { window.setTimeout(checkPage, 0); }\n ['pushState', 'replaceState'].forEach(function (method) {\n var original = window.history[method];\n window.history[method] = function () { var result = original.apply(this, arguments); navigation(); return result; };\n });\n window.addEventListener('popstate', navigation);\n window.addEventListener('hashchange', navigation);\n document.addEventListener('visibilitychange', function () { checkPage(); enqueue('heartbeat'); });\n window.addEventListener('pageshow', function () { checkPage(); enqueue('heartbeat'); });\n window.addEventListener('pagehide', function () {\n if (stopped || !identity()) { return; }\n try {\n if (navigator.sendBeacon) {\n pending.forEach(function (item) { navigator.sendBeacon(config.endpoint, JSON.stringify(item)); });\n navigator.sendBeacon(config.endpoint, JSON.stringify(event('leave')));\n }\n } catch (ignore) {}\n });\n var initialAttempts = 0;\n initial = window.setInterval(function () { checkPage(); if (stopped || sentPage || ++initialAttempts >= 240) { window.clearInterval(initial); } }, 500);\n heartbeat = window.setInterval(function () { if (stopped) { return; } checkPage(); if (sentPage) { enqueue('heartbeat'); } drain(); }, 25000);\n checkPage();\n } catch (ignore) {}\n}({\"widget\":\"2331c204150c0fab02304984d6dc330a\",\"endpoint\":\"https:\\\/\\\/smartbtn.ru\\\/api\\\/visitors\\\/track\\\/2331c204150c0fab02304984d6dc330a\",\"hosts\":[\"smartbtn.ru\",\"www.smartbtn.ru\"]}));\n"; 25document.body.appendChild(visitorScript); 26/* Scoped to the widget subtree: the rating inputs (#star1..5) are created 27 later by download-chat.js INSIDE #smartbtn_widget_view, so at this point an 28 unscoped `#star${rating}` lookup could only ever hit a HOST-page element 29 that happens to share the id -- and set .checked on it. */ 30if(rating > 0 && document.querySelector(`#smartbtn_widget_view #star${rating}`)){ 31 document.querySelector(`#smartbtn_widget_view #star${rating}`).checked = true; 32}
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.