(() => { const STYLES = ` @import url('https://fonts.googleapis.com/css2?family=Nunito:ital,wght@0,200..1000;1,200..1000&display=swap'); @keyframes animBtn { from { left: -50%; } to { left: 100%; } } .cst-quantum-widget { position: fixed; z-index: 9999; width: 360px; display: flex; flex-direction: column; align-items: center; left: auto; right: 0; transform: none; right: 90px; bottom: 15px; } .cst-quantum__counter { border-radius: 50% !important; background: #fff !important; border: 3px solid #ee8b32 !important; box-shadow: 0 8px 24px 0 rgba(122, 74, 18, 0.18) !important; width: 208px !important; height: 208px !important; margin: 0 auto !important; display: flex !important; flex-direction: column !important; align-items: center !important; justify-content: center !important; cursor: pointer !important; margin-bottom: -27px !important; transition: all 0.4s ease !important; flex-shrink: 0; } .cst-quantum__counter-title { font-family: "Nunito", sans-serif !important; font-weight: 600 !important; font-size: 14px !important; line-height: 120% !important; text-align: center !important; color: #7c736b !important; margin-bottom: 0 !important; } .cst-quantum__counter-number { font-family: "Nunito", sans-serif !important; font-weight: 800 !important; font-size: 48px !important; line-height: 100% !important; text-align: center !important; color: #e06e12 !important; margin-bottom: 0 !important; } .cst-quantum__counter-text { font-family: "Nunito", sans-serif !important; font-weight: 700 !important; font-size: 17px !important; line-height: 120% !important; text-align: center !important; color: #2b2723 !important; margin-bottom: 0 !important; } .cst-quantum__info { border-radius: 24px !important; box-shadow: 0 8px 32px 0 rgba(122, 74, 18, 0.16) !important; background: #fff !important; padding: 24px 24px 42px !important; position: relative !important; width: 100% !important; max-width: 360px !important; margin: 0 auto !important; margin-bottom: -27px !important; transition: all 0.4s ease !important; opacity: 0; transform: translateY(50px); display: none !important; box-sizing: border-box; } .cst-quantum__info-desc { font-family: "Nunito", sans-serif; font-weight: 400; font-size: 15px; line-height: 140%; color: #7c736b; margin-bottom: 0 !important; margin-top: 9px !important; } .cst-quantum__close-btn-item { border: none !important; outline: none !important; margin: 0 !important; padding: 0 !important; min-height: 1px !important; box-shadow: none !important; position: relative !important; transition: all .3s !important; overflow: hidden !important; text-decoration: none !important; font-size: 0 !important; line-height: 0 !important; display: block !important; width: 13px !important; height: 13px !important; background: url('//fs.getcourse.ru/fileservice/file/download/a/298472/sc/416/h/20328a55b32af851901366343961d98b.svg') no-repeat !important; background-size: contain !important; cursor: pointer !important; position: absolute !important; right: 24px !important; top: 24px !important; } .cst-quantum__info-text { font-family: "Nunito", sans-serif !important; font-weight: 800 !important; font-size: 22px !important; line-height: 130% !important; color: #2b2723 !important; padding-right: 36px !important; margin: 0; margin-bottom: 0 !important; } .cst-quantum__link { border: none !important; outline: none !important; margin: 0 !important; padding: 16px 0 !important; min-height: 1px !important; box-shadow: none !important; position: relative !important; transition: all .3s !important; overflow: hidden !important; text-decoration: none !important; border-radius: 28px !important; width: 100% !important; box-shadow: 0 4px 12px 0 rgba(122, 74, 18, 0.22) !important; background: linear-gradient(180deg, #ee8b32 0%, #e06e12 100%) !important; font-family: "Nunito", sans-serif !important; font-weight: 700 !important; font-size: 16px !important; line-height: 120% !important; text-align: center !important; color: #fff !important; display: block !important; margin-top: 35px !important; } .cst-quantum__link::before { content: ''; position: absolute; left: 12px; top: 0; display: block; width: 100%; height: 100%; margin: 0; background: url('//fs.getcourse.ru/fileservice/file/download/a/11874/sc/477/h/8de7ccaeb23016d6ce6affdb6d169e0a.png') no-repeat; background-size: cover; animation: animBtn 1s infinite alternate; } .cst-quantum__decoration { border-radius: 50% !important; box-shadow: 0 4px 12px 0 rgba(122, 74, 18, 0.22) !important; width: 54px !important; margin: 0 auto !important; cursor: pointer !important; position: relative !important; z-index: 1 !important; flex-shrink: 0; } .cst-quantum__decoration-img { display: block !important; width: 100% !important; height: auto !important; } @media screen and (max-width: 768px) { .cst-quantum__decoration { width: 40px !important; } .cst-quantum__counter { width: 140px !important; height: 140px !important; margin-bottom: -22px !important; } .cst-quantum__counter-number { font-size: 38px !important; } .cst-quantum__counter-text { font-size: 14px !important; } .cst-quantum__info-text { font-size: 16px !important; padding-right: 36px !important; } .cst-quantum-widget { bottom: 15px; left: 50%; transform: translateX(-50%); z-index: 9999; width: 290px; } .cst-quantum__info-desc { font-size: 14px; } .cst-quantum__link { margin-top: 25px !important; } .cst-quantum__info { max-width: 290px !important; margin-bottom: -20px !important; } body .talks-widget-button { width: 40px !important; height: 40px !important; } } `; const pluralizeQuantum = (count) => { const num = parseInt(count, 10); const mod10 = num % 10; const mod100 = num % 100; if (mod10 === 1 && mod100 !== 11) { return 'квант'; } else if (mod10 >= 2 && mod10 <= 4 && (mod100 < 10 || mod100 >= 20)) { return 'кванта'; } else { return 'квантов'; } }; const createHTMLTemplate = (count) => { const quantumWord = pluralizeQuantum(count); return `

Вы накопили

${count}

${quantumWord}

Вы накопили ${count} ${quantumWord}

Это ваш вклад в людей!

Подробнее
`; }; class QuantumWidget { constructor(count) { this.count = count; this.elements = {}; this.isAnimating = false; this.init(); } init() { this.injectStyles(); this.injectHTML(); this.cacheElements(); this.checkStoredState(); this.bindEvents(); } injectStyles() { if (document.querySelector('#cst-quantum-styles')) return; const style = document.createElement('style'); style.id = 'cst-quantum-styles'; style.textContent = STYLES; document.head.appendChild(style); } injectHTML() { if (document.querySelector('.cst-quantum-widget')) return; const container = document.createElement('div'); container.innerHTML = createHTMLTemplate(this.count); document.body.appendChild(container.firstElementChild); } cacheElements() { this.elements = { widget: document.querySelector('.cst-quantum-widget'), counter: document.querySelector('.cst-quantum__counter'), info: document.querySelector('.cst-quantum__info'), decoration: document.querySelector('.cst-quantum__decoration'), closeBtn: document.querySelector('.cst-quantum__close-btn-item') }; } checkStoredState() { const hiddenUntil = localStorage.getItem('cstQuantumWidgetHiddenUntil'); if (hiddenUntil) { const now = new Date().getTime(); const hiddenUntilTime = parseInt(hiddenUntil, 10); if (now < hiddenUntilTime) { this.elements.counter.style.cssText = 'display: none !important; opacity: 0 !important; visibility: hidden !important;'; } else { localStorage.removeItem('cstQuantumWidgetHiddenUntil'); } } } bindEvents() { const { counter, info, decoration, closeBtn } = this.elements; decoration.addEventListener('click', () => { const isInfoVisible = info.style.display === 'block'; isInfoVisible ? this.hideInfo() : this.showInfo(); }); counter.addEventListener('click', () => this.showInfo()); closeBtn.addEventListener('click', (e) => { e.stopPropagation(); this.hideInfo(); }); } showInfo() { if (this.isAnimating) return; this.isAnimating = true; const { counter, info } = this.elements; counter.style.cssText = 'display: none !important;'; info.style.cssText = 'display: block !important; opacity: 0; transform: translateY(50px);'; void info.offsetWidth; info.style.cssText = 'display: block !important; opacity: 1 !important; transform: translateY(0) !important; transition: all 0.4s ease !important;'; setTimeout(() => this.isAnimating = false, 400); } hideInfo() { if (this.isAnimating) return; this.isAnimating = true; const { counter, info } = this.elements; const now = new Date(); const hiddenUntil = now.getTime() + (24 * 60 * 60 * 1000); localStorage.setItem('cstQuantumWidgetHiddenUntil', hiddenUntil.toString()); info.style.cssText = 'display: block !important; opacity: 0 !important; transform: translateY(50px) !important; transition: all 0.4s ease !important;'; setTimeout(() => { info.style.cssText = 'display: none !important;'; counter.style.cssText = 'display: none !important; opacity: 0 !important; visibility: hidden !important;'; setTimeout(() => this.isAnimating = false, 400); }, 400); } } const isEditMode = () => { return window.location.search.includes('editMode=1') || window.location.href.includes('editMode=1') || window.location.href.includes('editMode/1'); }; const isLessonPage = () => { return window.location.pathname.includes('/lesson/') || window.location.search.includes('lesson'); }; const isMainPage = () => { return window.location.pathname.includes('/stream/') || window.location.pathname.includes('/control/stream'); }; const extractNumber = (text) => { const match = text.match(/\d+/); return match ? match[0] : '0'; }; const fetchQuantumCount = () => { return new Promise((resolve) => { const checkCount = async () => { try { const response = await fetch('https://5-quantum.com/teach/control/stream'); const html = await response.text(); const parser = new DOMParser(); const doc = parser.parseFromString(html, 'text/html'); const titleElement = doc.querySelector('.cst-quantum__count'); if (!doc.querySelector('.cst-segment-36148243')) { return false; } if (titleElement) { const count = extractNumber(titleElement.textContent.trim()); resolve(count); return; } resolve('0'); } catch (error) { console.error('Failed to fetch quantum count:', error); resolve('0'); } }; checkCount(); }); }; const init = async () => { if (isEditMode() || (!isLessonPage() && !isMainPage())) return; const count = await fetchQuantumCount(); new QuantumWidget(count); }; init(); })();