Единый форум поддержки

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Единый форум поддержки » Новые возможности форумов » Запросы по скриптам #11


Запросы по скриптам #11

Сообщений 1741 страница 1753 из 1753

1

В этой теме просим о создании различных скриптов

Здесь вы можете оставить запрос на разработку нового скрипта для форума. Пожалуйста, внимательно ознакомьтесь с правилами темы. Просьба быть внимательным: эта тема касается только вопросов о создании новых скриптов!
Вопросы по оформлению форума и прочим CSS-кодам, просьба, задавать в темах Общие вопросы от новичков (63) #3 и Общие вопросы по оформлению (65) #2

Информируем о следующем:

  • Участники форума оказывают помощь в написании скриптов исключительно по собственному желанию.

  • Администрация форума не может гарантировать исполнение и корректность каждого запроса.

  • Пожалуйста, уважайте чужое время и усилия других пользователей, старайтесь писать грамотно и доходчиво.

  • Будьте взаимовежливы: Грубое или требовательное отношение к участникам форума неприемлемо и может привести к отказу в помощи на всём форуме.

  • Все вопросы, не касающиеся запросов скриптов, будут удаляться!

Сформулируйте свой запрос максимально подробно, чтобы повысить вероятность отклика:

  • Опишите желаемую функциональность: Что конкретно должен делать скрипт?

  • Укажите конечный результат: Что вы хотите получить в итоге? Где и как будет использоваться скрипт?

  • Если есть примеры, покажите: Укажите ссылки на схожий функционал скрипта или нарисуйте макет (на скриншоте), чего именно вы ожидаете получить - всё это значительно упростит задачу.

Если на ваш запрос долго нет ответа, пожалуйста, воздержитесь от повторных сообщений или обвинений. Возможно, задача оказалась слишком сложной или трудозатратой по времени, будьте готовы к тому, что участники могут предложить свои услуги на платной основе. Обсуждение условий и оплаты происходит между вами и участником (исполнителем) в личных сообщениях или иных средствах связи (но не в теме!). Администрация форума не несет никакой ответственности за подобные договоренности и их выполнение.

Если скрипт был написан на безвозмездной основе, автор может разместить его в общем каталоге скриптов для других пользователей.

Предыдущая тема - Запросы по скриптам[10]

Инструменты для поиска и редактирования стиля (скриптов).

Как с помощью браузера можно определить элемент дизайна.

Каталог скриптов/CSS

Полезные скрипты, необходимые темы для новичков, а также ссылки на сайты рассказывающие что такое НТМЛ и CSS.

Типовые Вопросы (ЧаВо)

Ответы на часто задаваемые вопросы.

Как правильно задавать вопросы. В чём разница между стилем и скриптом.

Плюс к названию темы еще и Памятка.

+1

1741

Амираль

Очень интересно, но, как всегда, ничего не понятно - какая-то кнопка в итоге должна появится или что?)
И как найти вас в телеграме?:)

0

1742

Амираль написал(а):

буду ультра благодарна тому, кто перевезет пост в скрипты от пользаков, idk как я уже второй раз вместо той темы закидываю сюда

Сделано специально, чтобы в скрипты от пользователей попадали только проверенные коды, а не любой публикуемый там пост (зачастую это вопросы, которые должны быть по идее адресованы в эту тему, или непроверенные/дублирующиеся коды). Перенёс в нужную тему.

+1

1743

Merlin777 написал(а):

⚡Мгновенные "Быстроплюсы" и ⚡Мгновенные "Сказали спасибо"

Здравствуйте! Поставил этот скрипт - всё работает прекрасно. Но. Почему-то в личной переписке в каждом письме появились "Сказали спасибо" - и  лайки от всё время разных форумчан (не одни и те же). Причём эти лайки есть абсолютно во всех письмах. И даже есть в тех письмах, которые были написаны, когда на форуме вообще ни одного скрипта не было установлено.

Скриншот

Отредактировано Виплич (Пн, 26 Янв 2026 13:18:47)

0

1744

Виплич
По идее нужно ограничить выполнение скрипта только для топиков, ID сообщений в топиках могут пересекаться с таковыми в ЛС, что в данном случае будет некорректно. Что-то типа такого, думаю (добавка выделена красным):

function scheduleUpdate(scope = document) {
    if (!$('#pun-viewtopic').length) return;

+1

1745

@Виплич

Вот версия (CSS + JavaScript) с проверкой работы на страницах топика:

Посмотреть код
Код:
<style>
/*Быстроплюсы для Топика!*/
div .post-rating p a {
    text-align: center;
    outline: 1px solid transparent;
    font-weight: 700;
    background: url(https://upforme.ru/uploads/001a/f0/7d/2/466540.png  ) no-repeat center;
     background-size:36px auto;
     position:relative;
    z-index:100;
    width: 36px;
    height: 36px;
    text-align:center;
    font-size: 12px !important;
    display: inline-block;
    vertical-align: middle;
    line-height: 34px;
    letter-spacing: -.1px;
}
.noNull:before{content: "+";
    display: inline-block;
    margin-left: -1px;
    font-size: 9px;
    letter-spacing: 0!important;
}
.punbb .post-rating p {
   padding: 0 !important;
}
</style>

<script>
    'use strict';
 
// --- ОБЩИЕ ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ ---
 
// Получает ID постов из указанного DOM-контекста
function getPostIds(scope = document) {
    // Работаем только на странице топика
    if (!$('#pun-viewtopic').length) return [];
    
    const postElements = $(scope).find('div.post');
    return postElements.map(function() {
        const id = $(this).attr('id');
        if (id && id.startsWith('p')) {
            return id.slice(1);
        }
    }).get();
}
 
// --- ЧАСТЬ 1: БЫСТРОПЛЮСЫ ---
 
// Отслеживание уже обработанных постов (для избежания дублирования)
const processedPostsForPlus = new Set();
 
// Обновляет отображение цифры рейтинга и управляет классом noNull
function setDigit(th) {
    var d = parseInt(th.innerHTML);
    if (d > 0) $(th).addClass('noNull');
    else $(th).removeClass('noNull');
    th.innerHTML = d;
}
 
// Сохранение оригинального alert для восстановления после голосования
var Busy = window.alert;
 
// Обработка клика по кнопке "плюса": отправка запроса, обновление рейтинга и мини-профиля
function setPlus(sel) {
    // Работаем только на странице топика
    if (!$('#pun-viewtopic').length) return;
    
    window.alert = null;
    var a = sel.prop('href');
    var pid = a.match(/\?id=(\d+)/)[1];
 
    var uid = sel.parents('.post').find('.pl-email a[href*="profile.php?"]').prop('href');
    if (uid) uid = uid.match(/\?id=(\d+)$/)[1];
    var v = a.match(/&v=(\d+)/)[1] == 0 ? -1 : 1;
    $('#post-' + pid + '-vote').hide();
 
    $.get(a + '&format=json', function(data) {
        if (data.error && data.error.message) {
            // Ошибка обрабатывается без уведомлений — только внутренняя логика
        } else if (data.delta) {
            if(data.response !== undefined) {
                $('#p' + pid + ' .post-rating a').text(data.response);
                setDigit($('#p' + pid + ' .post-rating a')[0]);
            } else {
                var oldRating = parseInt($('#p' + pid + ' .post-rating a').text()) || 0;
                var newRating = oldRating + data.delta;
                $('#p' + pid + ' .post-rating a').text(newRating);
                setDigit($('#p' + pid + ' .post-rating a')[0]);
            }
 
            // Обновление мини-профиля автора и текущего пользователя
            var $res = $('.pl-email a[href$="profile.php?id=' + uid + '"]').parents('.post').find('.pa-respect');
            var $pos = $('.pl-email a[href$="profile.php?id=' + UserID + '"]').parents('.post').find('.pa-positive');
 
            function replaceRating(sel, v, revert) {
                var html = $(sel).html(),
                    delta = v;
                if (revert) delta = delta > 0 ? -1 : 1;
                if (v > 0) {
                    html = html.replace(/\[\+(\d+)\//g, function(str, p1) {
                        return '[+' + (parseInt(p1) + delta) + '/';
                    });
                } else {
                    html = html.replace(/\/-(\d+)\]/g, function(str, p1) {
                        return '/-' + (parseInt(p1) - delta) + ']';
                    });
                }
                $(sel).html(html);
            }
            if ($res.html().indexOf('[') != -1) {
                $res.each(function() { replaceRating(this, v); });
                $pos.each(function() { replaceRating(this, v); });
                if (Math.abs(data.delta) == 2) {
                    v = v > 0 ? -1 : 1;
                    $res.each(function() { replaceRating(this, v, 1); });
                    $pos.each(function() { replaceRating(this, v, 1); });
                }
            } else {
                var d0 = $res.find('span:not(.fld-name)').html(),
                    p0 = $pos.find('span:not(.fld-name)').html();
                var d1 = parseInt(d0) + v;
                if (p0) {
                    var p1 = parseInt(p0) + v;
                }
                if (d1 && d1 > 0) {
                    d1 = '+' + d1;
                }
                if (p1 && p1 > 0) {
                    p1 = '+' + p1;
                }
                $res.find('span:not(.fld-name)').html(d1);
                if (p0) $pos.find('span:not(.fld-name)').html(p1);
            }
 
            // Генерация события для обновления списка "Спасибо" при лайке
            if(v === 1) {
                document.dispatchEvent(new CustomEvent('vote:happened', {
                    detail: { pid: pid, type: 'thank' }
                }));
            }
        }
        setTimeout(function() {window.alert = Busy;},1300);
    })
    .fail(function(xhr, status, error) {
        setTimeout(function() {window.alert = Busy;},1300);
    });
}
 
// Обёртка для вызова setPlus из onclick
window.BR = function(th) {
    // Работаем только на странице топика
    if (!$('#pun-viewtopic').length) return;
    
    var lnk = $(th).parents('.post-box').find('.post-vote>p>a');
    setPlus(lnk);
};
 
// Скрывает все вновь добавленные элементы .post-vote
function hideAllNewPostVotes(scope = document) {
    // Работаем только на странице топика
    if (!$('#pun-viewtopic').length) return;
    
    $(scope).find('.post-vote[id^="post-"]').each(function() {
        var postId = this.id.replace('post-', '');
        var postRatingLink = $(`.post#p${postId} .post-rating p a`);
        if(postRatingLink.length) {
             $(this).hide();
        }
    });
}
 
// Назначает обработчики для кнопок "плюса" в указанной области
function applyPlusHandlers(scope = document) {
    // Работаем только на странице топика
    if (!$('#pun-viewtopic').length) return;
    
    $(scope).find('.post .post-rating p a').each(function() {
        if (!this.hasAttribute('data-plus-handler')) {
             this.setAttribute("onclick", "BR(this)");
             setDigit(this);
 
             var postVoteLinkSelector = $(this).parents('.post').attr('id');
             if(postVoteLinkSelector) {
                 var pid = postVoteLinkSelector.slice(1);
                 var postVoteLink = $('#post-' + pid + '-vote');
                 if(postVoteLink.length) {
                      postVoteLink.hide();
                 }
             }
             this.setAttribute('data-plus-handler', 'true');
        }
    });
    hideAllNewPostVotes(scope);
}
 
// --- ЧАСТЬ 2: СПИСОК ПОБЛАГОДАРИВШИХ (API-ЛОГИКА) ---
 
// Отслеживание постов, для которых уже запрашивались "спасибо"
const processedPostsForThanks = new Set();
 
// Отслеживание ID постов, для которых выполняется запрос (для дедупликации)
const pendingUpdates = new Set();
 
// Вставка списка благодаривших в пост
function insertThanksList(postId, thankersListHtml) {
    // Работаем только на странице топика
    if (!$('#pun-viewtopic').length) return;
    
    if (!thankersListHtml) {
        return;
    }
 
    var postBox = $('.post#p' + postId + ' .post-box');
    if (postBox.length && postBox.find('.postVoters').length === 0) {
        var html = '<div class="postVoters"><strong><i><font color ="#13355e">Сказали спасибо</font></i>:</strong> ' + thankersListHtml + '</div>';
        postBox.append(html);
        processedPostsForThanks.add(postId);
    } else {
        if(postBox.length === 0) {
            var postElement = $('.post#p' + postId);
            if(postElement.length && postElement.find('.postVoters').length === 0) {
                var html = '<div class="postVoters"><strong><i><font color ="#13355e">Сказали спасибо</font></i>:</strong> ' + thankersListHtml + '</div>';
                postElement.append(html);
                processedPostsForThanks.add(postId);
            }
        } else {
            postBox.find('.postVoters').html('<strong><i><font color ="#13355e">Сказали спасибо</font></i>:</strong> ' + thankersListHtml);
        }
    }
}
 
// Обработка ответа API: группировка и вставка благодаривших
function processVotes(data) {
    // Работаем только на странице топика
    if (!$('#pun-viewtopic').length) return;
    
    if (!data || !data.response) {
        const postIdsFromRequest = currentFetchRequestIds || [];
        postIdsFromRequest.forEach(id => processedPostsForThanks.add(id));
        currentFetchRequestIds = null;
        return;
    }
 
    const votesByPost = {};
    data.response.forEach(item => {
        const postId = item.post_id;
        if (item.votes && Array.isArray(item.votes)) {
            item.votes.forEach(vote => {
                if (vote.value === '1') {
                    if (!votesByPost[postId]) {
                        votesByPost[postId] = [];
                    }
                    votesByPost[postId].push(vote);
                }
            });
        }
    });
 
    Object.keys(votesByPost).forEach(postId => {
        const votesForThisPost = votesByPost[postId];
        let thankersHtml = '';
        votesForThisPost.forEach((vote, index) => {
            thankersHtml += '<a href="/profile.php?id=' + vote.user_id + '">' + vote.username + '</a>';
            if (index < votesForThisPost.length - 1) {
                thankersHtml += ', ';
            }
        });
        insertThanksList(postId, thankersHtml);
    });
 
    Object.keys(votesByPost).forEach(id => processedPostsForThanks.add(id));
    data.response.forEach(item => {
        if (!processedPostsForThanks.has(item.post_id)) {
            processedPostsForThanks.add(item.post_id);
        }
    });
}
 
// Выполнение API-запроса для получения списка благодаривших
let currentFetchRequestIds = null;
 
function fetchVotesForPosts(postIds) {
    // Работаем только на странице топика
    if (!$('#pun-viewtopic').length) return;
    
    if (!postIds || postIds.length === 0) {
        postIds.forEach(id => pendingUpdates.delete(id));
        return;
    }
 
    const apiParams = {
        method: 'post.getVotesByPosts',
        post_id: postIds.join(','),
        fields: 'post_id,user_id,username,value,datetime',
        sort_dir: 'desc'
    };
 
    currentFetchRequestIds = [...postIds];
 
    return $.get('/api.php', apiParams, function(data) {
        processVotes(data);
    }, 'json')
    .fail(function(xhr, status, error) {
        postIds.forEach(id => processedPostsForThanks.add(id));
        currentFetchRequestIds = null;
    });
}
 
// Планирование обновления списка "спасибо" для новых постов
function scheduleUpdate(scope = document) {
    // Работаем только на странице топика
    if (!$('#pun-viewtopic').length) return;
    
    requestAnimationFrame(() => {
        const newPostIds = getPostIds(scope).filter(id => !processedPostsForThanks.has(id));
        if (newPostIds.length > 0) {
            const idsToRequest = newPostIds.filter(id => !pendingUpdates.has(id));
            if (idsToRequest.length > 0) {
                idsToRequest.forEach(id => pendingUpdates.add(id));
                fetchVotesForPosts(idsToRequest).always(() => {
                    idsToRequest.forEach(id => pendingUpdates.delete(id));
                });
            }
        }
    });
}
 
// Объединённая функция резервного обновления (раз в секунду)
function combinedBackupUpdate() {
    // Работаем только на странице топика
    if (!$('#pun-viewtopic').length) return;
    
    applyPlusHandlers(document);
    scheduleUpdate(document);
}
 
// --- ИНИЦИАЛИЗАЦИЯ И ПОДПИСКИ НА СОБЫТИЯ ---
 
// Инициализация при загрузке DOM
$(function() {
    // Работаем только на странице топика
    if (!$('#pun-viewtopic').length) return;
    
    $('.post .post-rating p a').each(function() {
        this.setAttribute("onclick", "BR(this)");
        setDigit(this);
        var postVoteLinkSelector = $(this).parents('.post').attr('id');
        if(postVoteLinkSelector) {
            var pid = postVoteLinkSelector.slice(1);
            var postVoteLink = $('#post-' + pid + '-vote');
            if(postVoteLink.length && $(this).hasClass('noNull')) {
                postVoteLink.hide();
            }
        }
        this.setAttribute('data-plus-handler', 'true');
    });
 
    scheduleUpdate(document);
});
 
// Подписка на событие добавления нового поста (например, через AJAX)
document.addEventListener('pun_post', function(e) {
    // Работаем только на странице топика
    if (!$('#pun-viewtopic').length) return;
    
    var scope = e.detail?.post || document.body;
    applyPlusHandlers(scope);
    scheduleUpdate(scope);
});
 
// Подписка на собственное событие после успешного лайка
document.addEventListener('vote:happened', function(e) {
    // Работаем только на странице топика
    if (!$('#pun-viewtopic').length) return;
    
    if (e.detail && e.detail.pid && e.detail.type === 'thank') {
        var pid = e.detail.pid;
        var specificPostScope = $('#p' + pid);
        if(specificPostScope.length) {
            if (!pendingUpdates.has(pid)) {
                pendingUpdates.add(pid);
                fetchVotesForPosts([pid]).always(() => {
                    pendingUpdates.delete(pid);
                });
            }
        }
    }
});
 
// Подписка на глобальное AJAX-событие для отслеживания лайков от любых пользователей
$(document).on('ajaxSuccess', function(e, xhr, data) {
    // Работаем только на странице топика
    if (!$('#pun-viewtopic').length) return;
    
    if (data && data.url && /relation\.php.*[&?]v=(\d+)/.test(data.url)) {
        const match = data.url.match(/id=(\d+)/);
        const pid = match ? match[1] : null;
        const voteType = data.url.match(/v=(\d+)/)?.[1];
 
        if (pid && voteType === '1') {
            if (!pendingUpdates.has(pid)) {
                pendingUpdates.add(pid);
                fetchVotesForPosts([pid]).always(() => {
                    pendingUpdates.delete(pid);
                });
            }
        }
    }
});
 
// Наблюдатель за изменениями DOM для динамических постов
const observer = new MutationObserver(function(mutationsList) {
    // Работаем только на странице топика
    if (!$('#pun-viewtopic').length) return;
    
    let shouldUpdate = false;
    let relevantScope = document.body;
 
    for (let mutation of mutationsList) {
        if (mutation.type === 'childList') {
            for (let node of mutation.addedNodes) {
                if (node.nodeType === 1) {
                    if (node.classList && node.classList.contains('post')) {
                        relevantScope = node;
                        shouldUpdate = true;
                        break;
                    } else if (node.querySelector && node.querySelector('div.post')) {
                        relevantScope = node;
                        shouldUpdate = true;
                        break;
                    } else {
                        const nestedPosts = node.querySelectorAll && node.querySelectorAll('div.post');
                        if (nestedPosts && nestedPosts.length > 0) {
                            relevantScope = node;
                            shouldUpdate = true;
                            break;
                        }
                    }
                }
            }
            if (shouldUpdate) break;
        }
    }
 
    if (shouldUpdate) {
        requestAnimationFrame(() => {
            applyPlusHandlers(relevantScope);
            hideAllNewPostVotes(relevantScope);
            scheduleUpdate(relevantScope);
        });
    }
});
 
observer.observe(document.body, { childList: true, subtree: true });
 
// Резервный таймер для обновления раз в секунду
const backupInterval = setInterval(combinedBackupUpdate, 1000);
</script>
Список изменений:

Добавлена проверка if (!$('#pun-viewtopic').length) return; в следующие места:

    ✅ getPostIds() - не получает ID постов вне топика
    ✅ setPlus() - не обрабатывает клики вне топика 
    ✅ BR() - обёртка для кликов
    ✅ hideAllNewPostVotes() - не скрывает элементы вне топика
    ✅ applyPlusHandlers() - не назначает обработчики вне топика
    ✅ insertThanksList() - не вставляет списки вне топика
    ✅ processVotes() - не обрабатывает ответы вне топика
    ✅ fetchVotesForPosts() - не делает запросы вне топика
    ✅ scheduleUpdate() - не планирует обновления вне топика
    ✅ combinedBackupUpdate() - не обновляет вне топика
    ✅ $(function() {...}) - не инициализирует вне топика
    ✅ document.addEventListener('pun_post', ...) - не реагирует на события вне топика
    ✅ document.addEventListener('vote:happened', ...) - не обрабатывает лайки вне топика
    ✅ $(document).on('ajaxSuccess', ...) - не слушает AJAX вне топика
    ✅ MutationObserver callback - не наблюдает за изменениями вне топика

+1

1746

@Alex_63
Смотри
есть твой мгновенный предпросмотр сообщений десятилетней давности
есть сервисные пользовательские теги
Как можно догадаться, из-за локального парса и конкретно того, что локальный парс ничего не знает про кастомные теги, указанные для конкретного форума, этот предпросмотр парсить "пользовательские теги" не может
Человеки отчаянно хотят именно мгновенный предпросмотр, который свитчится после каждого введенного символа, т.е. если парсить это на стороне севриса - это прям больше 1 рпс с тела может быть, и это прям не очень хорошо выглядит, я на 99.9% уверена, что это будет отбиваться рпс-лимитером.
В связи с этим, вопрос:
есть ли опция каким-либо образом вытащить функцию, аналогично сервисному механизму выпаршивающую пользовательские теги, или выход один - страдать юзать старую скриптовую реализацию того, что можно реализовать сервисными тегами, просто ради того, чтобы оно парсилось на клиенте?
Я не хочу даже пытаться написать с нуля то, что реализовано на стороне сервиса, да)))
Отдельный мем в том, что как будто есть желание условно шаблонные приколы запихать в пользовательские теги, чтобы не лепить html в каждом посте, но для каждого такого тега дорабатывать парс в мгновенном предпросмотре я явным образом не хочу.

Отредактировано Амираль (Вс, 1 Фев 2026 00:47:41)

0

1747

Амираль
Сразу скажу, что мгновенный предпросмотр точно не планируется к доработке, вместо него предлагается использовать визуальный редактор, в него можно и пользовательские теги добавить, по типу

Код:
WYSI.extend({
    'indent': ['.custom_tag_indent', '[indent]', ''],
    'float': ['.custom_tag_float', '[float]', '[/float]', function(startTag,elem) {
        return BBQuote.addAttribute(startTag, elem.attr('alt'))
    }]
});

С функцией из парсера в движке сложнее, я посмотрю на досуге что можно сделать. Сразу подумалось, что как минимум придётся ещё раз те же теги прописывать, что и в поле Пользовательские BB-теги, только уже передавать их в эту функцию. Как я понимаю, у тебя идея в том чтобы просто перевести с php на js то, что в парсере по части пользовательских тегов.

+1

1748

Alex_63 написал(а):

Амираль
Сразу скажу, что мгновенный предпросмотр точно не планируется к доработке, вместо него предлагается использовать визуальный редактор, в него можно и пользовательские теги добавить, по типу

Код:
WYSI.extend({
    'indent': ['.custom_tag_indent', '[indent]', ''],
    'float': ['.custom_tag_float', '[float]', '[/float]', function(startTag,elem) {
        return BBQuote.addAttribute(startTag, elem.attr('alt'))
    }]
});

С функцией из парсера в движке сложнее, я посмотрю на досуге что можно сделать. Сразу подумалось, что как минимум придётся ещё раз те же теги прописывать, что и в поле Пользовательские BB-теги, только уже передавать их в эту функцию. Как я понимаю, у тебя идея в том чтобы просто перевести с php на js то, что в парсере по части пользовательских тегов.

С идеей ты прав, да
Про визуальный идею закину)

+1

1749

Merlin777 написал(а):

❤︎Чёрный Список❤︎

Представляем вашему вниманию универсальный скрипт "Чёрный список" (далее - ЧС), который помогает форумчанам игнорировать друг друга

 
Выглядит супер и работает. Только почему то эта функция доступна и гостям

0

1750

Merlin777 написал(а):

❤︎Чёрный Список❤︎

А вставлять на форум нужно только тот код что в HTML верх идет или CSS тоже?

0

1751

СергейSerg написал(а):

вставлять на форум нужно только тот код что в HTML верх идет или CSS тоже?

Если вы имеете в виду вот это:

<!-- Чёрный список -->
<link rel="stylesheet" href="https://forumstatic.ru/files/001a/f0/7d/46139.css?v=5">
<script src="https://forumstatic.ru/files/001a/f0/7d/48003.js?v=110"></script>
<!-- Чёрный список -->

То тут первая строчка - это ссылка на CSS, а вторая - cсылка на скрипт:) 

Эти две строчки дадут сразу готовый дизайн, а если хотите свой - то ставите и модифицируете отдельно CSS и JS, которые приведены там ниже.


СергейSerg написал(а):

Выглядит супер и работает. Только почему то эта функция доступна и гостям

Эта функция не должна быть доступна гостям, так как у Гостей нет своего профиля.
Если у вас Гости видят чёрный список, то покажите скриншот, будем разбираться:)

+3

1752

Merlin777
Меня интересует чуть другой вопрос. А есть возможность сделать скрипт для темной темы для дизайна "Classic DarkCyan"? Был бы признателен!

0

1753

СергейSerg написал(а):

Merlin777
Меня интересует чуть другой вопрос. А есть возможность сделать скрипт для темной темы для дизайна "Classic DarkCyan"? Был бы признателен!

Без проблем, вот 2 варианта:)

Тёмная тема для Classic DarkCyan v.1
Код:
 <!-- Тёмная тема для Classic DarkCyan v.1-->
<style>
/* ===== Переключатель темы ===== */
#html-header {
    position: relative;
}
.StyleSwitch {
    height: 20px;
    width: 20px;
    position: absolute;
    z-index: 1000;
    right: 5px;
    top: 50px;
    border-radius: 50%;
    cursor: pointer;
    box-shadow: 0 0 10px rgba(0,0,0,.7);
    transition: .1s ease;
}
.StyleSwitch:hover { opacity: .8; }
.StyleSwitch.St {
    background: #2DA7A7 url(https://forumstatic.ru/files/0016/a6/f8/22564.png) center center no-repeat!important;
    background-size: 16px!important;
}
.StyleSwitch.My {
    background: #1a6b6b url(https://forumstatic.ru/files/0016/a6/f8/90261.png) center center no-repeat!important;
    background-size: 16px!important;
}

/* ===== Тёмная тема Classic DarkCyan ===== */
body.dark-theme {
    background: #1a2a2a;
    color: #c8e0e0;
}
body.dark-theme #pun {
    background: #1e2e2e;
    box-shadow: 0 0 15px rgba(0, 200, 200, .1);
}
body.dark-theme #pun-title,
body.dark-theme #pun-title .container {
    background-color: #1a5a5a;
    background-image: linear-gradient(to bottom, rgba(0,0,0,.3) 0%, rgba(0,0,0,0) 70%);
}
body.dark-theme #pun-title h1 span {
    color: #e0f5f5;
    text-shadow: 0 2px 4px rgba(0,0,0,.5);
}
body.dark-theme #pun-navlinks {
    background: rgba(0,0,0,.6);
    box-shadow: inset rgba(0,0,0,.8) 0 1px 5px, rgba(0,200,200,.05) 0 -1px 0;
}
body.dark-theme #pun-navlinks .container {
    color: #b0d8d8;
}
body.dark-theme #pun-navlinks li a {
    color: #c8e8e8;
    text-shadow: 0 1px 3px rgba(0,0,0,.5);
}
body.dark-theme #pun-navlinks li a:hover {
    background: rgba(45, 167, 167, .2);
    color: #80e0e0;
    text-shadow: 0 0 8px rgba(100, 220, 220, .5);
}
body.dark-theme #pun-navlinks .isactive a {
    background: rgba(45, 167, 167, .35);
    box-shadow: inset rgba(0,200,200,.15) 0 1px 4px;
}
body.dark-theme #pun-ulinks .container {
    background: #1a3a3a;
    background-image: linear-gradient(to bottom, rgba(255,255,255,.05) 0%, rgba(255,255,255,0) 100%);
    border-bottom-color: #2a5a5a;
}
body.dark-theme #pun-ulinks li a {
    color: #70c8c0;
}
body.dark-theme #pun-ulinks li a:hover {
    background: rgba(45, 167, 167, .15);
    box-shadow: inset rgba(0,0,0,.2) 0 1px 3px;
}
body.dark-theme .punbb .main .container,
body.dark-theme .punbb .post .container {
    background: #223333;
    border-color: #2a5050;
    color: #c0d8d8;
}
body.dark-theme .punbb .section .container,
body.dark-theme .punbb .modmenu .container,
body.dark-theme .punbb .post-body,
body.dark-theme .punbb .post-links,
body.dark-theme .punbb td.tc2,
body.dark-theme .punbb td.tc3,
body.dark-theme .punbb .formal fieldset .post-box,
body.dark-theme #viewprofile li strong,
body.dark-theme #viewprofile li div,
body.dark-theme #setmods dd,
body.dark-theme .punbb .info-box,
body.dark-theme .punbb #pun-main .info-box .legend {
    background: #1e3030;
    color: #b8d0d0;
}
body.dark-theme #pun-stats h2,
body.dark-theme .punbb .main h1,
body.dark-theme .punbb .main h2,
body.dark-theme #pun-debug h2,
body.dark-theme .punbb-admin #pun-admain h2 {
    background-color: #1a5a5a;
    border-color: #2a7a7a;
    color: #d0f0f0;
    background-image: linear-gradient(to bottom, rgba(255,255,255,.08) 0%, rgba(255,255,255,0) 100%);
    text-shadow: 0 1px 2px rgba(0,0,0,.6);
    box-shadow: inset rgba(100,220,220,.1) 0 1px 0;
}
body.dark-theme #pun-stats h2 span,
body.dark-theme .punbb .main h1 span,
body.dark-theme .punbb .main h2 span {
    color: #d0f0f0;
}
body.dark-theme .punbb a,
body.dark-theme .punbb a:link,
body.dark-theme .punbb a:visited {
    color: #50b8b0;
}
body.dark-theme .punbb a:hover,
body.dark-theme .punbb a:focus,
body.dark-theme .punbb a:active {
    color: #70e0d8;
    text-decoration: underline;
}
body.dark-theme .punbb li.isactive a,
body.dark-theme .punbb li.isactive a:link,
body.dark-theme .punbb li.isactive a:visited {
    color: #a0d0d0;
}
body.dark-theme .punbb td,
body.dark-theme .punbb fieldset,
body.dark-theme #viewprofile ul,
body.dark-theme #profilenav ul,
body.dark-theme .punbb .post .post-body,
body.dark-theme .punbb .post h3 span,
body.dark-theme .post-links ul,
body.dark-theme .post-links,
body.dark-theme .usertable table,
body.dark-theme .punbb .container,
body.dark-theme .punbb .post-body,
body.dark-theme .post h3,
body.dark-theme #pun-title {
    border-color: #2a5050;
}
body.dark-theme .punbb th {
    background-color: #1a3a3a;
    background-image: linear-gradient(to bottom, rgba(255,255,255,.06) 0%, rgba(255,255,255,0) 100%);
    border-bottom-color: #2a5a5a !important;
    color: #a0c8c8;
}
body.dark-theme .punbb .post h3 {
    background: #1a3030;
    border-color: #2a5050;
}
body.dark-theme .punbb .post h3 span {
    background-color: transparent !important;
    color: #b0d0d0;
    border-left-color: #2a5050;
}
body.dark-theme .punbb .quote-box,
body.dark-theme .punbb .code-box {
    border-color: #2a5a5a;
    background-color: #1a2a2a;
    color: #c0d8d8;
    box-shadow: 0 1px 6px rgba(0,0,0,.3);
}
body.dark-theme .punbb .quote-box cite,
body.dark-theme .punbb .code-box .legend,
body.dark-theme .punbb .spoiler-box > div {
    background: #1e3a3a;
    background-image: linear-gradient(to bottom, rgba(255,255,255,.05) 0%, rgba(255,255,255,0) 100%);
    border-bottom-color: #2a5a5a;
    color: #70b8b0;
}
body.dark-theme .punbb .post-content .blockcode,
body.dark-theme .punbb .post-content blockquote {
    background-color: #182828;
}
body.dark-theme .punbb .code-box {
    background-color: #162626;
    color: #d0e8e8;
}
body.dark-theme form .button,
body.dark-theme input[type="submit"] {
    color: #a0d8d0;
    background: #1a3a3a;
    border-color: #2a5a5a;
    background-image: linear-gradient(to bottom, rgba(255,255,255,.08) 0%, rgba(255,255,255,0) 100%);
    text-shadow: 0 1px 2px rgba(0,0,0,.4);
    box-shadow: 0 1px 3px rgba(0,0,0,.3);
}
body.dark-theme form .button:hover,
body.dark-theme input[type="submit"]:hover {
    background: #1e4a4a;
    box-shadow: inset rgba(100,220,220,.1) 0 100px 0, 0 1px 3px rgba(0,0,0,.3);
}
body.dark-theme form .button:disabled,
body.dark-theme input[type="submit"]:disabled {
    background: #0e1e1e;
    color: #556;
    box-shadow: none;
}
body.dark-theme .punbb input[type=password],
body.dark-theme .punbb input[type=text],
body.dark-theme .punbb input[type=search],
body.dark-theme .punbb select,
body.dark-theme .punbb textarea {
    background: #162626;
    border-color: #2a4a4a !important;
    color: #b8d0d0;
}
body.dark-theme .punbb input[type=password]:hover,
body.dark-theme .punbb input[type=text]:hover,
body.dark-theme .punbb input[type=search]:hover,
body.dark-theme .punbb textarea:hover,
body.dark-theme .punbb select:hover,
body.dark-theme .punbb input[type=password]:focus,
body.dark-theme .punbb input[type=text]:focus,
body.dark-theme .punbb input[type=search]:focus,
body.dark-theme .punbb textarea:focus,
body.dark-theme .punbb select:focus {
    border-color: #3a7a7a !important;
}
body.dark-theme #viewprofile li,
body.dark-theme #setmods dl {
    background: #1a3030;
    background-image: linear-gradient(to bottom, rgba(255,255,255,.04) 0%, rgba(255,255,255,0) 100%);
    color: #b0c8c8;
}
body.dark-theme #viewprofile h2 span,
body.dark-theme #profilenav h2 span,
body.dark-theme .punbb legend span {
    background-color: #1e3030;
    color: #70c8c0;
}
body.dark-theme #profilenav li a:hover {
    background: rgba(45, 167, 167, .15);
    box-shadow: inset rgba(0,0,0,.15) 0 1px 3px;
    color: #70e0d8;
}
body.dark-theme #profilenav li.isactive a {
    background: rgba(45, 167, 167, .12);
    box-shadow: inset rgba(100,200,200,.08) 0 1px 3px;
}
body.dark-theme .punbb .divider {
    border-color: #2a4a4a transparent transparent;
}
body.dark-theme li#onlinelist {
    border-top-color: #2a4a4a;
}
body.dark-theme li#onlinelist div {
    border-top-color: #2a4a4a;
    color: #a0b8b8;
}
body.dark-theme #pun-announcement h2 span {
    color: #c0e0e0;
    border-bottom-color: #2a5a5a;
}
body.dark-theme #pun-announcement .container {
    border-bottom-color: rgba(255,255,255,.05) !important;
}
body.dark-theme #pun-crumbs1 p.container {
    background: #1e2e2e;
    border-top-color: #2a4a4a;
    color: #a0b8b8;
}
body.dark-theme #pun-crumbs2 .container {
    background: #1e2e2e;
    border-bottom-color: #2a4a4a;
    color: #a0b8b8;
}
body.dark-theme #pun-about .container {
    background: #1e2e2e;
    border-top-color: #2a4a4a;
}
body.dark-theme #pun-status .container {
    background: #1e3030;
    border-bottom-color: #2a4a4a;
    color: #a0b8b8;
}
body.dark-theme hr {
    border-color: #2a4a4a;
}
body.dark-theme .punbb .modmenu .container {
    background-color: transparent;
    color: #a0b8b8;
}
body.dark-theme .post-links li a:hover {
    background-color: rgba(45, 167, 167, .12);
    border-color: #2a5a5a;
    color: #70d8d0 !important;
}
body.dark-theme #pun-pagelinks {
    color: #b8d0d0;
}
body.dark-theme #pun-pagelinks a:active,
body.dark-theme #pun-pagelinks a:focus {
    background-color: #2a5a5a;
    color: #e0f5f5;
}
body.dark-theme .punbb p.container.crumbs a:hover {
    background-color: rgba(45, 167, 167, .12);
    border-color: #2a5a5a;
}
body.dark-theme #paginator {
    background-color: #1a2a2a !important;
    border-color: #2a5a5a !important;
    box-shadow: 0 5px 10px rgba(0,0,0,.5) !important;
}
body.dark-theme #paginator a:hover {
    background-color: #1e4a4a !important;
}
body.dark-theme .punbb .post .post-rating .container,
body.dark-theme .punbb .post-vote .container {
    background-color: rgba(0, 40, 40, .4) !important;
    border-color: transparent !important;
}
body.dark-theme .punbb .post-sig dt {
    border-top-color: #2a4a4a;
}
body.dark-theme #profile-signature ul {
    border-color: #2a5a5a;
}
body.dark-theme .user-agent [class^="ua-icon-"]:before {
    filter: grayscale(.2) brightness(1.3);
}
body.dark-theme fieldset {
    background: #1a3030 !important;
    border-color: #2a5a5a;
}
body.dark-theme .punbb .post.new-ajax {
    background-color: rgba(0, 80, 80, .15);
}
body.dark-theme #keyboard-span input {
    background-color: rgba(255,255,255,.03);
    border-color: #2a4a4a;
    color: #c0d8d8;
}
body.dark-theme #profilenav li.isactive {
    background-color: rgba(255,255,255,.05);
    border-color: rgba(0,0,0,.1);
}
body.dark-theme .post-content table td {
    border-color: #2a5a5a !important;
}
body.dark-theme ul.punbb-dropdown ul {
    background-color: #1a3030;
}
body.dark-theme #isk {
    background: rgba(0,0,0,.3);
    border-color: transparent;
}
body.dark-theme .post-content kbd {
    background: #162626 !important;
    border-color: transparent !important;
}
body.dark-theme .punbb #MyBookmarks {
    background: #1e2e2e;
}
body.dark-theme .punbb #MyBookmarks li.BookmarkL {
    border-bottom-color: #2a5a5a !important;
}
body.dark-theme .punbb #MyBookmarks span.scrl {
    background-color: #162626;
    color: #b0c8c8;
}
body.dark-theme .punbb .editBookmark h1,
body.dark-theme .punbb .main #MyBookmarks h2,
body.dark-theme .punbb .main #MyBookmarks h1 {
    background-color: #1a3a3a !important;
    color: #b8d0d0 !important;
}
body.dark-theme .punbb .editBookmark .container {
    background-color: #1e2e2e;
}
body.dark-theme .punbb #navextra1:hover > a,
body.dark-theme .punbb #pun-navlinks ul ul {
    background-color: #1a4a4a !important;
    border-color: #2a5a5a;
    box-shadow: none !important;
}
body.dark-theme #pun-navlinks ul ul li:hover {
    background-color: #1e5a5a !important;
}
body.dark-theme .tooltipsy {
    background-color: #1a3a3a !important;
}
body.dark-theme .pun-modal .modal-inner {
    background: #1e2e2e;
}
body.dark-theme .punbb div[id$="-area"] {
    background-color: #162626 !important;
    border-color: rgba(255,255,255,.05) !important;
}
body.dark-theme .punbb fieldset {
    border-color: rgba(255,255,255,.08);
}
body.dark-theme .category th,
body.dark-theme #pun-viewforum .main th,
body.dark-theme #pun-searchtopics .main th {
    color: #a0c8c8;
}
body.dark-theme #table-area td {
    background-color: #1a3a3a;
    border-color: #2a5a5a !important;
}
body.dark-theme #table-area td.selected {
    background-color: #2a6a6a;
    border-color: #1a3a3a !important;
}
body.dark-theme #poll-special h1 {
    background: #1a5a5a;
}
body.dark-theme #pun-index .main h2,
body.dark-theme #pun-searchtopics .main h1,
body.dark-theme #pun-viewforum .main h1 {
    background: transparent;
    color: #c0e0e0;
}
body.dark-theme #pun-main h3 > a {
    background: #1a3a3a !important;
    border-radius: 10px !important;
    padding: 0 7px 3px !important;
}
body.dark-theme #setmods dl,
body.dark-theme .punbb .post h3 {
    background-color: rgba(0,0,0,.15);
    color: #a0b8b8;
}
body.dark-theme #pun-redirect {
    background: #1e2e2e;
}
body.dark-theme #form-buttons td:hover {
    background-color: #162626;
}
body.dark-theme #pun-userlist th {
    background: #1a3a3a !important;
}
body.dark-theme #pun-announcement h2 > span {
    color: #c0e0e0;
    border-bottom-color: #2a5a5a;
}
body.dark-theme #pun-debug h2,
body.dark-theme #pun-stats h2,
body.dark-theme .punbb .main h1,
body.dark-theme .punbb .main h2,
body.dark-theme .punbb-admin #pun-admain h2 {
    border-color: #2a7a7a;
}
body.dark-theme li.pa-online {
    border-left-color: #30a0a0;
}
body.dark-theme .adcontainer {
    border-color: #2a5a5a !important;
}
body.dark-theme .publication {
    color: #70c8c0 !important;
    text-shadow: none !important;
}
body.dark-theme .slider_wrap figcaption {
    background: rgba(10, 20, 20, .9) !important;
}
body.dark-theme .post-author .pa-online,
body.dark-theme .post-author:not(.online) .pa-author .acchide {
    background: #3a8a70 !important;
}
body.dark-theme #pun-searchform .main input[type=search] {
    background-color: rgba(0,0,0,.3);
}
body.dark-theme .input-button[disabled] {
    opacity: .5 !important;
}
body.dark-theme #pun-edit a:not([disabled]) {
    color: #5a9a90;
}
body.dark-theme form li#navblock-2 a:hover,
body.dark-theme a[href*="/pun/viewtopic"]:not([disabled]) {
    background-color: rgba(26, 58, 58, .4);
}
body.dark-theme #profilenav ul {
    border-bottom-color: #2a5a5a;
}
body.dark-theme #profile-right li:not(:last-child) {
    border-bottom-color: #2a4a4a;
}
body.dark-theme #pun-redirect .info a {
    color: #3a8a8a;
}
body.dark-theme .punbb .closedatafield + a,
body.dark-theme .punbb .closedatafield + strong > a {
    color: #888 !important;
}
body.dark-theme #pun-ulinks {
    background: #162626;
}
body.dark-theme .punbb .stickytext + a,
body.dark-theme .punbb .stickytext + strong > a,
body.dark-theme .punbb .stickytext + .closedatafield + a,
body.dark-theme .punbb .stickytext + .closedatafield + strong > a {
    color: #c8a0a0 !important;
}
body.dark-theme #pun-searchtopics.punbb .tcl a {
    color: #80b8b8 !important;
}
body.dark-theme .quote-box .quote-after.q-resize-1,
body.dark-theme #messages .post .quote-box.answer-box blockquote:not(.blockquote-toggle)::after {
    background: linear-gradient(to bottom, transparent 0%, #1a3a3a 80%, #1a3a3a 100%) !important;
}
body.dark-theme #pun-messages .main #messages tr:hover {
    background-color: rgba(255,255,255,.03);
}
body.dark-theme .usersname a,
body.dark-theme #onlinelist a,
body.dark-theme li.pa-author > a {
    filter: brightness(1.15) contrast(1.1);
}
body.dark-theme #pun-rules .main .html-box > p,
body.dark-theme #pun-regrules .main .html-box > p,
body.dark-theme #pun-register .main .info-box {
    background: #2a2a3a;
    border-color: #4a4a5a;
}
body.dark-theme #pun-rules font[color=grey],
body.dark-theme #pun-regrules font[color=grey] {
    color: #e0645a;
}
body.dark-theme #pun-rules span[style="color:red"],
body.dark-theme #pun-regrules span[style="color:red"] {
    color: #8bc34a !important;
}
body.dark-theme #pun-rules .main .html-box div > p,
body.dark-theme #pun-regrules .main .html-box div > p,
body.dark-theme #pun-rules .main .html-box span > a,
body.dark-theme #pun-regrules .main .html-box span > a {
    background: rgba(22, 38, 38) !important;
    border-color: rgba(0,0,0,.4);
}
body.dark-theme #pun-regrules .main p.formsubmit {
    background: transparent;
    border-color: transparent;
}
body.dark-theme .slider_wrap {
    box-shadow: 0 7px 10px rgba(0,0,0,.5) !important;
}
body.dark-theme #pun-pagelinks a:focus,
body.dark-theme #pun-pagelinks a:active {
    background-color: rgba(45, 167, 167, .5);
}
body.dark-theme [id^="tooltipsy"] {
    max-width: 90vw;
}
body.dark-theme .post-content .code-box .linenums li.L1,
body.dark-theme .post-content .code-box .linenums li.L3,
body.dark-theme .post-content .code-box .linenums li.L5,
body.dark-theme .post-content .code-box .linenums li.L7,
body.dark-theme .post-content .code-box .linenums li.L9 {
    background: transparent !important;
}
body.dark-theme .code-box .linenums .str { color: #6ab88a; }
body.dark-theme .code-box .linenums .kwd { color: #7a90b0; }
body.dark-theme .code-box .linenums .com { color: #c08a8a; }
body.dark-theme .code-box .linenums .typ { color: #c08090; }
body.dark-theme .code-box .linenums .lit { color: #60b0a8; }
body.dark-theme .code-box .linenums .clo,
body.dark-theme .code-box .linenums .opn,
body.dark-theme .code-box .linenums .pun { color: #c0a060; }
body.dark-theme .code-box .linenums .tag { color: #60b8d0; }
body.dark-theme .code-box .linenums .atn { color: #a880b8; }
body.dark-theme .code-box .linenums .atv { color: #90b870; }
body.dark-theme .code-box .linenums .pln { color: #c8d8d8; }

/* ===== Подсветка ссылок в постах ===== */
body.dark-theme .punbb .post-content p a {
    background: rgba(45, 167, 167, .08);
    border-radius: 3px;
    padding: 2px;
}
body.dark-theme .punbb .post-content p a:hover {
    color: #70e0d8;
}

/* ===== "Сказали спасибо" ===== */
body.dark-theme .postVoters strong {
    background: #1a4a4a;
    padding: 2px 6px;
    border-radius: 4px;
    color: #80d0c8;
    border: 1px solid #2a6a6a;
}

/* ===== Треугольники ===== */
body.dark-theme .post .post-body::before {
    border-color: transparent #1e3030 transparent transparent !important;
}
body.dark-theme .post .post-body::after {
    border-color: transparent #2a5050 transparent transparent !important;
}

/* ===== Checkbox/Radio ===== */
body.dark-theme input[type=checkbox],
body.dark-theme input[type=radio] {
    border-color: rgba(255,255,255,.1);
    background-color: rgba(0,0,0,.15);
}
body.dark-theme input[type=radio]:hover,
body.dark-theme input[type=checkbox]:hover {
    border-color: rgba(255,255,255,.25);
}
body.dark-theme input[type=radio]:checked:after {
    background: #c0d8d8;
}
body.dark-theme input[type=checkbox]:focus,
body.dark-theme input[type=radio]:focus {
    border-color: #c0d8d8;
}
body.dark-theme input[type=checkbox]:checked::after {
    color: #e0f0f0;
}

/* ===== Scrollbar ===== */
body.dark-theme *::-webkit-scrollbar {
    -webkit-appearance: none;
}
body.dark-theme *::-webkit-scrollbar:vertical {
    width: 8px;
}
body.dark-theme *::-webkit-scrollbar:horizontal {
    height: 8px;
}
body.dark-theme *::-webkit-scrollbar-thumb {
    background-color: rgba(80, 180, 170, .4);
    border-radius: 10px;
}
body.dark-theme *::-webkit-scrollbar-thumb:hover {
    background-color: rgba(100, 210, 200, .5);
}
body.dark-theme *::-webkit-scrollbar-thumb:active {
    background-color: rgba(120, 230, 220, .5);
}
body.dark-theme *::-webkit-scrollbar-track {
    background-color: rgba(255,255,255,.03);
    border-radius: 10px;
}
body.dark-theme *::-webkit-scrollbar-corner {
    background-color: transparent;
}

/* ===== Placeholder ===== */
body.dark-theme ::placeholder {
    color: rgba(200, 224, 224, .6);
}

/* ===== Post colors ===== */
body.dark-theme .post span[style="color: red"] { color: #ff8989 !important; }
body.dark-theme .post span[style="color: green"] { color: #6ab88a !important; }
body.dark-theme .post span[style="color: blue"] { color: #50a8e0 !important; }
body.dark-theme .post span[style="color: maroon"] { color: #c08090 !important; }
body.dark-theme .post span[style="color: olive"] { color: #d8d870 !important; }
body.dark-theme .post span[style="color: navy"] { color: #9090d8 !important; }

/* ===== Rating hearts ===== */
body.dark-theme div .post-rating p a {
    background: url(https://i.ibb.co/1Gx3mJ9Q/gray-heart.png) no-repeat center !important;
    background-size: 36px auto !important;
    filter: brightness(1.2) contrast(1.1);
}

/* ===== Animations ===== */
@keyframes fadebg-dark {
    0% { background-color: rgba(0, 80, 80, .15); }
    100% { background-color: #1e2e2e; }
}
body.dark-theme .punbb .post.new-ajax {
    animation: fadebg-dark 3s 3s ease-out forwards;
}

/* ===== Mobile ===== */
@media screen and (max-width: 540px) {
    body.dark-theme #pun .punbb #pun-main td {
        border-bottom-color: #2a4a4a !important;
    }
    body.dark-theme #pun-ulinks,
    body.dark-theme #pun-navlinks .container li a {
        filter: brightness(0.85);
    }
    body.dark-theme .punbb #pun-navlinks {
        top: -38px !important;
        background-color: #162626;
        border-bottom: 1px solid #162626 !important;
    }
    body.dark-theme .punbb .category .container,
    body.dark-theme .punbb .forum .container {
        border-top-color: #2a5a5a !important;
    }
    body.dark-theme #pun .punbb .post-author,
    body.dark-theme #pun .punbb .post-author ul {
        background-color: rgba(0,0,0,.1) !important;
    }
    body.dark-theme #pun .punbb .post h3 span {
        background-color: transparent !important;
        border-top: none !important;
    }
    body.dark-theme .punbb .post h3 {
        border-top-color: rgba(0,0,0,.1) !important;
    }
    body.dark-theme #paginator {
        border-color: rgba(255,255,255,.15) !important;
    }
    body.dark-theme #paginator td {
        border-color: rgba(255,255,255,.15) !important;
    }
    body.dark-theme #profile-right li {
        background-color: rgba(0,0,0,.15) !important;
        border-left: none !important;
    }
    body.dark-theme #pun .punbb tr.isticky div.icon,
    body.dark-theme #pun .punbb tr.inewisticky div.icon {
        filter: brightness(1.5) contrast(1.2);
        opacity: .7;
    }
}
</style>

<script type="text/javascript">
(function () {
    /* ===== Функция включения тёмной темы ===== */
    function setStyle () {
        $('.StyleSwitch').removeClass('St').addClass('My');
        $('.StyleSwitch').attr('title','Стандартный стиль Classic DarkCyan');
        $('body').addClass('dark-theme');
    }

    /* ===== Добавляем кнопку в HTML ===== */
    $('#html-header').prepend('<span class="StyleSwitch St" title="Тёмная тема Classic DarkCyan"></span>');
    $('.StyleSwitch').tipsy({fade: true, gravity: 'nw'});

    if($getCookie('StyleSwitch')) { setStyle(); }

    /* ===== Событие клика для включения ===== */
    $('.StyleSwitch.St').live('click', function () {
        $setCookie('StyleSwitch','My',30*3600*24*30*1000);
        setStyle();
    });

    /* ===== Событие клика для выключения ===== */
    $('.StyleSwitch.My').live('click', function () {
        $deleteCookie('StyleSwitch');
        $('.StyleSwitch').addClass('St').removeClass('My');
        $('.StyleSwitch').attr('title','Тёмная тема Classic DarkCyan');
        $('body').removeClass('dark-theme');
    });
})();
</script>
<!-- Конец тёмной темы Classic DarkCyan v.1--->
Тёмная тема для Classic DarkCyan v.2
Код:
<!-- Тёмная тема для Classic DarkCyan v.2-->
<style>
/* ===== Переключатель темы ===== */
#html-header {
    position: relative;
}
.StyleSwitch {
    height: 20px;
    width: 20px;
    position: absolute;
    z-index: 1000;
    right: 5px;
    top: 50px;
    border-radius: 50%;
    cursor: pointer;
    box-shadow: 0 0 10px rgba(0,0,0,.7);
    transition: .1s ease;
}
.StyleSwitch:hover { opacity: .8; }
.StyleSwitch.St {
    background: #426B9A url(https://forumstatic.ru/files/0016/a6/f8/22564.png) center center no-repeat!important;
    background-size: 16px!important;
}
.StyleSwitch.My {
    background: #6996CA url(https://forumstatic.ru/files/0016/a6/f8/90261.png) center center no-repeat!important;
    background-size: 16px!important;
}
 
/* ===== Треугольники (только для тёмной темы) ===== */
body.dark-theme .post .post-body::before {
    border-color: transparent #4a5b70 transparent transparent !important;
}
body.dark-theme .post .post-body::after {
    border-color: transparent #2d3748 transparent transparent !important;
}
 
/* ===== "Сказали спасибо" (только для тёмной темы) ===== */
body.dark-theme .postVoters strong {
    background: #5a7a8f;
    padding: 2px 4px;
    border-radius: 4px;
    color: #e8f0f5;
}
 
/* ===== Подсветка ссылок в постах (только для тёмной темы) ===== */
body.dark-theme .punbb .post-content p a {
    background: rgba(100,150,200,0.15);
    border-radius: 3px;
    padding: 2px;
}
body.dark-theme .punbb .post-content p a:hover { 
    color: #80c8e0;
}
</style>
 
<script type="text/javascript">
(function () {
    var style = 'https://forumstatic.ru/files/001a/f0/7d/73291.css?v=45'; // Ссылка на внешний CSS
    style = '<link rel="stylesheet" id="StyleAdd" type="text/css" href="'+style+'"/>';
 
    /* ===== Функция включения тёмного стиля ===== */
    function setStyle () {
        $('link[rel="stylesheet"]:last').after(style);
        $('.StyleSwitch').removeClass('St').addClass('My');
        $('.StyleSwitch').attr('title','Стандартный стиль');
        $('body').addClass('dark-theme');
    }
 
    /* ===== Добавляем кнопку в HTML ===== */
    $('#html-header').prepend('<span class="StyleSwitch St" title="Затемненный стиль"></span>');
    $('.StyleSwitch').tipsy({fade: true, gravity: 'nw'});
 
    if($getCookie('StyleSwitch')) { setStyle (); }
 
    /* ===== Событие клика по кнопке для включения ===== */
    $('.StyleSwitch.St').live('click', function () {
        $setCookie('StyleSwitch','My',30*3600*24*30*1000);
        setStyle ();
    });  
 
    /* ===== Событие клика по кнопке для выключения ===== */
    $('.StyleSwitch.My').live('click', function () {
        $('link#StyleAdd').remove();
        $deleteCookie('StyleSwitch');
        $('.StyleSwitch').addClass('St').removeClass('My');
        $('.StyleSwitch').attr('title','Затемненный стиль');
        $('body').removeClass('dark-theme');
    });
})();
</script>
<!-- Конец тёмной темы Classic DarkCyan v.2--->

Вариант №1 мне больше понравился :)

+1


Вы здесь » Единый форум поддержки » Новые возможности форумов » Запросы по скриптам #11