Дата: Воскресенье, 01.02.2026, 15:11 | Сообщение # 1 |
|
Написал: Узнаваемый
Автор темы
Мурчанн
не в сети
Сообщений: 162
Внесены небольшие изменения во всплывающее окно. В этот раз дизайн выполнен в синих оттенках. Я делал его под свой шаблон, но вы без проблем можете изменить цветовую гамму под свои нужды. Со временем планирую выкладывать версии и в других цветах. Скрипт будет постепенно дорабатываться и улучшаться. Идея скрипта была взята из этой темы. Правда, сам скрипт там уже давно не работает — по сути, мёртвый голубчик. Тем не менее меня заинтересовала сама концепция и структура кода, а точнее - идея реализации модуля друзей. Логика работы у него предельно простая и понятная, работает как дважды два.Ссылка на тему Исходник скрипта .. Код
(function() { 'use strict'; window.friends = window.friends || {}; const f = window.friends; f.ucodes = f.ucodes || { homepage: '/', userid: 0, _userid: 0, username: 'Гость', _username: 'Гость', avatar: '//ucoz.net/i/noavatar.png', own: 0, isuser: false, _profurl: '' }; f.message1 = () => `Пользователь [url=${f.ucodes.homepage}index/8-${f.ucodes.userid}]${f.ucodes.username}[/url] добавил Вас в друзья.\nВы также можете его добавить по [url=${f.ucodes.homepage}index/8-${f.ucodes.userid}?friend]этой ссылке[/url].`; f.message2 = () => `Пользователь [url=${f.ucodes.homepage}index/8-${f.ucodes.userid}]${f.ucodes.username}[/url] добавил Вас в друзья.`; f.invite = false; f.adnMess = ''; f.GR = 'Друг'; f.seckey = ''; f.isAdding = false; // ── Стили + модалки ───────────────────────────────────────────────────── if (!document.getElementById('vk-friends-modals')) { const cont = document.createElement('div'); cont.id = 'vk-friends-modals'; cont.innerHTML = ` <style> /* Фон оверлея — чуть темнее и блюр посильнее для атмосферы */ .vk-overlay { position: fixed; inset: 0; background: rgba(0,0,0,0.45); z-index: 100000; display: none; justify-content: center; align-items: center; backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px); } /* Модалка — чуть больше, мягче тени */ .vk-modal { background: #ffffff; border-radius: 16px; box-shadow: 0 16px 48px rgba(0,0,0,0.22), 0 4px 16px rgba(0,0,0,0.08); width: 100%; max-width: 480px; max-height: 88vh; overflow-y: auto; position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; font-size: 15px; color: #050505; z-index: 100001; animation: vkModalAppear 0.28s cubic-bezier(0.25, 0.8, 0.25, 1); } /* Анимация — плавнее и с лёгкой пружинкой */ @keyframes vkModalAppear { from { opacity: 0; transform: translate(-50%, -50%) scale(0.94); } to { opacity: 1; transform: translate(-50%, -50%) scale(1); } } /* Шапка — современный синий ВК */ .vk-header { padding: 16px 20px; background: linear-gradient(to bottom, #0077ff, #0062d6); color: #ffffff; font-size: 17px; font-weight: 600; display: flex; align-items: center; justify-content: space-between; border-radius: 16px 16px 0 0; box-shadow: 0 2px 8px rgba(0,0,0,0.15); position: sticky; top: 0; z-index: 2; } /* Жёлтая плашка под шапкой — как старая "онлайн" / "был ..." */ .vk-status-bar { background: #f0c800; /* классический жёлтый ВК-онлайн 2010-2015 */ color: #1a1a1a; font-size: 13px; font-weight: 500; text-align: center; padding: 6px 0; border-bottom: 1px solid #e0b500; box-shadow: inset 0 1px 0 rgba(255,255,255,0.4); } /* Кнопка закрытия — белая в синей шапке */ .vk-close { width: 36px; height: 36px; background: transparent; border: none; font-size: 26px; color: #ffffff; cursor: pointer; border-radius: 50%; display: flex; align-items: center; justify-content: center; transition: background 0.16s, transform 0.16s; } .vk-close:hover { background: rgba(255,255,255,0.18); transform: rotate(90deg); } /* Тело */ .vk-body { padding: 20px; } /* Кнопки — современный ВК 2025–2026 */ .vk-btn { padding: 10px 24px; font-size: 15px; font-weight: 500; border-radius: 10px; cursor: pointer; border: none; transition: all 0.2s ease; min-width: 120px; box-shadow: 0 1px 4px rgba(0,0,0,0.1); } .vk-btn-primary { background: #0077ff; color: white; } .vk-btn-primary:hover { background: #0066dd; transform: translateY(-1px); box-shadow: 0 4px 12px rgba(0,119,255,0.3); } .vk-btn-primary:active { transform: translateY(0); } .vk-btn-secondary { background: #e4e6eb; color: #050505; } .vk-btn-secondary:hover { background: #d8dade; } /* Селект и инпуты — современные, с акцентом */ select, input, textarea { width: 100%; padding: 12px 14px; font-size: 15px; border: 1px solid #ccd0d5; border-radius: 10px; background: #ffffff; transition: all 0.18s; box-sizing: border-box; } select:focus, input:focus, textarea:focus { border-color: #0077ff; box-shadow: 0 0 0 3px rgba(0,119,255,0.14); outline: none; } select { appearance: none; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23666' d='M2 4l4 4 4-4z'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: right 14px center; padding-right: 36px; } textarea { min-height: 110px; resize: vertical; } /* Аватар — круглый + эффекты */ .vk-avatar { position: relative; } .vk-avatar img { width: 80px; height: 80px; border-radius: 50%; object-fit: cover; border: 3px solid #ffffff; box-shadow: 0 4px 12px rgba(0,0,0,0.12); transition: all 0.24s ease; } .vk-avatar img:hover { transform: scale(1.06); box-shadow: 0 8px 24px rgba(0,119,255,0.28); border-color: #0077ff; } /* Успешный попап — градиент синий */ .vk-success-modal .vk-header { background: linear-gradient(135deg, #0077ff, #0055cc); border-bottom: none; } .vk-success-icon { font-size: 72px; margin: 24px 0 16px; color: #0077ff; } .vk-success-title { font-size: 22px; font-weight: 700; margin-bottom: 12px; } .vk-success-text { font-size: 16px; color: #333; line-height: 1.5; } </style> <div id="vkOverlay" class="vk-overlay" onclick="friends.closeIfOverlay(event)"></div> <div id="addFriendModal" class="vk-modal" style="display:none;"> <div class="vk-header"> <span>Добавление в друзья</span> <button class="vk-close" onclick="friends.closeModal('addFriendModal')">×</button> </div> <div class="vk-body" id="addFriendBody"></div> </div> <div id="captchaModal" class="vk-modal" style="display:none; max-width:420px;"> <div class="vk-header"> <span>Подтверждение</span> <button class="vk-close" onclick="friends.closeModal('captchaModal')">×</button> </div> <div class="vk-body" id="captchaBody"></div> </div> <div id="successModal" class="vk-modal vk-success-modal" style="display:none; max-width:420px;"> <div class="vk-header"> <span>Успешно!</span> <button class="vk-close" onclick="friends.closeModal('successModal')">×</button> </div> <div class="vk-body" style="text-align:center;"> <div class="vk-success-icon"></div> <div class="vk-success-title">Друг добавлен</div> <div class="vk-success-text"> Запрос отправлен ${f.ucodes._username || 'пользователю'}<br> Всё прошло отлично, спасибо! </div> <button class="vk-btn vk-btn-primary" style="margin-top:20px;" onclick="friends.closeModal('successModal')"> Закрыть </button> </div> </div> `; document.body.appendChild(cont); document.addEventListener('keydown', e => { if (e.key === 'Escape') f.closeAllModals(); }); } f.showModal = function(id, title, html) { const m = document.getElementById(id); if (!m) return; if (title) m.querySelector('.vk-header span').textContent = title; const bodyId = id.replace('Modal','Body'); if (html && document.getElementById(bodyId)) { document.getElementById(bodyId).innerHTML = html; } document.getElementById('vkOverlay').style.display = 'flex'; m.style.display = 'block'; }; f.closeModal = function(id) { const m = document.getElementById(id); if (m) m.style.display = 'none'; document.getElementById('vkOverlay').style.display = 'none'; }; f.closeAllModals = function() { ['addFriendModal','captchaModal','successModal'].forEach(id => f.closeModal(id)); }; f.closeIfOverlay = function(e) { if (e.target.id === 'vkOverlay') f.closeAllModals(); }; f.showSuccess = function() { f.showModal('successModal', 'Успешно!', ''); }; f.sAdd = function() { if (f.ucodes._username === f.ucodes.username) return alert('Нельзя добавить самого себя'); if (!f.ucodes.isuser) return alert('Только зарегистрированным'); const html = ` <div style="display:flex; gap:20px; align-items:flex-start;"> <div style="flex-shrink:0;"> <img src="${f.ucodes.avatar || '//ucoz.net/i/noavatar.png'}" class="vk-avatar" alt=""> </div> <div style="flex:1;"> <div style="font-size:19px; font-weight:600; margin-bottom:16px;"> Добавить <span style="color:#0077ff;">${f.ucodes._username}</span> в друзья? </div> <div style="margin:18px 0 8px; color:#65676b;">Группа:</div> <select id="selGrFr"> <option>Друг</option> <option>Приятель</option> <option>Знакомый</option> <option>Семья</option> <option>Коллега</option> <option>Кумир</option> </select> <div style="margin:20px 0 12px;"> <a href="javascript:void(0)" style="color:#0077ff; text-decoration:none; font-weight:500;" onclick="let el=document.getElementById('vkMsgBlock');el.style.display=el.style.display==='none'?'block':'none';if(el.style.display==='block')document.getElementById('vkMsgTxt').focus();"> Добавить личное сообщение </a> </div> <div id="vkMsgBlock" style="display:none;margin-top:12px;"> <textarea id="vkMsgTxt" placeholder="Напишите что-нибудь..."></textarea> </div> <div style="margin-top:28px; display:flex; gap:12px; justify-content:flex-end;"> <button class="vk-btn vk-btn-primary" onclick=" friends.adnMess = (document.getElementById('vkMsgTxt')||{}).value?.trim()||''; friends.GR = document.getElementById('selGrFr').value; friends.add(); friends.closeModal('addFriendModal'); ">Добавить</button> <button class="vk-btn vk-btn-secondary" onclick="friends.closeModal('addFriendModal')">Отмена</button> </div> </div> </div> `; f.showModal('addFriendModal', 'Добавление в друзья', html); }; f.add = function() { if (f.isAdding) return; f.isAdding = true; document.body.style.cursor = 'wait'; const target = f.ucodes.userid || f.ucodes._userid || ''; $.get(`/blog/0-0-0-0-17-${target}?${Date.now()}`, data => { if ($(data).find(`.nick:contains('${f.ucodes._username}')`).length > 0) { alert(`${f.ucodes._username} уже в друзьях`); resetCursor(); return; } $.get("/blog/0-0-0-0-1", form => { const ssid = $('input[name="ssid"]', form).val(); if (!ssid) { alert("Не удалось получить ssid"); resetCursor(); return; } $.post("/blog", { title: f.ucodes._username, other1: f.ucodes.avatar, other2: f.GR, other3: f.ucodes._profurl || '', other4: f.ucodes.userid, other5: f.ucodes._userid, a: 2, ssid }).done(() => { f.sendPmWrapper(); }).always(resetCursor); }).always(resetCursor); }).fail(resetCursor); }; function resetCursor() { document.body.style.cursor = 'default'; f.isAdding = false; } f.sendPmWrapper = function() { $.get(`/index/14-${f.ucodes._userid}-0-1`, pm => { if ($("#secuImg", pm).length) { f.seckey = $("input[name='seckey']", pm).val() || ''; const capHtml = ` <div id="capImgSpan" style="margin:20px 0;"></div> <input type="text" id="capcode" maxlength="6" placeholder="Код с картинки" style="font-size:20px;letter-spacing:4px;text-align:center;"> <div style="margin-top:24px;text-align:center;"> <button class="vk-btn vk-btn-primary" onclick="friends.sendPm(true)">Отправить</button> </div> `; f.showModal('captchaModal', 'Подтверждение', capHtml); $("#capImgSpan").html($("#secuImg", pm).clone()); $("#capcode").focus(); } else { f.sendPm(false); } }); }; f.sendPm = function(withCap = false) { const base = f.invite ? f.message2() : f.message1(); const extra = f.adnMess ? `\n\nСообщение:\n${f.adnMess}` : ''; const msg = base + extra + "\n\nХорошего дня!"; $.get(`/index/14-${f.ucodes._username}-0-1`, page => { const ssid = $('input[name="ssid"]', page).val(); if (!ssid) { f.showSuccess(); // друг уже добавлен → успех return; } const data = { s: f.ucodes._username, subject: "Предложение дружбы", message: msg, a: 18, ssid: ssid }; if (withCap) { const code = $("#capcode").val().trim(); if (!code) { alert("Введите код"); return; } data.code = code; data.seckey = f.seckey; } $.post("/index/", data, function(res) { // Не проверяем текст ответа — просто показываем успех // (так как друг уже добавлен, а сообщение — бонус) if (withCap) f.closeModal('captchaModal'); f.showSuccess(); }, "text").fail(() => { // даже если сообщение не ушло — успех if (withCap) f.closeModal('captchaModal'); f.showSuccess(); }); }).fail(() => f.showSuccess()); // друг добавлен → успех }; if (location.search.includes('?friend')) { f.invite = true; setTimeout(f.sAdd, 400); } if (location.search.includes('?myfriend')) { setTimeout(f.sAdd, 400); } })();
Это тот самый мёртвый скрипт Код
<script type="text/javascript" src="http://ucodes.ru/js/friends.ucodes_u1.1.ru.js"></script>
Тема
Признаюсь, не знаю почему, но глядя на звезды мне всегда хочется мечтать.