Список пользователей

1
Админ
Постов: 162
2
Элита
Постов: 45
3
VIP
Постов: 35
4
Проверенные
Постов: 31
5
Проверенные
Постов: 30
6
Пользователи
Постов: 27
7
VIP
Постов: 26
8
Пользователи
Постов: 24

  • Страница 1 из 1
  • 1
Скрипт друзей - новые стили CSS uCoz V 2.0
Дата: Воскресенье, 01.02.2026, 15:11 | Сообщение # 1 | | Написал: Узнаваемый
Автор темы
Мурчанн не в сети
        Сообщений:162
         Регистрация:20.10.2016

Внесены небольшие изменения во всплывающее окно. В этот раз дизайн выполнен в синих оттенках. Я делал его под свой шаблон, но вы без проблем можете изменить цветовую гамму под свои нужды. Со временем планирую выкладывать версии и в других цветах. Скрипт будет постепенно дорабатываться и улучшаться.

Идея скрипта была взята из этой темы. Правда, сам скрипт там уже давно не работает — по сути, мёртвый голубчик. Тем не менее меня заинтересовала сама концепция и структура кода, а точнее - идея реализации модуля друзей. Логика работы у него предельно простая и понятная, работает как дважды два.

Ссылка на тему



Исходник скрипта ..

Код
(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>


Тема

Мурчанн

Признаюсь, не знаю почему, но глядя на звезды мне всегда хочется мечтать.
  • Страница 1 из 1
  • 1
Поиск: