<!-- copilp.ru DEV MODS · Промокод в один клик · v1.1.0 -->
<script>
/* ============================================================
DEV MODS · Промокод в один клик · v1.1.0
------------------------------------------------------------
Как подключить:
1) Добавьте элементу класс dev-promo (Zero Block: настройки
элемента, вкладка «Ещё», поле «CSS-класс»).
2) Промокод берётся из атрибута data-promo. Если атрибута нет,
скопируется текст самого элемента.
Настройка внешнего вида всплывашки — объект CONFIG ниже.
============================================================ */
(function () {
'use strict';
/* ============================================================
НАСТРОЙКИ ВНЕШНЕГО ВИДА ВСПЛЫВАШКИ
------------------------------------------------------------
Цвета можно задавать в любом CSS-формате:
'#20272e' | 'rgb(32,39,46)' | 'rgba(32,39,46,.95)' | 'black'
============================================================ */
var CONFIG = {
// Цвет текста
textColor: '#ffffff',
// Цвет фона плашки
bgColor: '#20272e',
// Цвет обводки (рамки)
borderColor: 'rgba(119,237,108,.55)',
// Толщина обводки
borderWidth: '1px',
// Радиус скругления
borderRadius: '12px',
// Сколько мс висит уведомление
toastLife: 2200,
// Шрифт
fontFamily: '"Gilroy","Gilroy-Regular",-apple-system,BlinkMacSystemFont,"Segoe UI",Arial,sans-serif',
fontWeight: '500',
fontSize: '15px'
};
/* ============================================================ */
/* ---------- уведомление ---------- */
var toast = null;
function ensureToast() {
if (toast) return toast;
var st = document.createElement('style');
st.textContent =
'.dev-promo-toast{position:fixed;left:50%;bottom:28px;transform:translate(-50%,16px);' +
'opacity:0;pointer-events:none;transition:opacity .25s ease,transform .25s ease;' +
'background:' + CONFIG.bgColor + ';' +
'color:' + CONFIG.textColor + ';' +
'border:' + CONFIG.borderWidth + ' solid ' + CONFIG.borderColor + ';' +
'border-radius:' + CONFIG.borderRadius+ ';' +
'padding:12px 22px;' +
'font-family:' + CONFIG.fontFamily + ';' +
'font-weight:' + CONFIG.fontWeight + ';' +
'font-size:' + CONFIG.fontSize + ';' +
'letter-spacing:.2px;' +
'line-height:1.4;z-index:99999;' +
'box-shadow:0 14px 44px rgba(0,0,0,.45);max-width:90vw;text-align:center}' +
'.dev-promo-toast.dev-show{opacity:1;transform:translate(-50%,0)}';
document.head.appendChild(st);
toast = document.createElement('div');
toast.className = 'dev-promo-toast';
toast.setAttribute('role', 'status');
toast.setAttribute('aria-live', 'polite');
document.body.appendChild(toast);
return toast;
}
function showToast(msg) {
var t = ensureToast();
t.textContent = msg;
t.classList.add('dev-show');
clearTimeout(showToast._tm);
showToast._tm = setTimeout(function () { t.classList.remove('dev-show'); }, CONFIG.toastLife);
}
/* ---------- копирование (с запасным вариантом) ---------- */
function copyText(text, done) {
if (navigator.clipboard && window.isSecureContext) {
navigator.clipboard.writeText(text).then(function () { done(true); }, function () { fallback(); });
} else { fallback(); }
function fallback() {
var ta = document.createElement('textarea');
ta.value = text;
ta.style.position = 'fixed';
ta.style.opacity = '0';
document.body.appendChild(ta);
ta.select();
var ok = false;
try { ok = document.execCommand('copy'); } catch (e) {}
document.body.removeChild(ta);
done(ok);
}
}
/* ---------- клик по любому .dev-promo на странице ---------- */
document.addEventListener('click', function (e) {
var el = e.target.closest ? e.target.closest('.dev-promo') : null;
if (!el) return;
e.preventDefault();
var code = el.getAttribute('data-promo') || (el.textContent || '').trim();
if (!code) return;
copyText(code, function (ok) {
showToast(ok ? 'Промокод «' + code + '» скопирован' : 'Не удалось скопировать. Выделите код вручную');
if (ok) {
el.classList.add('dev-promo-done');
setTimeout(function () { el.classList.remove('dev-promo-done'); }, 1200);
}
});
});
})();
</script>