kuban-forum.ru - Лучший форум для общения

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

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


Вы здесь » kuban-forum.ru - Лучший форум для общения » 🛠️Технические вопросы работы форума » Исходные коды модификации этого форума.


Исходные коды модификации этого форума.

Сообщений 1 страница 8 из 8

1

Не секрет, что данный форум - это модификация стандартного варианта форума на платформе mybb.ru, сделанная с помощью javascript, CSS и параметров, которые добавляют функционал и меняют дизайн. Принято решение открыть используемые коды, чтобы самому было проще ориентироваться, редактировать и, возможно, это кому-то сможет пригодиться  :)

Дизайн и цвета элементов разработаны для использования  с темой  Mybb Vbulletin mix.
Для других тем может понадобиться редактирование параметров.

Подпись автора

Функционал форума Книга жалоб Книга предложений Знак зодиака Как вставить видео на форум Форум"Грибные места" Слайдер для картинок Live-box с темами

0

2

Администрирование - Формы - HTML верх

Закрытие форума на технические работы и т.п.

Скрипт выдаёт страницу поверх форума с объявлением о профилактических работах, о закрытии форума или любой произвольный текст.

Код:
<div id="pircs2"><!-- std.v.1/0/profilaktika --><link rel="stylesheet" type="text/css" href="https://forumstatic.ru/files/0010/b4/f8/46860.css" /><div id="msg-n2">У Вас отключён javascript.<br>В данном режиме, отображение ресурса<br/>браузером не поддерживается <br/></div><div id="LogIn_Window" style="display:none"><center>Уважаемые пользователи<br/> и гости Форума Кубани!<br/><br/>По причине<br/> отсутствия посещаемости<br/> данный форум  ЗАКРЫТ.<br/> Желаем приятного общения на других интернет-ресурсах.</center><br/> С уважением<center>Администрация форума.</center><br/><hr><br/><br/></div></div><!-- --><script type="text/javascript">

var ON_button=0; //Cвитч включения: 1 - включено!; 0 - выключено
var  moderDostyp_ON=0; //?Модер-доступ включён?: 1 - включен!; 0 - выключен

if(ON_button!=1||GroupID ==1||moderDostyp_ON*GroupID==2){
$("style.#style_st,div.#pircs2").replaceWith("");}
  else {$("#msg-n2").replaceWith("");
if(GroupID ==3) {$("#LogIn_Window").show();if(document.URL.indexOf("/login.php")==-1){
document.location.href = "../login.php"}else {
$(document).ready(function(){$("form#login").appendTo("#LogIn_Window");
$("#LogIn_Window").find("p.formsubmit a[href*='register.php']").text("");
var v=$("#LogIn_Window").find("p.formsubmit a[href*='action=forget']");
v.replaceWith("<span>Вход только для Администраторов</span>");});};}
else {document.location.href = "../login.php?action=out&id="+UserID};}
</script><!--end/profilaktika-->
Мгновенные уведомления

Это платный скрипт, требует оплаты и активации от админа площадки (Alex_63).
Тема на форуме техподдержки: https://forum.mybb.ru/viewtopic.php?id=38567#p939931

Код:
<!-- Мгновенные уведомления © Alex_63, 2024 -->
<link rel="stylesheet" type="text/css" href="//forumstatic.ru/f/ru/bestbb/notifications.css" />
<script type="text/javascript" src="//forumstatic.ru/f/ru/bestbb/notifications.js"></script>
 <script>
notifications.templates.reply.sound='https://forumstatic.ru/files/001a/f0/7d/12322.mp3';
</script>
<!-- Мгновенные уведомления: подписки на форум/тему © Alex_63, 2019 -->
<script>notifications.load('subscriptions');</script>
 
<!-- Мгновенные уведомления: упоминания © Alex_63, 2020 -->
<script>notifications.load('mentions');</script>

<!-- Мгновенные уведомления: Жалобы на сообщения с уведомлением администрации © Alex_63 -->
<script>notifications.load('reports');</script>

<!-- Мгновенные уведомления: регистрация новых участников © Alex_63 -->
<script>notifications.load('new_user')</script>
Скрыть предустановленные логотипы в шапке
Код:
<style>
#pun-title h1 {  display: none;}
#pun-title table {display: none;}
#pun-announcement h2 {display: none;}
#pun-announcement .container {padding-top: 1em}
</style>
Поставить свой логотип в шапке (на данном форуме не установлено, см. https://gribnikikybani.mybb.ru/)
Код:
<style>
#pun-title h1 {  display: none;}
#pun-title table {
    background-size: contain;
    background-position: center;
    background-image: url("https://forumstatic.ru/files/0010/54/6f/20763.jpg");
    /* (img-height / img-width * container-width) */
    /* (300 / 1310 * 100) */
    height: 0;
    padding-top: 22.9%;
    width: 100%;
}
#pun-announcement h2 {display: none;}
#pun-announcement .container {padding-top: 1em}
</style>
Задний фон форума
Код:
<!-- CS1 Background and text colours ----------------------->
<style>
html, body {background: #282a3b
    url(https://upforme.ru/uploads/001a/f0/7d/2/666686.png); background-attachment: fixed; background-position: top center; 
    border-radius: 10px;
    }
</style>
Подсвечивание ссылок фоном
Код:
<style>
/* Подсвечивание ссылок фоном  */
.punbb .post-content p a {
    background: #e0d8f2;
    border-radius: 3px;
    padding: 2px;
}
.punbb .post-content p a:hover { color: teal; }
</style>
Новые иконки для тем (и своя иконка статистики)

Иконки для тем: непрочитанной, прочитанной, закрытой, перемещённой. И заодно своя иконка статистики на главной странице.

Код:
<style type="text/css"> /* Ставим новые иконки  */
TR.inew Div.icon {
background: url(https://upforme.ru/uploads/001a/f0/7d/2/457111.png) no-repeat;}
TR.isticky Div.icon {
background: url(https://upforme.ru/uploads/001a/f0/7d/2/612441.png) no-repeat;}
TR.iclosed Div.icon {
background: url(https://upforme.ru/uploads/001a/f0/7d/153/571297.png) no-repeat;}
TR Div.icon{
background: url(https://upforme.ru/uploads/001a/f0/7d/2/163462.png) no-repeat;}
TR.iredirect Div.icon {
background: url(https://upforme.ru/uploads/001a/f0/7d/2/557788.png) no-repeat;}
#pun-stats ul.container {background-image: url("https://i.ibb.co/xHMjNMF/stata.png"); background-repeat: no-repeat; }/* Иконка статистики */
</style>
Выделение ников после слова "Привет" на главной странице
Код:
<style>
.gid1 #pun-status .item1 strong {
    color: teal; /*цвет Админа после Привета*/
    background: #bed2f7;
padding: 0px 10px 3px !important;
border-radius: 6px !important;   
}
.gid2 #pun-status .item1 strong {
    color: purple; /*цвет Модераторов после Привета*/
  background: #bed2f7;
padding: 0px 10px 3px !important;
border-radius: 6px !important;  
}
.gid4 #pun-status .item1 strong {
        background: #bed2f7;
padding: 0px 10px 3px !important;
border-radius: 6px !important;   
}
</style>
"Лайки" (т.н. быстроплюсы) в "сердечке"
Код:
<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>
<!--// Быстроплюсы v.1 by Deff //-->
<script src="https://forumstatic.ru/files/001b/a6/d4/74583.js"></script>
Закругления углов для цитат, спойлеров, картинок  и т.п. рамок, и для аватаров
Код:
<!-- Закругления НАЧАЛО-->
<style type="text/css">
iframe {
    border-radius: 10px;
}
.code-box{padding-left:50px!important; border-radius: 10px !important;
    border: 1px solid #c5d0e6;
}
.quote-box.hide-box{padding-left:50px!important; background: #faf0e6; border-radius: 10px !important;
    border: 1px #c5d0e6;
}
.quote-box.answer-box{padding-left:50px!important; background: #e6e6fa; border-radius: 10px !important;
    border: 1px solid #c5d0e6;
}
.spoiler-box.media-box{padding-left:50px!important;  background: #e6e5ff; border-radius: 10px !important;
    border: 1px solid #c5d0e6;
}
.spoiler-box.text-box{padding-left:50px!important;  background: #e8e8fc; border-radius: 10px !important;
    border: 1px solid #c5d0e6;
}
.quote-box.spoiler-box{padding-left:50px!important; background: #e8e8fc; border-radius: 10px !important;
   border: 1px solid #c5d0e6;
}
.quote-box.quote-main{padding-left:50px!important; background: #e6e6fa; border-radius: 10px !important;   border: 1px solid #c5d0e6;
}

.post .postimg {
    border-radius: 7px;
/* border: solid 1px #ccc; */

#pun-main h3 >a{ 
background: #f8f8ff;
padding: 0px 7px 3px !important;
border-radius: 10px !important;
</style>
<!-- Закругления КОНЕЦ-->
<!-- Аватары закругления НАЧАЛО-->
    <style>
.post .pa-avatar img {
  max-width: 130px;
  border-radius: 10px;              /* Закругление углов */
  box-shadow: 0px 5px 18px #000;    /* Тень */
}
</style>
<!-- Аватары закругления КОНЕЦ-->
Аватар в цитате, часть 1 для HTML верх
Код:
<!-- Аватар в цитате V.2 © Alex_63 / Ч.1 в HTML верх-->
<style type="text/css">
.quote-box.with-avatar{padding-left:50px!important;}
.author-avatar+span {margin-left:0;}
.author-avatar {
  float: left;
  width: 39px;
  margin-left: -40px;
  margin-top:0;
}
.author-avatar > img {
  width: 28px;
  padding: 2px;
  border: 1px solid #c4cad4;
  border-radius: 4px;
}
</style>
<script type="text/javascript">
var QuoteImg = 'https://forumstatic.ru/files/0015/ec/20/41408.png'; //Картинка "Перейти к сообщению" в цитате
</script><script type="text/javascript" src="https://forumstatic.ru/files/0015/c4/3f/77306.js"></script>
Иконки для разделов на главной странице форума
Код:
<!--НАЧАЛО иконки для разделов на главной-->
<style>
.punbb tr#forum_f61 div.icon {background: url("https://upforme.ru/uploads/001a/f0/7d/2/15869.png")  no-repeat left center / contain;}
.punbb tr#forum_f43 div.icon {background: url("https://cdn2.iconfinder.com/data/icons/emoji-glyph/32/complaint_emotion_face-64.png")  no-repeat left center / contain;}
.punbb tr#forum_f5 div.icon {background: url("https://upforme.ru/uploads/001a/f0/7d/2/179432.png") no-repeat left center / contain;}
.punbb tr#forum_f7 div.icon {background: url("https://upforme.ru/uploads/001a/f0/7d/2/207128.jpg") no-repeat left center / contain;}
.punbb tr#forum_f9 div.icon {background: url("https://upforme.ru/uploads/001a/f0/7d/2/647386.png") no-repeat left center / contain;}
.punbb tr#forum_f31 div.icon {background: url("https://upforme.ru/uploads/001a/f0/7d/2/95236.png") no-repeat left center / contain;}
.punbb tr#forum_f2 div.icon {background: url("https://upforme.ru/uploads/001a/f0/7d/2/407024.png") no-repeat left center / contain;}
.punbb tr#forum_f1 div.icon {background: url("https://upforme.ru/uploads/001a/f0/7d/2/147440.png") no-repeat left center / contain;}
.punbb tr#forum_f44 div.icon {background: url("https://upforme.ru/uploads/001a/f0/7d/2/353134.jpg") no-repeat left center / contain;}
.punbb tr#forum_f11 div.icon {background: url("https://upforme.ru/uploads/001a/f0/7d/2/994291.png") no-repeat left center / contain;}
.punbb tr#forum_f26 div.icon {background: url("https://upforme.ru/uploads/001a/f0/7d/2/671302.png") no-repeat left center / contain;}
.punbb tr#forum_f4 div.icon {background: url("https://upforme.ru/uploads/001a/f0/7d/2/482309.png") no-repeat left center / contain;}
.punbb tr#forum_f17 div.icon {background: url("https://upforme.ru/uploads/001a/f0/7d/2/997695.png") no-repeat left center / contain;}
.punbb tr#forum_f18 div.icon {background: url("https://upforme.ru/uploads/001a/f0/7d/2/394185.png") no-repeat left center / contain;}
.punbb tr#forum_f16 div.icon {background: url("https://upforme.ru/uploads/001a/f0/7d/2/25358.png") no-repeat left center / contain;}
.punbb tr#forum_f6 div.icon {background: url("https://upforme.ru/uploads/001a/f0/7d/2/298246.png") no-repeat left center / contain;}
.punbb tr#forum_f20 div.icon {background: url("https://upforme.ru/uploads/001a/f0/7d/2/t514161.png") no-repeat left center / contain;}
.punbb tr#forum_f37 div.icon {background: url("https://upforme.ru/uploads/001a/f0/7d/2/t965429.png") no-repeat left center / contain;}
.punbb tr#forum_f39 div.icon {background: url("https://upforme.ru/uploads/001a/f0/7d/2/287850.png") no-repeat left center / contain;}
.punbb tr#forum_f38 div.icon {background: url("https://upforme.ru/uploads/001a/f0/7d/2/167479.png") no-repeat left center / contain;}
.punbb tr#forum_f14 div.icon {background: url("https://upforme.ru/uploads/001a/f0/7d/2/140779.png") no-repeat left center / contain;}
.punbb tr#forum_f25 div.icon {background: url("https://upforme.ru/uploads/001a/f0/7d/2/526709.png") no-repeat left center / contain;}
.punbb tr#forum_f30 div.icon {background: url("https://upforme.ru/uploads/001a/f0/7d/2/425431.png") no-repeat left center / contain;}
.punbb tr#forum_f42 div.icon {background: url("https://upforme.ru/uploads/001a/f0/7d/2/950521.png") no-repeat left center / contain;}
.punbb tr#forum_f41 div.icon {background: url("https://upforme.ru/uploads/001a/f0/7d/2/811224.png") no-repeat left center / contain;}
.punbb tr#forum_f40 div.icon {background: url("https://upforme.ru/uploads/001a/f0/7d/2/673546.png") no-repeat left center / contain;}
.punbb tr#forum_f23 div.icon {background: url("https://upforme.ru/uploads/001a/f0/7d/2/745816.png") no-repeat left center / contain;}
.punbb tr#forum_f22 div.icon {background: url("https://upforme.ru/uploads/001a/f0/7d/2/386313.png") no-repeat left center / contain;}
.punbb tr#forum_f28 div.icon {background: url("https://upforme.ru/uploads/001a/f0/7d/2/957166.png") no-repeat left center / contain;}
.punbb tr#forum_f19 div.icon {background: url("https://upforme.ru/uploads/001a/f0/7d/2/421032.png") no-repeat left center / contain;}
.punbb tr#forum_f27 div.icon {background: url("https://upforme.ru/uploads/001a/f0/7d/2/36645.png") no-repeat left center / contain;}
.punbb tr#forum_f34 div.icon {background: url("https://upforme.ru/uploads/001a/f0/7d/2/159249.png") no-repeat left center / contain;}
.punbb tr#forum_f32 div.icon {background: url("https://upforme.ru/uploads/001a/f0/7d/2/819195.png") no-repeat left center / contain;}
.punbb tr#forum_f33 div.icon {background: url("https://upforme.ru/uploads/001a/f0/7d/2/811602.png") no-repeat left center / contain;}
.punbb tr#forum_f35 div.icon {background: url("https://upforme.ru/uploads/001a/f0/7d/2/16879.png") no-repeat left center / contain;}
.punbb tr#forum_f36 div.icon {background: url("https://upforme.ru/uploads/001a/f0/7d/2/542994.png") no-repeat left center / contain;}
.punbb tr#forum_f45 div.icon {background: url("https://upforme.ru/uploads/001a/f0/7d/2/282462.png") no-repeat left center / contain;}
.punbb tr#forum_f46 div.icon {background: url("https://upforme.ru/uploads/001a/f0/7d/2/70801.png") no-repeat left center / contain;}
.punbb tr#forum_f47 div.icon {background: url("https://upforme.ru/uploads/001a/f0/7d/2/907900.png") no-repeat left center / contain;}
.punbb tr#forum_f49 div.icon {background: url("https://upforme.ru/uploads/001a/f0/7d/2/67882.png") no-repeat left center / contain;}
.punbb tr#forum_f50 div.icon {background: url("https://i.ibb.co/kQ1JB9y/icons8-billboard-94.png") no-repeat left center / contain;}
.punbb tr#forum_f55 div.icon {background: url("https://i.ibb.co/HNvMFHJ/web-dialog-logo.png") no-repeat left center / contain;}
.punbb tr#forum_f56 div.icon {background: url("https://upforme.ru/uploads/001a/f0/7d/2/t137703.webp") no-repeat left center / contain;}
.punbb tr#forum_f58 div.icon {background: url("https://upforme.ru/uploads/001a/f0/7d/2/805404.png") no-repeat left center / contain;}
.punbb tr#forum_f60 div.icon {background: url("https://upforme.ru/uploads/001a/f0/7d/2/555665.png") no-repeat left center / contain;}
</style>
<!--КОНЕЦ иконки для разделов на главной-->
Красивые кнопки
Код:
<!--НАЧАЛО красивые кнопки-->
<style>
.button {
   border: 1px solid #0a3c59;
   background: #3e779d;
   text-align: center;
   background: -webkit-gradient(linear, left top, left bottom, from(#65a9d7), to(#3e779d));
   background: -webkit-linear-gradient(top, #65a9d7, #3e779d);
   background: -moz-linear-gradient(top, #65a9d7, #3e779d);
   background: -ms-linear-gradient(top, #65a9d7, #3e779d);
   background: -o-linear-gradient(top, #65a9d7, #3e779d);
   background-image: -ms-linear-gradient(top, #65a9d7 0%, #3e779d 100%);
   padding: 10.5px 21px;
   -webkit-border-radius: 6px;
   -moz-border-radius: 6px;
   border-radius: 6px;
   -webkit-box-shadow: rgba(255,255,255,0.4) 0 1px 0, inset rgba(255,255,255,0.4) 0 1px 0;
   -moz-box-shadow: rgba(255,255,255,0.4) 0 1px 0, inset rgba(255,255,255,0.4) 0 1px 0;
   box-shadow: rgba(255,255,255,0.4) 0 1px 0, inset rgba(255,255,255,0.4) 0 1px 0;
   text-shadow: #7ea4bd 0 1px 0;
   color: #06426c;
   font-size: 14px;
   font-family: helvetica, serif;
   text-decoration: none;
   vertical-align: middle;
      }
 .button:hover {
   border: 1px solid #0a3c59;
   text-shadow: #1e4158 0 1px 0;
   background: #3e779d;
   background: -webkit-gradient(linear, left top, left bottom, from(#65a9d7), to(#3e779d));
   background: -webkit-linear-gradient(top, #65a9d7, #3e779d);
   background: -moz-linear-gradient(top, #65a9d7, #3e779d);
   background: -ms-linear-gradient(top, #65a9d7, #3e779d);
   background: -o-linear-gradient(top, #65a9d7, #3e779d);
   background-image: -ms-linear-gradient(top, #65a9d7 0%, #3e779d 100%);
   color: #fff;
   }
 .button:active {
   text-shadow: #1e4158 0 1px 0;
   border: 1px solid #0a3c59;
   background: #65a9d7;
   background: -webkit-gradient(linear, left top, left bottom, from(#3e779d), to(#3e779d));
   background: -webkit-linear-gradient(top, #3e779d, #65a9d7);
   background: -moz-linear-gradient(top, #3e779d, #65a9d7);
   background: -ms-linear-gradient(top, #3e779d, #65a9d7);
   background: -o-linear-gradient(top, #3e779d, #65a9d7);
   background-image: -ms-linear-gradient(top, #3e779d 0%, #65a9d7 100%);
   color: #fff;
}
   </style>
<!--КОНЕЦ красивые кнопки-->
Уменьшение ширины профайла в темах
Код:
<!-- уменьшение ширины профайла в темах-->
   <style type="text/css">  
.punbb .post h3 span, .punbb .post-body, .punbb .post-links {
    margin-left: 18em;
}
.punbb .post-links ul {
  margin-left: -17em;
}
.punbb .post .post-author {
  width: 17em;
  .punbb .post-body {
      margin-left: 17em;}
}
</style>
Увеличение ширины форума
Код:
<!-- Ширина форума -->
<style>
#pun {width: 91%;margin: auto;
    border-radius: 10px;
}
</style>
<!-- Ширина форума -->
Cпойлер для cкрытия полей мини-профиля в топиках
Код:
<!--НАЧАЛО  html-верх - Cпойлер для cкрытия полей мини-профиля в топиках, (с) ForumD.ru, satsana, 2021 -->
<script type="text/javascript" src="https://forumstatic.ru/files/0017/b3/fc/83644.js"></script>
<script type="text/javascript">
//  satMSP.vertical = 1; // вертикальный спойлер (кнопки расположены в столбик, вкладка открывается под кнопкой); по умолчанию кнопки расположены в одну строку над вкладками
//  satMSP.nofold = 1; // не закрывать открытые ранее вкладки при открытии новой; по умолчанию закрываются
//  satMSP.showtab = 1; // номер отображаемой при загрузке вкладки; по умолчанию все вкладки свёрнуты
//  satMSP.showbut = 1; // 1 - показывать все кнопки; по умолчанию копки пустых вкладок не отображаются
//  satMSP.speed = 600; // время сворачивания-разворачивания вкладок в мс (1 секунда = 1000мс), 0 - мгновенно, значение по умолчанию 400.
  satMSP.fields = [
    { // Список полей перед спойлером
      flist: [
"pa-author",	// Ник
"pa-title",	// Статус
"pa-fld1",	// Доп.поле1
"pa-avatar",	// Аватар
      ""] // Конец списка полей перед спойлером
    },
    { // Первая вкладка
      name: "Развернуть/Свернуть",
      img: "https://upforme.ru/uploads/001a/f0/7d/2/313111.png",
      flist: [
"pa-ip",	// IP
"pa-age",	// Возраст
"pa-from",	// Откуда
"pa-posts",	// Сообщений
"pa-respect",	// Уважение
"pa-sex",	// Пол
"pa-fld2",     //Знак Зодиака 
"pa-ua", //OS+browser
      ""]
    }, // Конец первой вкладки
            {} // Конец списка вкладок
  ];
</script><!-- Cпойлер cкрытия полей мини-профиля - КОНЕЦ -->
Сворачивание длинных цитат
Код:
<!-- Сворачивание длинных цитат -->
<style type="text/css">
.quote-box.toggle blockquote,.quote-box.toggle{position:relative;overflow-y:hidden}
.quote-box .quote-after{width:100%;height:2em;position:absolute;display:block;bottom:-.1em;transition:background-image .4s ease;cursor:pointer}
.quote-after:before {content:"^";width:100%;text-align:center;position:absolute;line-height:2em;font-weight:700;font-size:1.2em;bottom:-.3em;transition:opacity .4s ease;opacity:.6}
.quote-after.q-resize-1:before {transform:rotate(180deg);top:0;bottom:0;}
.quote-box:hover .quote-after:before{opacity:1;}
</style>

    <script type="text/javascript" src="https://forumstatic.ru/files/0015/c4/3f/91221.js"></script>
   <!-- Сворачивание длинных цитат -->
Выделение фона для ника над аватаром (в темах)

Для админов, модераторов и пользователей цвета разные. Сделано с запасом на возможные будущие группы :)

Код:
<!-- Выделение ника и фона для ника над аватаром (в темах) -->  
    <style>

div[data-group-id="1"] li.pa-author>a 
{
background: #bed2f7;
padding: 0px 10px 3px !important;
border-radius: 6px !important;
}

div[data-group-id="2"] li.pa-author>a 
{
background: #d3c5f0;
padding: 0px 10px 3px !important;
border-radius: 6px !important;
}

div[data-group-id="3"] li.pa-author>a 
{color:
background: #c9d5ec;
padding: 0px 10px 3px !important;
border-radius: 6px !important;
}

div[data-group-id="4"] li.pa-author>a 
{
background: #bed2f7;
padding: 0px 10px 3px !important;
border-radius: 6px !important;
}

div[data-group-id="5"] li.pa-author>a 
{
background: #bed2f7;
padding: 0px 10px 3px !important;
border-radius: 6px !important;
}
div[data-group-id="6"] li.pa-author>a 
{
background: #bed2f7;
padding: 0px 10px 3px !important;
border-radius: 6px !important;
}
div[data-group-id="7"] li.pa-author>a 
{
background: #bed2f7;
padding: 0px 10px 3px !important;
border-radius: 6px !important;
}
div[data-group-id="8"] li.pa-author>a 
{
background: #bed2f7;
padding: 0px 10px 3px !important;
border-radius: 6px !important;
}
div[data-group-id="9"] li.pa-author>a 
{
background: #bed2f7;
padding: 0px 10px 3px !important;
border-
div[data-group-id="10"] li.pa-author>a 
{
background: #bed2f7;
padding: 0px 10px 3px !important;
bord
div[data-group-id="11"] li.pa-author>a 
{
background: #bed2f7;
padding: 0px 10px 3px !important;
border-radius: 6px !important;
}
div[data-group-id="12"] li.pa-author>a 
{
background: #bed2f7;
padding: 0px 10px 3px !important;
border-radius: 6px !important;
}
</style>
<!-- Выделение ника и фона для ника над аватаром (в темах) -->
Убрать кнопку "поделиться"
Код:
<style>
.sharelink{
  display:none!important;
}
  </style>
Скрытие профиля в теме тегом

Внимание! В приведённом ниже коде следует заменить все слова hide_profile на hideprofile

Код:
<!--Скрытие профиля в теме тегом-->
    <style type="text/css">.hide_profile .post-author,.hide_profile .pl-email,.hide_profile .pl-website{display:none!important}
    .hide_profile .post-body,.hide_profile .post-links,.hide_profile .post-links ul,.post.hide_profile h3>span{margin-left:0!important}</style>
    <script>
    if(GroupID!=3&&(GroupID<3||[].indexOf(UserID)!=-1))FORUM.set('editor.addition.tags.hide_profile',{name:'Скрыть минипрофиль',onclick:function(){insert('[hide_profile]');}});
    $().pun_mainReady(function(){$('.post:contains("[hide_profile]")').addClass('hide_profile').html(function(){return $(this).html().replace(/\[hide_profile\]/gim,'')})});
    </script>
<!--Скрытие профиля в теме тегом-->
Индикатор активности пользователя
Код:
<!-- /* Индикатор активности пользователя */) -->
<style> 
.post .post-author ul {
  position: relative;
}
.post-author .pa-online,
.post-author:not(.online) .pa-author .acchide {
  position: absolute;
  display: inline-block !important;
  top: .2rem;
  right: .5rem;
  left: auto !important;
  line-height: unset;
  background: #8ac176;!important;
  height: .6rem !important;
  width: .6rem !important;
  margin: 0 0 0 -5px !important;
  padding: 0 !important;
  border: 0 !important;
  -webkit-transition: all .2s ease;
  -moz-transition: all .2s ease;
  transition: all .2s ease;
  -webkit-border-radius: 50%;
  -moz-border-radius: 50%;
  border-radius: 50%;
  cursor: pointer;
}
.post-author .pa-online:hover {
  background: #aad79a !important;
}
.post-author .pa-online:before,
.post-author.online .pa-author:after {
  content: unset !important;
}
.post-author:not(.online) .pa-author .acchide {
  background: #bbb !important;
}
.post-author:not(.online) .pa-author .acchide:hover {
  background: #ccc !important;
}
.post-author .pa-online:hover strong,
.post-author:has(.acchide:hover) .pa-last-visit,
.post-author .pa-last-visit:hover {
  opacity: .7;
  visibility: visible;
}
.post-author .pa-online strong,
.post-author .pa-last-visit {
  position: absolute;
  display: inline-block !important;
  top: 16px;
  right: -6px;
  padding: 0 8px !important;
  min-height: 24px;
  line-height: 24px;
  background: black;
  font-weight: 400;
  white-space: nowrap;
  color: #fff;
  font-size: 90%;
  text-shadow: rgba(0,0,0,0.2) 0 -1px 0;
  text-align: center;
  z-index: 10;
  -webkit-border-radius: 3px;
  -moz-border-radius: 3px;
  border-radius: 3px;
  -webkit-transition: all .2s ease;
  -moz-transition: all .2s ease;
  transition: all .2s ease;
  opacity: 0;
  visibility: hidden;
  cursor: text;
}
.post-author .pa-last-visit {
  top: 20px;
  right: 5px;
}
.post-author .pa-online strong:before,
.post-author .pa-last-visit:before {
  content: "";
  position: absolute;
  width: 0;
  height: 0;
  right: 5px;
  top: -10px;
  border-width: 6px 6px;
  border-style: solid;
  border-color: transparent transparent black transparent;
}
</style> 
<!-- /* Индикатор активности пользователя */) -->
Размер шрифтов по умолчанию
Код:
<style>
.punbb {
  font: normal 70% verdana, arial, helvetica, sans-serif;
  }
</style>
Вертикальное меню в профиле и сообщениях
Код:
<!-- НАЧАЛО Вертикальное меню в профиле и сообщениях -->
<style>
@media screen and (min-width: 540px) {
#profile > .container {
  padding: 1em 1em 1em 0 !important;
}
#profilenav {
  float: left;
  display: inline-block;
  width: 42px;
  margin: 0 1em 0;
  z-index: 10;
}
#profilenav ul, #profilenav li {
  padding: 0;
  margin: 0;
}
#profilenav h2 {
  display: none;
}
#profilenav ul {
  border: 1px solid #dbdbdb;
  background: #ebebeb;
  margin-bottom: 1em;
  width: 42px;
}
#profilenav ul li {
  border-bottom: 1px solid #dbdbdb;
}
#profilenav ul li:last-child {
  border-bottom: 0;
}
#profilenav li a {
  display: block;
  height: 0;
  width: 0;
  padding: 21px;
  color: transparent;
  text-decoration: none !important;
  text-indent: -9999px;
  z-index: 1;
  border-radius: 0;
  box-shadow: none;
}
#profilenav li a:hover {
  line-height: 0;
  padding-left: 50px;
}
#profilenav li a:hover, #nav-standard li a:hover, #pun-adnav li a:hover {
  text-decoration: none !important;
}
#profilenav ul li a:hover {
  position: relative;
  padding-right: 120px;
  color: #fff;
  text-indent: 0;
}
#pun-profile #profilenav ul li a, #pun-messages #profilenav ul li a {
  background-repeat: no-repeat;
}
 
/* Цвет при наведении и активного пункта */
#profilenav li.isactive a, #profilenav ul li a:hover {
  background-color: #4c9b72;
  box-shadow: none;
  border: 0;
}
/* Спрайт для Профиль */
#pun-profile #profilenav ul li a {
  background-image: url(https://forumstatic.ru/files/0007/af/57/65555.png);
}
/* Спрайт для Сообщения */
#pun-messages #profilenav ul li a {
  background-image: url(https://forumstatic.ru/files/0007/af/57/55565.png);
}
 
/* Входящие / Просмотр */
#pun-messages #profilenav ul .item1 a {
  background-position: 0 0;
}
#pun-profile #profilenav ul .view a:hover, #pun-profile #profilenav ul .view.isactive a, #pun-messages #profilenav ul .item1.isactive a, #pun-messages #profilenav ul .item1 a:hover {
  background-position: -42px 0;
}
/* -- */
/* Отправленные */
#pun-messages #profilenav ul .item2 a {
  background-position: 0 -42px;
}
#pun-messages #profilenav ul .item2.isactive a, #pun-messages #profilenav ul .item2 a:hover {
  background-position: -42px -42px;
}
/* -- */
/* Новое сообщение */
#pun-messages #profilenav ul:last-child .item1 a {
  background-position: 0 -84px;
}
#pun-messages #profilenav ul:last-child .item1.isactive a, #pun-messages #profilenav ul:last-child .item1 a:hover {
  background-position: -42px -84px;
}
/* -- */
/* Статус / Аватар */
#pun-messages #profilenav ul:last-child .item2 a {
  background-position: 0 -126px;
}
#pun-messages #profilenav ul:last-child .item2.isactive a, #pun-messages #profilenav ul:last-child .item2 a:hover {
  background-position: -42px -126px;
}
/* -- */
/* Всё прочитано */
#pun-messages #profilenav ul:last-child .item3 a {
  background-position: 0 -168px;
}
#pun-messages #profilenav ul:last-child .item3.isactive a, #pun-messages #profilenav ul:last-child .item3 a:hover {
  background-position: -42px -168px;
}
/* -- */
/* Очистить папку */
#pun-messages #profilenav ul:last-child .item4 a {
  background-position: 0 -210px;
}
#pun-messages #profilenav ul:last-child .item4.isactive a, #pun-messages #profilenav ul:last-child .item4 a:hover {
  background-position: -42px -210px;
}
/* -- */
/* - Начало Профиль - */
/* Основной */
#pun-profile #profilenav ul .item1 a {
  background-position: 0 -42px;
}
#pun-profile #profilenav ul .item1 a:hover, #pun-profile #profilenav ul .item1.isactive a {
  background-position: -42px -42px;
}
/* -- */
/* Персональный */
#pun-profile #profilenav ul .item2 a {
  background-position: 0 -84px;
}
#pun-profile #profilenav ul .item2 a:hover, #pun-profile #profilenav ul .item2.isactive a {
  background-position: -42px -84px;
}
/* -- */
/* Общения */
#pun-profile #profilenav ul .item3 a {
  background-position: 0 -126px;
}
#pun-profile #profilenav ul .item3 a:hover, #pun-profile #profilenav ul .item3.isactive a {
  background-position: -42px -126px;
}
/* -- */
/* Аватар */
#pun-profile #profilenav ul .item4 a {
  background-position: 0 -168px;
}
#pun-profile #profilenav ul .item4 a:hover, #pun-profile #profilenav ul .item4.isactive a {
  background-position: -42px -168px;
}
/* -- */
/* Подпись */
#pun-profile #profilenav ul .item5 a {
  background-position: 0 -210px;
}
#pun-profile #profilenav ul .item5 a:hover, #pun-profile #profilenav ul .item5.isactive a {
  background-position: -42px -210px;
}
/* -- */
/* Отображения */
#pun-profile #profilenav ul .item6 a {
  background-position: 0 -252px;
}
#pun-profile #profilenav ul .item6 a:hover, #pun-profile #profilenav ul .item6.isactive a {
  background-position: -42px -252px;
}
/* -- */
/* Приватность */
#pun-profile #profilenav ul .item7 a {
  background-position: 0 -294px;
}
#pun-profile #profilenav ul .item7 a:hover, #pun-profile #profilenav ul .item7.isactive a {
  background-position: -42px -294px;
}
/* -- */
/* Дополнительно */
#pun-profile #profilenav ul .item8 a {
  background-position: 0 -336px;
}
#pun-profile #profilenav ul .item8 a:hover, #pun-profile #profilenav ul .item8.isactive a {
  background-position: -42px -336px;
}
/* -- */
/* Приглашения */
#pun-profile #profilenav ul .item9 a {
  background-position: 0 -378px;
}
#pun-profile #profilenav ul .item9 a:hover, #pun-profile #profilenav ul .item9.isactive a {
  background-position: -42px -378px;
}
/* -- */
/* Загрузки */
#pun-profile #profilenav ul .item10 a {
  background-position: 0 -420px;
}
#pun-profile #profilenav ul .item10 a:hover, #pun-profile #profilenav ul .item10.isactive a {
  background-position: -42px -420px;
}
/* -- */
/* Управление */
#pun-profile #profilenav ul .item11 a {
  background-position: 0 -462px;
}
#pun-profile #profilenav ul .item11 a:hover, #pun-profile #profilenav ul .item11.isactive a {
  background-position: -42px -462px;
}
/* -- */
/* - Конец Профиль - */
}
</style>
<!-- КОНЕЦ Вертикальное меню в профиле и сообщениях -->
Индикатор загрузки страницы
Код:
<!--НАЧАЛО Индикатор загрузки страницы-->
<script>
$(function() {
$("body").append($("<div></div>").attr("id", "progress"));
$("#progress").width((30 + Math.random() * 30) + "%");
});
$(window).load(function() {
$("#progress").width("101%").delay(300).fadeOut(400);
});
</script>
<style>
#progress {
position:fixed;
z-index:100;
top:0;
left:0;
width:1%;
height:6px;
background:#4881ea;
border-radius:1px;
transition:width 500ms ease-out,opacity 400ms linear;
}
</style>
<!--КОНЕЦ Индикатор загрузки страницы -->
Разграничитель между текстом и подписью в посте
Код:
<!--НАЧАЛО Разграничитель между текстом и подписью в посте-->
<style>
@media screen and (min-width: 540px) {
.punbb .post-sig dt {
    background: url("https://forumstatic.ru/files/0015/e5/72/22984.png") repeat scroll 0 0 transparent;
    border: medium none;
    height: 20px;
    width: 618px;
}
}
</style>
<!--КОНЕЦ Разграничитель между текстом и подписью в посте-->
Треугольник (влево) в мини профайле в теме
Код:
<!--Начало Треугольник -->
<style>
.post .post-body {
    position: relative;
    overflow: visible;
}
.post .post-body::before {
    content: "";
    border: solid 12px;
    border-color: transparent #f5f5ff transparent transparent;
    display: block;
    position: absolute;
    left: -24px;
    top: 15px;
    z-index: 1;
}
.post .post-body::after {
    content: "";
    border: solid 13px;
    border-color: transparent #d1d1e1 transparent transparent;
        display: block;
    position: absolute;
    left: -26px;
    top: 14px;
   }
   </style>
<!--Конец Треугольник -->
Картинки в шапке разделов
Код:
<!--Начало Картинки в шапке раздела -->
<style>
@media screen and (min-width: 540px) {
/* Женский вопрос */
#pun-viewforum[data-forum-id="1"] .main::before {
  content: '';
  display: inline-block;
  background: url(https://i.ibb.co/Qpbp5Qd/jv.gif) no-repeat center;
  height: 45px;
  margin-top: -10em;
  width: 100%;
}
  /* Политический форум */
#pun-viewforum[data-forum-id="5"] .main::before {
  content: '';
  display: inline-block;
  background: url(https://upforme.ru/uploads/001a/f0/7d/2/471010.png) no-repeat center;
  height: 55px;
  margin-top: -5em;
  width: 100%;
}
  /* Дела домашние */
#pun-viewforum[data-forum-id="6"] .main::before {
  content: '';
  display: inline-block;
  background: url(https://i.ibb.co/8dN02xj/1062.gif) no-repeat center;
  height: 55px;
  margin-top: -11em;
  width: 100%;
}
  /* Кофейня */
#pun-viewforum[data-forum-id="7"] .main::before {
  content: '';
  display: inline-block;
  background: url(https://upforme.ru/uploads/001a/f0/7d/2/322436.png) no-repeat center;
  height: 55px;
  margin-top: -5em;
  width: 100%;
}
  /* Клуб Паноптикум */
#pun-viewforum[data-forum-id="9"] .main::before {
  content: '';
  display: inline-block;
  background: url(https://upforme.ru/uploads/001a/f0/7d/2/222262.png) no-repeat center;
  height: 55px;
  margin-top: -10em;
  width: 100%;
}
/* За рулём */
#pun-viewforum[data-forum-id="11"] .main::before {
  content: '';
  display: inline-block;
  background: url(https://i.ibb.co/GFw2Zf4/1059.gif) no-repeat center;
  height: 55px;
  margin-top: -10em;
  width: 100%;
}
/* Барахолка */
#pun-viewforum[data-forum-id="14"] .main::before {
  content: '';
  display: inline-block;
  background: url(https://i.ibb.co/p12bSg1/1094.gif) no-repeat center;
  height: 55px;
  margin-top: -10em;
  width: 100%;
}
/* Радиолюбитель */
#pun-viewforum[data-forum-id="16"] .main::before {
  content: '';
  display: inline-block;
  background: url(https://i.ibb.co/S6xSwFM/1060.gif) no-repeat center;
  height: 55px;
  margin-top: -10em;
  width: 100%;
}
/* Компьютеры и программы */
#pun-viewforum[data-forum-id="18"] .main::before {
  content: '';
  display: inline-block;
  background: url(https://upforme.ru/uploads/001a/f0/7d/2/569437.png) no-repeat center;
  height: 55px;
  margin-top: -10em;
  width: 100%;
}
/* Авторынок: авто, мото, вело, запчасти */
#pun-viewforum[data-forum-id="26"] .main::before {
  content: '';
  display: inline-block;
  background: url(https://i.ibb.co/HGpS3xD/1273.gif) no-repeat center;
  height: 55px;
  margin-top: -10em;
  width: 100%;
}
/* Спорт */
#pun-viewforum[data-forum-id="28"] .main::before {
  content: '';
  display: inline-block;
  background: url(https://i.ibb.co/LCDZVhG/1092.gif) no-repeat center;
  height: 47px;
  margin-top: -5em;
  width: 100%;
}
/* Юриспруденция */
#pun-viewforum[data-forum-id="31"] .main::before {
  content: '';
  display: inline-block;
  background: url(https://i.ibb.co/vm9Bm8k/1046.gif) no-repeat center;
  height: 55px;
  margin-top: -10em;
  width: 100%;
}
/* Царство растений */
#pun-viewforum[data-forum-id="37"] .main::before {
  content: '';
  display: inline-block;
  background: url(https://upforme.ru/uploads/001a/f0/7d/2/900811.png) no-repeat center;
  height: 40px;
  margin-top: -5em;
  width: 100%;
}
/* Домашние животные */
#pun-viewforum[data-forum-id="38"] .main::before {
  content: '';
  display: inline-block;
  background: url(https://i.ibb.co/0D75cmz/1038.gif) no-repeat center;
  height: 45px;
  margin-top: -2em;
  width: 100%;
}
/* Территория 1С */
#pun-viewforum[data-forum-id="39"] .main::before {
  content: '';
  display: inline-block;
  background: url(https://i.ibb.co/PCzQSwC/1040.gif) no-repeat center;
  height: 55px;
  margin-top: -10em;
  width: 100%;
}
/* Архив */
#pun-viewforum[data-forum-id="40"] .main::before {
  content: '';
  display: inline-block;
  background: url(https://i.ibb.co/cF1LR3K/6.gif) no-repeat center;
  height: 55px;
  margin-top: -10em;
  width: 100%;
}
/* Здоровье и медицина */
#pun-viewforum[data-forum-id="41"] .main::before {
  content: '';
  display: inline-block;
  background: url(https://i.ibb.co/2kg3t1L/1064.gif) no-repeat center;
  height: 55px;
  margin-top: -11em;
  width: 100%;
}
/* Подвал Образцового Содержания */
#pun-viewforum[data-forum-id="44"] .main::before {
  content: '';
  display: inline-block;
  background: url(https://i.ibb.co/Rpktb9q/1641.gif) no-repeat center;
  height: 55px;
  margin-top: -15em;
  width: 100%;
}
/* За Рулём */
#pun-viewforum[data-forum-id="45"] .main::before {
  content: '';
  display: inline-block;
  background: url(https://i.ibb.co/7Wr7X4m/2024-09-25-233241170.png) no-repeat center;
  height: 55px;
  margin-top: -10em;
  width: 100%;
}
/* Мир вокруг нас */
#pun-viewforum[data-forum-id="46"] .main::before {
  content: '';
  display: inline-block;
  background: url(https://upforme.ru/uploads/001a/f0/7d/2/791828.png) no-repeat center;
  height: 50px;
  margin-top: -5em;
  width: 100%;
}
/* Эзотерика */
#pun-viewforum[data-forum-id="47"] .main::before {
  content: '';
  display: inline-block;
  background: url(https://upforme.ru/uploads/001a/f0/7d/2/811126.png) no-repeat center;
  height: 60px;
  margin-top: -5em;
  width: 100%;
}
/* Книги жалоб и предложений */
#pun-viewforum[data-forum-id="49"] .main::before {
  content: '';
  display: inline-block;
  background: url(https://upforme.ru/uploads/001a/f0/7d/2/573623.png) no-repeat center;
  height: 55px;
  margin-top: -5em;
  width: 100%;
}
/* РЕКЛАМА */
#pun-viewforum[data-forum-id="50"] .main::before {
  content: '';
  display: inline-block;
  background: url(https://i.ibb.co/0jQbvMY/1061.gif) no-repeat center;
  height: 55px;
  margin-top: -10em;
  width: 100%;
}
/* WEB-DIALOG */
#pun-viewforum[data-forum-id="55"] .main::before {
  content: '';
  display: inline-block;
  background: url() no-repeat center;
  height: 55px;
  margin-top: -10em;
  width: 100%;
}
/* Виноградарство, виноделие и винокурение */
#pun-viewforum[data-forum-id="56"] .main::before {
  content: '';
  display: inline-block;
  background: url() no-repeat center;
  height: 55px;
  margin-top: -10em;
  width: 100%;
}
/* Ищу работу */
#pun-viewforum[data-forum-id="58"] .main::before {
  content: '';
  display: inline-block;
  background: url() no-repeat center;
  height: 55px;
  margin-top: -10em;
  width: 100%;
}
/* Предлагаю работу */
#pun-viewforum[data-forum-id="58"] .main::before {
  content: '';
  display: inline-block;
  background: url() no-repeat center;
  height: 55px;
  margin-top: -10em;
  width: 100%;
}
}
</style>
<!--Конец Картинки в шапке раздела -->
Кнопка записи голосового сообщения
Код:
<!-- Голосовые сообщения © Alex_63, 2024 -->
<link rel="stylesheet" type="text/css" href="//forumstatic.ru/f/ru/bestbb/voice.css" />
<script type="text/javascript" src="https://forumstatic.ru/f/ru/bestbb/voice.js"></script>
Расшифровка значений иконок в разделах
Код:
<!-- Расшифровка значений иконок в разделах -->
<script type="text/javascript">
if ((location.href[location.href.length-1] == '/') || (document.URL.indexOf("viewforum") != -1)) 
document.getElementById("pun-main").innerHTML += '<div class="container" style="padding: 0.5em; margin-top: 1em;"><table style="width: 20%; float: left; border-style: none; vertical-align: middle;"><tbody><tr><td style="border-style: none;" align="center"><div class="icon"><!-- --></div><b>Нет новых сообщений</b></td></tr></tbody></table><table style="width: 20%; float: left; border-style: none; vertical-align: middle;"><tbody><tr class="inew"><td style="border-style: none;" align="center"><div class="icon"><!-- --></div><b>Новые сообщения</b></td></tr></tbody></table><table style="width: 20%; float: left; border-style: none; vertical-align: middle;"><tbody><tr class="isticky"><td style="border-style: none;" align="center"><div class="icon"><!-- --></div><b>Прикреплённая тема</b></td></tr></tbody></table><table style="width: 20%; float: left; border-style: none; vertical-align: middle;"><tbody><tr class="iclosed"><td style="border-style: none;" align="center"><div class="icon"><!-- --></div><b>Закрытая тема</b></td></tr></tbody></table><table style="width: 20%; float: left; border-style: none; vertical-align: middle;"><tbody><tr class="iredirect"><td style="border-style: none;" align="center"><div class="icon"><!-- --></div><b>Тема перемещена</b></td></tr></tbody></table></div>';
</script>
<!-- Расшифровка значений иконок в разделах -->
Размытие текста вместо  зачёркивания
Код:
<style>
    /*Размытие на зачеркнутый текст*/
del {
    filter: blur(3px);
    text-decoration: none;
    transition:.33s;
}
del:hover {
    filter: initial;
    transition:.63s;
}
</style>
Счётчик тем, созданных юзером (в мини-профиле)
Код:
<!-- Счётчик тем, созданных юзером (в мини-профиле) (HTML верх) -->
    <noscript><link rel="stylesheet" type="text/css" href="https://forumstatic.ru/files/0013/66/53/39517.css" /></noscript>
    <script type="text/javascript" src="https://forumstatic.ru/files/0013/66/53/67954.js"></script>
<!-- Счётчик тем, созданных юзером (в мини-профиле) (HTML верх) -->
Подпись автора

Функционал форума Книга жалоб Книга предложений Знак зодиака Как вставить видео на форум Форум"Грибные места" Слайдер для картинок Live-box с темами

0

3

Администрирование - Формы - HTML низ

Падающие сн
Свернутый текст
Код:
<script><!--Добавка ссылки на тему к заголовку поста-->
if($(".punbb").attr("id")=="pun-viewtopic"){
  var s0=$("link[rel='alternate']").attr("href").replace(/^.*id=(\d+)$/igm,"$1");
  var s1="/viewtopic.php?id="+s0;var s2=$(".main h1 span").text();
  var s3='<li class="TopicLnk" style="font-weight:normal;display:inline-block;color:#7c7cc2;"> Тема: <a href="';
  s3+=s1+'">'+s2+'</a></li>';$(".post h3>span a.permalink").each(function(){
  if($(this).parents(".post").hasClass("topicpost")){$(this).after(s3.replace("Re: ",""));
  }else{$(this).after(s3);};});}
</script>
<!--Добавка ссылки на тему к заголовку поста-->
Снятие выделения с форума по клику
Код:
<!-- Снятие выделения с форума по клику © Alex_63 / В HTML низ -->
    <style>#pun-index .inew div.icon{cursor:pointer}</style>
        <script type="text/javascript" src="https://forumstatic.ru/files/0015/c4/3f/62764.js"></script>
        <!-- Снятие выделения с форума по клику © Alex_63 / В HTML низ -->
Загрузчик изображений в форме ответа

Это платный скрипт, требует оплаты и активации от админа площадки (Alex_63).
Тема на форуме техподдержки: https://forum.mybb.ru/viewtopic.php?id= … 12#p990724

Код:
<!-- Загрузчик изображений в форме ответа © 2018 Alex_63 -->
<script>FORUM.defaultHost = 'uploads'; // Хостинг по умолчанию: 'uploads' 'imgur' 'imageban'</script>
<link rel="stylesheet" type="text/css" href="https://forumstatic.ru/files/0015/c4/3f/18002.css" />
<script type="text/javascript" src="https://forumstatic.ru/files/0015/c4/3f/18001.js"></script>
<!-- Загрузчик изображений в форме ответа © 2018 Alex_63 -->
Первые N тем в описании форума
Код:
<!-- Пример работы: https://kuban.mybb.ru -->
<!-- Первые N тем в описании форума (новая версия) -->
<style>
.topicslist {
  position: absolute;
  background-color: #fff;
  border: 1px solid rgba(0, 0, 0, .35);
  margin-top: 5px;
  padding: 10px;
  box-shadow: 0 4px 4px -2px rgba(0, 0, 0, .35);
  border-radius: 3px;
  max-width: 90vw;
  z-index: 110;
}
.topicslist .sticky a {
  font-weight: bold;
  color: blue;  /* Цвет для выделенных тем */
}
.topicslist .closed a {
  color: #cb8787;  /* Цвет для закрытых тем */
}
.topicslist .load {
  animation: slow-load-blink 2s ease-in-out infinite;
}
 
.clickt {
  cursor: pointer;
  user-select: none;
}
.clickt img {
  border: 0;
  line-height: 1;
  max-height: 16px;
  max-width: 16px;
  vertical-align: middle;
}
@keyframes slow-load-blink{0%,100%{opacity:1}50%{opacity:.3}}
</style>
<script>
window.firstNtopics = {
    // Настройки скрипта
    count: 7,            // Максимальное количество выводимых тем форума
    touchDevice: 1,      // 1- включить принудительно вариант показа блока click для сенсорных устройств , 0 - выключить
    useSession: 1,       // 1- включить кэширование списка тем на 10 минут, 0 - выключить
    selectAct: 'click',  // Вариант показа блока: 'click' (нажатие по значку рядом с названием темы) или 'hover' (наведение курсора на название темы)
 
    // Шаблон для действия click
    templateClick: ' <span class="clickt" title="Показать список тем"><img src="https://upforme.ru/uploads/001a/f0/7d/2/12211.png" alt="Список тем"></span>',
};
</script>
<script type="module" src="https://forumstatic.ru/files/001c/3a/d4/90907.js"></script>
 
<!-- Конец Первые N тем в описании разделов форума -->
Ссылка на профиль по клику на аву
Код:
<!-- Ссылка на профиль по клику на аву -->
<script type="text/javascript">
$('.post .pa-avatar').each(function(){
  var hr = $(this).parents('.post').find('li>a[href*="/profile.php?id="]')[0].href;
  $(this).html('<a href="' + hr + '" target="_blank">' + $(this).html() + '</a>');
});
</script>
<!-- Ссылка на профиль по клику на аву -->
Окно для незарегистрированных, на главной странице
Код:
<!-- Окно для незарегистрированных, на главной странице -->
<div valign="bottom"><style type="text/css"> 
 span#okno{ 
 position: fixed; 
 bottom: 10px; 
 line-height: 16px; 
 text-align: left; 
 right: 50px; 
 z-index: 30000; 
 opacity: 0.9; 
 width: 250px; 
 height: 80px; 
 background: #00508a; 
 color: #fff; 
 a { color: pink; }
 a:hover { color: #ff4d00; }
 text-shadow: rgba(0,0,0,0.3) 0px -1px 0px; 
 padding: 10px; 
 text-decoration: none; 
 font-size: 11px; 
 font-family: Tahoma; 
 border: 1px solid #ffffff; 
 box-shadow: rgba(0,0,0,0.3) 0px 1px 4px, inset #ffffff 0px 1px 0px; 
 border-radius: 3px; 
 } 
 </style> 
<span id="okno"><strong>Здравствуйте, уважаемый Гость!</strong><br> 
Вы видите это сообщение, так как Вы не зарегистрировались.</br>
<a href="/login.php"><strong>Войдите</strong></a> или <a href="/register.php"><strong>Зарегистрируйтесь</strong></a>, чтобы иметь возможность отправлять сообщения.</span></div>
</div>
<script>
(function(){var stPageCurrent = '/register.php,/register.php?agree=%D1%EE%E3%EB%E0%F1%E5%ED,/login.php,/login.php?action=forget,/misc.php?action=rules'.split(',');
-1===stPageCurrent.indexOf(window.location.pathname+window.location.search)&&3===GroupID?$('#okno').show():$('#okno').hide()})()
</script>
<!-- Окно для незарегистрированных, на главной странице -->
Уменьшение количества кнопок в форме быстрого ответа при мобильном просмотре
Код:
<!-- Уменьшение количества кнопок в форме быстрого ответа при мобильном просмотре -->
<style type="text/css">
@media only screen and (hover: none) and (pointer: coarse){
td#button-font, td#button-size, td#button-indent,td#button-hide, td#button-quote, td#button-code, td#button-table, td#button-keyboard, td#button-voice {display: none;}
}
</style>
<!-- Уменьшение количества кнопок в форме быстрого ответа при мобильном просмотре -->
Выделить код и скопировать в буфер обмена
Код:
<!--выделить код. Alex_63 new.2019--> 
<script type="text/javascript" src="https://forumstatic.ru/files/0015/c4/3f/26102.js"></script>
<script>eval(select_text.toString().replace(/\}$/,'try{document.execCommand("copy")}catch(e){}}'))</script>
<script type="text/javascript">select_text.linkText = 'Выделить код и скопировать в буфер обмена' //текст ссылки</script>
Кнопка выравнивания текста по ширине (в форме быстрого ответа)
Код:
<!-- Кнопка выравнивания по ширине (в форме быстрого ответа) -->
<style type="text/css">
span[style*="justify"]{
  display:block;
  text-align:justify;
}
#button-justify {
  background:url(https://upforme.ru/uploads/001a/f0/7d/2/624009.png) center no-repeat!important;
}
</style>
<script type="text/javascript">
$(document).ready(function(){
$("#post #button-center").after('<td id=button-justify align=center valign=center title="Выравнивание по ширине"><img onclick="bbcode(\'[align=justify]\',\'[/align]\')" src="/i/blank.gif"/></td>');});
</script>
<!-- Кнопка выравнивания по ширине (в форме быстрого ответа) -->
Дополнительные смайлики в форме ответа
Код:
<!-- Дополнительные смайлики в форме ответа -->
<!--дополнительные смайлы v.3.1 © Romych-->
<style type="text/css">
#wrapper{position:relative;width:500px;}
.tabs{height:22px;line-height:21px;margin:0 0 3px;list-style:none;}
 .tabs li{float:left;cursor:pointer;}
.tabs li a{background:transparent url("https://forumstatic.ru/files/0017/d8/50/91984.png")no-repeat scroll 0 0/cover;color:#444;display:block;margin-bottom:-1px;padding:0 5px 1px;position:relative;text-align:center;text-decoration:none;width:70px;}
.tabs li a:hover{color:#efefef;background:url("https://forumstatic.ru/files/0017/d8/50/91984.png")no-repeat scroll 0-22.1px/cover;text-decoration:none;}
.tabs li.active a{color:#444;border:medium hidden;line-height:22px;background-position:0 -43.5px;}
.tabs li.active a:hover{color:#6A5ACD;}
#smilies-area div[class^="t-"]:not(.t-0){display:none;width:470px;
  overflow: inherit;  
}
#wrapper, #wrapper > div {
    max-width: 100%;
}
#smilies-block, #wrapper ul ~ div {
    clear: both;
}
</style>
<script type="text/javascript">
var nabor=[];
 

nabor['CRAZY'] = [
'https://kolobok.us/smiles/madhouse/alcoholic.gif',
'https://kolobok.us/smiles/madhouse/crazy_pilot.gif',
'https://kolobok.us/smiles/madhouse/dash1.gif',
'https://kolobok.us/smiles/madhouse/dash2.gif',
'https://kolobok.us/smiles/madhouse/dash3.gif',
'https://kolobok.us/smiles/madhouse/drag.gif',
'https://kolobok.us/smiles/madhouse/gamer1.gif',
'https://kolobok.us/smiles/madhouse/gamer2.gif',
'https://kolobok.us/smiles/madhouse/gamer3.gif',
'https://kolobok.us/smiles/madhouse/gamer4.gif',
'https://kolobok.us/smiles/madhouse/girl_crazy.gif',
'https://kolobok.us/smiles/madhouse/girl_hospital.gif',
'https://kolobok.us/smiles/madhouse/girl_wacko.gif',
'https://kolobok.us/smiles/madhouse/hang1.gif',
'https://kolobok.us/smiles/madhouse/hang2.gif',
'https://kolobok.us/smiles/madhouse/hang3.gif',
'https://kolobok.us/smiles/madhouse/hunter.gif',
'https://kolobok.us/smiles/madhouse/locomotive.gif',
'https://kolobok.us/smiles/madhouse/mail1.gif',
'https://kolobok.us/smiles/madhouse/man_in_love.gif',
'https://kolobok.us/smiles/madhouse/on_the_quiet2.gif',
'https://kolobok.us/smiles/madhouse/pilot.gif',
'https://kolobok.us/smiles/madhouse/prankster.gif',
'https://kolobok.us/smiles/madhouse/prankster2.gif',
'https://kolobok.us/smiles/madhouse/preved.gif',
'https://kolobok.us/smiles/madhouse/russian_roulette.gif',
'https://kolobok.us/smiles/madhouse/sarcastic.gif',
'https://kolobok.us/smiles/madhouse/sarcastic_blum.gif',
'https://kolobok.us/smiles/madhouse/sarcastic_hand.gif',
'https://kolobok.us/smiles/madhouse/slow.gif',
'https://kolobok.us/smiles/madhouse/stinker.gif',
'https://kolobok.us/smiles/madhouse/suicide2.gif',
'https://kolobok.us/smiles/madhouse/tease.gif',
'https://kolobok.us/smiles/madhouse/telephone.gif',
'https://kolobok.us/smiles/madhouse/to_become_senile.gif',
'https://kolobok.us/smiles/madhouse/to_pick_ones_nose.gif',
'https://kolobok.us/smiles/madhouse/to_pick_ones_nose2.gif',
'https://kolobok.us/smiles/madhouse/to_pick_ones_nose3.gif',
'https://kolobok.us/smiles/madhouse/to_pick_ones_nose_eat.gif',
'https://kolobok.us/smiles/madhouse/wacko.gif',
'https://kolobok.us/smiles/madhouse/wacko2.gif'];

nabor['RPG'] = [
'https://kolobok.us/smiles/rpg/assassin.gif',
'https://kolobok.us/smiles/rpg/butcher.gif',
'https://kolobok.us/smiles/rpg/dwarf.gif',
'https://kolobok.us/smiles/rpg/elf.gif',
'https://kolobok.us/smiles/rpg/girl_werewolf.gif',
'https://kolobok.us/smiles/rpg/jester.gif',
'https://kolobok.us/smiles/rpg/king.gif',
'https://kolobok.us/smiles/rpg/king2.gif',
'https://kolobok.us/smiles/rpg/orc.gif',
'https://kolobok.us/smiles/rpg/paladin.gif',
'https://kolobok.us/smiles/rpg/queen.gif',
'https://kolobok.us/smiles/rpg/vampire.gif',
'https://kolobok.us/smiles/rpg/wizard.gif'];


$('#button-smile').one('click',function(){$('#smilies-block').addClass('t-0');var vkl = '<div id="wrapper"><ul class="tabs" onclick="return changeVisibility (\'smilies-area\', false)"><li class="t-0 active"><a>Обычные</a></li></ul></div>';$('#smilies-area').prepend(vkl);for(var i in nabor){$('.tabs').append('<li class="t-'+i+'"><a>'+i+'</a></li>');$('#wrapper').append('<div class="t-'+i+'"></div>');$.each(nabor[i],function(q){$('div.t-'+i).append('<img loading="lazy" src="'+nabor[i][q]+'" onclick=smile("[img]'+nabor[i][q]+'[/img]") />');})};$('.tabs li').click(function(){var thisClass=this.className;$('#smilies-area div[class^="t-"]').hide();$('div.'+thisClass).fadeToggle('slow');$('.tabs li').removeClass('active');$(this).addClass('active');}); });
</script>
<!-- Дополнительные смайлики в форме ответа -->
Обновление тем в реальном времени ("живые темы")

Тема на форуме техподдержки площадки: https://forum.mybb.ru/viewtopic.php?id=41002

Код:
<!-- Обновление тем в реальном времени © Alex_63, 2025 -->
<script type="text/javascript" src="//forumstatic.ru/f/ru/bestbb/realtime.js"></script>
<!-- Обновление тем в реальном времени: индивидуальное отключение © Alex_63, 2025 -->
<script type="text/javascript" src="//forumstatic.ru/f/ru/bestbb/realtime.disable.js"></script>
Добавление чекбокса "Выбрать все сообщения на странице" для модераторов
Код:
<!-- Чекбокс "Выбрать все" при модерировании темы и форума © Alex_63 -->
<style>.modmenu #CheckAll{margin-left:0.7em!important}</style><script type="text/javascript">if($('#pun-modviewforum').length){$('th.tcmod').html('<input type="checkbox" id="CheckAll" title="Выбрать все">');$('#CheckAll').click(function(){if($('#CheckAll').attr('checked')){$(this).parents('table').find('td.tcmod input[type="checkbox"]').attr('checked',true);}else{$(this).parents('table').find('td.tcmod input[type="checkbox"]').attr('checked',false);}});}else if(GroupID<=2 && $('.punbb[id^="pun-multi"]').length){$('.modmenu .button').before('<span>Выбрать все</span><input type="checkbox" id="CheckAll" title="Выбрать все">');$('#CheckAll').click(function(){if($('#CheckAll').attr('checked')){$(this).parents('#pun-main').find('.pl-select input[type="checkbox"]').attr('checked',true);}else{$(this).parents('#pun-main').find('.pl-select input[type="checkbox"]').attr('checked',false);}});}</script>
<!-- //END// -Чекбокс "Выбрать все" при модерировании темы и форума -->
Своё описание к форуму на странице форума
Код:
<!-- Своё описание к форуму на странице форума © Alex_63 -->
<style>
#forum-anc .container {
  padding: 10px;
  font-size: 12px;
}
</style>
<script type="text/javascript">
var forum_descr = {
  //ID  //Описание(объявление)
  5 : '<mark><font color="green"><b> На форуме не приветствуется неуважительная к РФ или её политике тональность обсуждений.</b></font></mark>',
 //Последний элемент без запятой!
}
for(var fid in forum_descr) {
  var forum_anc = forum_descr[fid];
  var Url = document.URL;
  if(Url == 'http://'+location.hostname+'/viewforum.php?id='+fid || Url.indexOf('forum.php?id='+fid+'&p=')!=-1) {
    $('#pun-main').before('<div id="forum-anc" class="section"></div>');
    $('#forum-anc').prepend('<div class="container">'+forum_anc+'</div>');
  }
}
</script>
<!-- Своё описание к форуму на странице форума © Alex_63 -->
Картинка перед ником юзера (например, шляпка)
Код:
<!-- Картинка перед ником юзера (например, шляпка)  -->
<script type="text/javascript">
var online = document.links;
for (var i=0; i<online.length; i++) {
if (online[i].innerHTML == "Некто"){online[i].innerHTML = "<img src='https://forumstatic.ru/files/001b/2e/23/39513.png' width='30' height='21' />" + online[i].innerHTML}
else if (online[i].innerHTML == "Некто"){online[i].innerHTML = "<img src='https://forumstatic.ru/files/001b/2e/23/39513.png' width='30' height='21' />" + online[i].innerHTML}
}
</script>
<!-- Картинка перед ником юзера (например, шляпка)  -->
Список поблагодаривших под постом
Код:
<!-- Список поблагодаривших под постом  -->
<script>
(function() {
    // Дожидаемся полной загрузки страницы, включая все ресурсы
    window.addEventListener('load', function() {
        function vv(fn) {
            var lang_obj = {
                'Сказали спасибо': {
                    en: 'Thanked'
                }
            },
            lang = $('html')[0].lang;
 
            function _(text) {
                return (lang == 'ru' || !(lang_obj[text] && lang_obj[text][lang])) ? text : lang_obj[text][lang]
            };
 
            if ($('#pun-viewtopic').length) {
                var p_id = [];
 
                $('div.post').each(function(i) {
                    p_id[i] = $(this).attr('id').slice(1);
                });
 
                // Убедимся, что есть посты для обработки
                if (!p_id.length) return;
                
                function getJ(url, callback) {
                    $.get(url, function(d) {
                        $.isFunction(callback) && callback(d);
                    }, 'json');
                };
                
                // Функция обработки голосов с задержкой для гарантии загрузки FORUM.postVotes
                function processVotes(data) {
                    // Проверяем, что данные получены
                    if (!data || !data.response) return;
                    
                    // Убеждаемся, что объект FORUM существует
                    if (typeof FORUM === 'undefined' || !FORUM.postVotes) {
                        // Если объект не существует, повторяем попытку через 500мс
                        setTimeout(function() {
                            processVotes(data);
                        }, 500);
                        return;
                    }
                    
                    function votesInit(idp) {
                        // Убеждаемся, что post ID существует в FORUM.postVotes
                        var vot = FORUM.postVotes[idp];
                        if (!vot) return;
                        
                        var j = [], n = '';
                        
                        $.each(vot, function(z) {
                            var q = vot[z];
                            if (q.value == 1) {
                                j[z] = '<a href="/profile.php?id=' + q.user_id + '">' + q.username + '</a>';
                                n += j[z];
                                if (z < vot.length - 1) n += ', ';
                            }
                        });
                        
                        if (n) {
                            // Проверяем, что элемент для списка не существует, чтобы избежать дублирования
                            var postBox = $('.post#p' + idp + ' .post-box');
                            if (postBox.find('.postVoters').length === 0) {
                                n = '<div class="postVoters"><strong>' + _('<i><font color ="#13355e">Сказали спасибо</font></i>') + ':</strong> ' + n + '</div>';
                                postBox.append(n);
                            }
                        }
                    }
                    
                    // Обработка полученных данных
                    for (var i = 0; i < data.response.length; i++) {
                        var pid = data.response[i].post_id;
                    }
                    
                    // Обрабатываем каждый пост с голосами
                    for (var pid in FORUM.postVotes) {
                        votesInit(pid);
                    }
                    
                    $.isFunction(fn) && fn();
                }
                
                // Вызываем API для получения голосов
                getJ('/api.php?method=post.getVotesByPosts&post_id=' + p_id.join(',') + '&fields=post_id,user_id,username,value,datetime&sort_dir=desc', processVotes);
            }
        };
 
        vv(function() {});
        
        // Повторная проверка через 1.5 секунды для случаев AJAX-загрузки или медленной обработки данных
        setTimeout(function() {
            vv(function() {});
        }, 1500);
    });
})();
</script>
<!-- Список поблагодаривших под постом  -->
Вставка видео с помощью Sendvid
Код:
<!-- Вставка видео с помощью Sendvid   -->
<script>
(function() {
  // 🔁 Переключатель sandbox: включите/выключите при необходимости
  const SANDBOX_ENABLED = true;
 
  function embedSendvid(root = document) {
    // Ссылки вида https://sendvid.com/eke4ai5r
    const anchors = root.querySelectorAll('a[href*="sendvid.com"]');
    anchors.forEach(a => {
      if (a.dataset.svEmbedded) return;
      const href = a.getAttribute('href') || a.textContent || '';
      const m = href.match(/sendvid\.com\/(?:embed\/)?([a-zA-Z0-9]+)/i);
      if (!m) return;
      const id = m[1];
 
      const wrapper = document.createElement('div');
      wrapper.className = 'sv-embed';
      wrapper.innerHTML = createIframeHTML(id);
      a.replaceWith(wrapper);
      wrapper.dataset.svEmbedded = "1";
    });
  }
 
  // 🔧 Функция генерации iframe-кода с/без sandbox
  function createIframeHTML(id) {
    const sandboxAttr = SANDBOX_ENABLED
      ? 'sandbox="allow-same-origin allow-scripts allow-presentation"'
      : '';
    return `
      <iframe
        src="https://sendvid.com/embed/${id}"
        title="Sendvid video"
        allowfullscreen
        loading="lazy"
        referrerpolicy="no-referrer"
        ${sandboxAttr}
      ></iframe>
    `;
  }
 
  // 💅 Стили
  const css = `
    .sv-embed {
      position: relative;
      padding-bottom: 56.25%;
      height: 0;
      overflow: hidden;
      max-width: 100%;
      background: #000;
      border-radius: 8px;
    }
    .sv-embed iframe {
      position: absolute;
      top: 0;
      left: 0;
      width: 100%;
      height: 100%;
      border: 0;
    }
  `;
  const style = document.createElement('style');
  style.textContent = css;
  document.head.appendChild(style);
 
  // 🚀 Инициализация
  if (document.readyState !== 'loading') embedSendvid();
  else document.addEventListener('DOMContentLoaded', () => embedSendvid());
 
  // ♻️ Обработка динамической подгрузки
  const mo = new MutationObserver(muts => {
    for (const m of muts) {
      m.addedNodes.forEach(n => {
        if (n.nodeType === 1) embedSendvid(n);
      });
    }
  });
  mo.observe(document.body, { childList: true, subtree: true });
})();
</script>
<!-- Вставка видео с помощью Sendvid   -->
Счётчик тем, созданных юзером (в мини-профиле)  - кликабельность надписи
Код:
<!-- Счётчик тем, созданных юзером (в мини-профиле)  - кликабельность надписи (HTML низ) -->
<script>$('.post-author li[class^="pa-fld"]:contains("Создано тем")').each(function(){var uid=$(this).closest('.post').attr('data-user-id');$(this).find('.fld-name').html('<a href="/search.php?action=show_user_topics&user_id='+uid+'">Создано тем</a>:')})</script>
<!-- Счётчик тем, созданных юзером (в мини-профиле)  - кликабельность надписи (HTML низ) -->
Счётчик сообщений, созданных юзером (в мини-профиле)  - кликабельность надписи
Код:
<!-- Счётчик сообщений, созданных юзером (в мини-профиле)  - кликабельность надписи (HTML низ) -->
<script>$('.post-author .pa-posts').each(function(){var uid=$(this).closest('.post').attr('data-user-id');$(this).find('.fld-name').html('<a href="/search.php?action=show_user_posts&user_id='+uid+'">'+$(this).find('.fld-name').text().split(':')[0]+'</a>:')})</script>
<!-- Счётчик сообщений, созданных юзером (в мини-профиле)  - кликабельность надписи (HTML низ) -->
Универсальный скрипт замены © Merlin777
Код:
<!-- Начало: Универсальный скрипт замены © Merlin777 kuban.mybb.ru -->
<script>
document.addEventListener("DOMContentLoaded", function () {

  // =========================
  // 📦 CONFIG — Настройки
  // =========================
  const CONFIG = {
    observerDelay: 0, // ⏳ Задержка обновления элементов (0 = requestAnimationFrame для максимально плавного обновления)
    
    // ✅ Разрешить покраску ников на главной странице сайта (в статистике)
   enableIndexNickColoring: true,
  
    // 🔤 Автозамены текста в профиле, кнопках и мини-профиле
    replacements: {
      profileElements: [
        ['.pl-email.profile', 'Профиль', '👤Профиль'],   // Заменяем текст "Профиль" на с эмодзи
        ['.pl-email.email', 'E-mail', '📧Mail'],        // "E-mail" → "📧Mail"
        ['.pl-email.pm', 'ЛС', '✉️\u00A0ЛС'],          // "ЛС" → "✉️ ЛС"
        ['.pl-website.website', 'Вебсайт', '🌐']        // "Вебсайт" → "🌐"
      ],
      postButtons: [
        ['.pl-edit a', 'Редактировать', '✍️\u00A0Редактировать'], // Кнопка редактирования
        ['.pl-delete a', 'Удалить', '❌\u00A0Удалить'],           // Кнопка удаления
        ['.pl-quote a', 'Цитировать', '💬\u00A0Цитировать'],     // Кнопка цитирования
        ['.pl-reply a', 'Ответить', '↩️\u00A0Ответить'],        // Кнопка ответа
        ['.pa-posts', 'Сообщений', '📨 Сообщений'],             // Кол-во сообщений с эмодзи
  
      ],
      miniProfile: [
        ['.pa-ip', 'IP', '🖧 IP'],                      // IP пользователя
        ['.pa-sex', 'Пол', '⚧️ Пол'],                  // Пол с эмодзи
        ['.pa-fld3', 'Создано тем', '➕ Создано тем'], // Кол-во созданных тем
        ['.fld-name', 'Откуда', '🧭 Откуда'],         // Местоположение
        ['.pa-respect', 'Уважение', '⭐ Рейтинг']      // Рейтинг
      ]
    },

    // 🎨 Селекторы мини-профиля для перекраски
    miniProfileSelectors: ["li.pa-title","li.pa-fld1"],

    // 🎨 Цвета ников по группам (основной и ховер)
    groupColors: {
      1: ['#008080','#a1b2cc'], // 🛡️ Админ
      2: ['#993232','#d15f13'], // 🧑⚖️ Модератор
      3: ['#000000','#B0B0B0'], // 👤 Гость (черный с серым ховером)
      4: ['#072387','#5869a3']  // 🧙‍♂️ Пользователь (темно-синий с светло-синим ховером)
    },

    // 🎨 Цвета для мини-профиля по именам
    miniProfileColors: {
      "Модератор": { color: ['#38761d','#6abd46'], groups: [2] },       // Зеленый оттенок
      "Администратор": { color: ['#5c1eba','#a1b2cc'], groups: [1] },    // Фиолетовый оттенок
      "The Wizard of the Realm": { color: ['#2986cc','#a1b2cc'], groups: [1] } // Синий
    }
  };

  // =========================
  // 💬 CSS hover — плавное изменение цвета при наведении
  // =========================
  const style = document.createElement('style');
  style.innerHTML = 'a[data-base-color], span[data-base]{transition: color 0.25s ease; cursor:pointer;}';
  document.head.appendChild(style);

  // =========================
  // 🔄 Функция автозамены текста
  // =========================
  function ChangeAll(scope=document){
    // Объединяем все массивы автозамен
    [].concat(CONFIG.replacements.profileElements,
             CONFIG.replacements.postButtons,
             CONFIG.replacements.miniProfile).forEach(function(r){
      var sel = r[0], from = r[1], to = r[2];
      // Находим элементы, которые еще не заменены
      scope.querySelectorAll(sel+':not([data-replaced])').forEach(function(el){
        if(el.innerHTML.indexOf(from) !== -1) el.innerHTML = el.innerHTML.replaceAll(from,to);
        el.dataset.replaced = 'true'; // Помечаем элемент как обработанный
      });
    });
  }

  // =========================
  // 🎨 Покраска ников в постах
  // =========================
  function recolorPostNicks(users, scope = document) {
  const userMap = {};
  users.forEach(u => {
    if (u.username) userMap[u.username.trim().toLowerCase()] = parseInt(u.group_id);
  });

  // 🧱 Общая функция покраски по элементу
  function colorNick(el, username) {
    const group_id = userMap[username.toLowerCase()] || 4; // default group
    const colors = CONFIG.groupColors[group_id];
    if (!colors) return;

    el.style.color = colors[0];
    el.dataset.baseColor = colors[0];
    el.dataset.hoverColor = colors[1] || colors[0];
  }

  // 🎯 1. Ники в постах
  scope.querySelectorAll('.post a[href^="javascript:to("]').forEach(el => {
    if (el.closest('.quote-box, .dropdown, #pun-navlinks, .vote-list, .user-menu')) return;
    const username = el.textContent.trim();
    colorNick(el, username);
  });

  // 🏠 2. Ники на главной (например, в #onlinelist)
  if (CONFIG.enableIndexNickColoring && document.getElementById('onlinelist')) {
    document.querySelectorAll('#onlinelist a[href*="profile.php"]').forEach(el => {
      const username = el.textContent.trim();
      colorNick(el, username);
    });
  }
}


  // =========================
  // 🎨 Покраска мини-профиля
  // =========================
  function recolorMiniProfile(scope=document){
    CONFIG.miniProfileSelectors.forEach(function(sel){
      scope.querySelectorAll(sel).forEach(function(el){
        if(el.dataset.mpRecolored) return; // Уже перекрашен
        let html = el.innerHTML;
        Object.entries(CONFIG.miniProfileColors).forEach(function([name,obj]){
          const [base,hover] = obj.color;
          if(html.includes(name)){
            // Заменяем текст на span с цветами
            html = html.replace(name,
              '<span data-base="'+base+'" data-hover="'+hover+'" style="font-weight:bold;color:'+base+';">'+name+'</span>'
            );
          }
        });
        el.innerHTML = html;
        el.dataset.mpRecolored = 'true'; // Отмечаем как обработанный
      });
    });
  }

  // =========================
  // 🎨 Универсальная перекраска всего (посты + мини-профиль)
  // =========================
  function recolorAll(scope=document){
    recolorPostNicks(JSON.parse(localStorage.getItem('UsersAdmList')?.split('|')[1] || '[]'), scope);
    recolorMiniProfile(scope);
  }

  // =========================
  // 🌐 Получение пользователей через API
  // =========================
  function fetchUsersAndRecolor(force=false, scope=document){
    var key='UsersAdmList';
    var now=Math.floor(Date.now()/1000);
    var cached=localStorage.getItem(key);

    if(cached && !force){
      try{
        var arr=cached.split('|');
        if((now-parseInt(arr[0]))<24*3600){ // ⏱ кеш на 24 часа
          recolorAll(scope);
          return;
        }
      }catch(e){console.warn(e);}
    }

    // Запрос через API
    fetch('/api.php',{
      method:'POST',
      headers:{'Content-Type':'application/x-www-form-urlencoded'},
      body:new URLSearchParams({method:'users.get',limit:'500',fields:'user_id,username,group_id'})
    }).then(r=>r.json()).then(function(data){
      if(data?.response?.users){
        var users=data.response.users;
        localStorage.setItem(key,now+'|'+JSON.stringify(users)); // Сохраняем кеш
        recolorAll(scope);
      }
    }).catch(console.error);
  }

  // =========================
  // 👆 Hover — меняем цвет при наведении
  // =========================
  document.body.addEventListener('mouseover',function(e){
    var el = e.target.closest('span[data-base], a[data-base-color]');
    if(el) el.style.color = el.dataset.hoverColor || el.dataset.hover || el.style.color;
  });
  document.body.addEventListener('mouseout',function(e){
    var el = e.target.closest('span[data-base], a[data-base-color]');
    if(el) el.style.color = el.dataset.baseColor || el.dataset.base || el.style.color;
  });

  // =========================
  // ⏳ Планирование обновления через requestAnimationFrame или setTimeout
  // =========================
  let scheduled = false;
  function scheduleUpdate(){
    if(scheduled) return;
    scheduled = true;
    if(CONFIG.observerDelay === 0){
      requestAnimationFrame(()=>{ ChangeAll(); recolorAll(); scheduled=false; });
    } else {
      setTimeout(()=>{ ChangeAll(); recolorAll(); scheduled=false; }, CONFIG.observerDelay);
    }
  }

  // =========================
  // 👁 MutationObserver — следим за изменениями DOM и автоматически перекрашиваем новые элементы
  // =========================
  const observer = new MutationObserver(()=>scheduleUpdate());
  observer.observe(document.body,{childList:true,subtree:true});

  // =========================
  // ▶ Инициализация при загрузке страницы
  // =========================
  ChangeAll();
  fetchUsersAndRecolor();

  // =========================
  // 🆕 Live-подгрузка новых постов
  // =========================
  document.addEventListener('pun_post',function(e){
    var scope = e.detail?.post || document.body;
    ChangeAll(scope);
    fetchUsersAndRecolor(true, scope); // форсируем обновление при новых постах
  });

});
</script>
<!-- Конец: Универсальный скрипт замены © Merlin777 kuban.mybb.ru -->

📄 Краткое текстовое описание работы скрипта по пунктам

1. Загрузка и конфигурация:

  • Скрипт выполняется после полной загрузки страницы (DOMContentLoaded).

  • В объекте CONFIG настраиваются:

  • текстовые автозамены (смайлики и подписи),

  • цвета групп (для ников),

  • цвета мини-профиля,

  • включение/отключение покраски на главной странице (enableIndexNickColoring),

  • задержка обновлений (через observerDelay),

  • список селекторов, в которых производится автозамена текста.

2. Замена текста (ChangeAll):

Заменяет стандартные подписи (например, "Профиль" → "👤Профиль") в:

  • мини-профилях,

  • кнопках постов,

  • элементах шапки/меню (если указано в селекторах).

Каждый элемент помечается data-changed="true", чтобы не заменять повторно.

3. Перекраска ников (recolorUsers и recolorPostNicks):

Загружает список пользователей с группами из:

  • localStorage (если кэш свежий),

  • либо через запрос к API форума.

  • Красит только ники в постах:

.post a[href^="javascript:to("] — ссылки на ники внутри тем.

  • Исключает ненужные области (шапка, цитаты, меню, dropdown'ы и т.п.).

  • Если включено enableIndexNickColoring, то красит ники в блоке #onlinelist на главной странице.

  • Поддерживает hover-эффект (цвет меняется при наведении).

4. Перекраска мини-профиля (recolorMiniProfile):

  • Красит элементы мини-профиля:

li.pa-title, li.pa-fld1, li.pa-fld2, и т.д.

Цвет задаётся в CONFIG.groupProfileColors по group_id.

  • Также поддерживает hover-эффект.

5. Объединённая функция перекраски (recolorAll):

  • Вызывает recolorPostNicks и recolorMiniProfile вместе.

  • Упрощает вызов в MutationObserver и при подгрузке новых сообщений.

6. Hover через делегирование:

  • На body навешиваются события mouseover и mouseout.

  • Отслеживаются все элементы с data-base или data-base-color.

  • При наведении цвет меняется на hover-цвет, при уходе — возвращается.

7. Обновление при динамических изменениях (MutationObserver):

  • Следит за изменениями в document.body.

  • Вызывает scheduleUpdate, который:

  • запускает обновление через requestAnimationFrame (если observerDelay: 0),

  • или через setTimeout (если указана задержка).

  • Позволяет скрипту корректно обрабатывать любые подгрузки и изменения DOM.

8. AJAX события (pun_post):

При событии pun_post (используется live-подгрузка на форуме):

  • вызывается scheduleUpdate() — обновляет DOM,

  • и fetchAndColor(true) — принудительно обновляет список пользователей и перекраску.

Это гарантирует, что все новые сообщения получают раскраску, как старые.

9. Кэширование пользователей (fetchAndColor):

  • Пользователи с username и group_id сохраняются в localStorage.

  • Кэш действует 24 часа (86400 секунд).

  • Это минимизирует запросы и ускоряет загрузку скрипта.

Подпись автора

Функционал форума Книга жалоб Книга предложений Знак зодиака Как вставить видео на форум Форум"Грибные места" Слайдер для картинок Live-box с темами

0

4

Администрирование - Формы - Правила

Подпись автора

Функционал форума Книга жалоб Книга предложений Знак зодиака Как вставить видео на форум Форум"Грибные места" Слайдер для картинок Live-box с темами

0

5

Администрирование - Формы - Объявление

Объявление
Код:
<b>
    <font color="brown">
Будь как дома, путник (с)КиШ
</font>
</b>
Подпись автора

Функционал форума Книга жалоб Книга предложений Знак зодиака Как вставить видео на форум Форум"Грибные места" Слайдер для картинок Live-box с темами

0

6

Администрирование - Формы - HTML в форме ответа

WYSI - визуальный редактор сообщений
Код:
<!-- WYSI - визуальный редактор сообщений © Alex_63, 2024 -->
<link rel="stylesheet" type="text/css" href="https://forumstatic.ru/f/ru/bestbb/wysi.css" />
<script type="text/javascript" src="https://forumstatic.ru/f/ru/bestbb/wysi.js"></script>
<script type="text/javascript" src="https://forumstatic.ru/f/su/1bb/bbquote.custom_quotes.js?v=1"></script>
<!-- WYSI - визуальный редактор сообщений © Alex_63, 2024 -->

Примечание: визуальный редактор необходимо активировать письмом к Alex_63.

Форма ответа: Обработка кастомных тегов в визуальном редакторе
Код:
<!-- Форма ответа: Обработка кастомных тегов в визуальном редакторе -->
<script>
WYSI.extend({
    'indent': ['.custom_tag_indent', '[indent]', '']
});
</script>
<!-- Форма ответа: Обработка кастомных тегов в визуальном редакторе -->
Ударные гласные
Код:
<!--//Начало//Ударные гласные-->
<style>
@media screen and (min-width: 540px) {
    body
details{
    float: right;
  display:block;
  background: #afc2d4;
  width:300px;
  box-shadow: 0 10px 15px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
  border-radius: 8px;
  overflow:hidden;
  margin-bottom: 1.5rem;
}
summary::-webkit-details-marker{display:none;}
summary::-moz-list-bullet{list-style-type:none;}
summary::marker{display:none;} 
summary {
   display:block;
   padding: .3em 1em .3em .9em;
   border-bottom: 1px solid #e2e8f0;
   font-size:1.1em;
   cursor: pointer;
   position: relative;
}
summary:before {  
  top: .4em;
  right: .3em;
  color: transparent;
  background: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBkPSJNMTYuNTkgOC41OUwxMiAxMy4xNyA3LjQxIDguNTkgNiAxMGw2IDYgNi02eiIvPjxwYXRoIGQ9Ik0wIDBoMjR2MjRIMHoiIGZpbGw9Im5vbmUiLz48L3N2Zz4=") no-repeat 50% 50% / 1em 1em;
  width: 1em;
  height: 1em;  
  content: "";
  position: absolute;
  transition: transform .5s;
}
details[open] > summary:before {
  transform: scale(1,-1);
}
summary ~ * {
   padding: 0 1em 10px 1.4em;
}
details[open] summary ~ *{ 
  animation: sweep .5s ease-in-out;
}
@keyframes sweep {
  0%    {opacity: 0;}
  100%  {opacity: 1;}
}
summary:focus {
  outline:0;
  box-shadow: inset 0 0 1px rgba(0,0,0,0.3), inset 0 0 2px rgba(0,0,0,0.3);
}
}
</style>


<details>
    <summary>Вставить ударные гласные</summary>
<center>
<input type="button" value="А́" name="H" title="А́" onclick="bbcode('А́','')" />
<input type="button" value="а́" name="H" title="а́" onclick="bbcode('а́','')" />
<input type="button" value="Е́" name="H" title="Е́" onclick="bbcode('Е́','')" />
<input type="button" value="е́" name="H" title="е́" onclick="bbcode('е́','')" />
<input type="button" value="И́" name="H" title="И́" onclick="bbcode('И́','')" />
<input type="button" value="и́" name="H" title="и́" onclick="bbcode('и́','')" />
<input type="button" value="О́" name="H" title="О́" onclick="bbcode('О́','')" />
<input type="button" value="о́" name="H" title="о́" onclick="bbcode('о́','')" />
<input type="button" value="У́" name="H" title="У́" onclick="bbcode('У́','')" />
<input type="button" value="у́" name="H" title="у́" onclick="bbcode('у́','')" />
<input type="button" value="Ы́" name="H" title="Ы́" onclick="bbcode('Ы́','')" />
<input type="button" value="ы́" name="H" title="ы́" onclick="bbcode('ы́','')" />
<input type="button" value="Э́" name="H" title="Э́" onclick="bbcode('Э́','')" />
<input type="button" value="э́" name="H" title="э́" onclick="bbcode('э́','')" />
<input type="button" value="Ю́" name="H" title="Ю́" onclick="bbcode('Ю́','')" />
<input type="button" value="ю́" name="H" title="ю́" onclick="bbcode('ю́','')" />
<input type="button" value="Я́" name="H" title="Я́" onclick="bbcode('Я́','')" />
<input type="button" value="я́" name="H" title="я́" onclick="bbcode('я́','')" />
</center>
</details>
<!--//Конец//Ударные гласные-->
Подпись автора

Функционал форума Книга жалоб Книга предложений Знак зодиака Как вставить видео на форум Форум"Грибные места" Слайдер для картинок Live-box с темами

0

7

Администрирование - Формы - Пользовательские bb-теги

Пользовательские bb-теги
Код:
indent:sito
voice[figure.postvoice]:mto

Пояснение: первая строчка - добавляет новый bb-код, позволяющий скрывать мини-профиль, а вторая - добавляет кнопку с микрофоном.
Обе строчки работают с соответствующими скриптами.

Подпись автора

Функционал форума Книга жалоб Книга предложений Знак зодиака Как вставить видео на форум Форум"Грибные места" Слайдер для картинок Live-box с темами

0

8

2-я часть:

Администрирование - Формы - HTML низ

Цветные названия тем - вставить строки (только для форума kuban.mybb.ru)
Код:
<!-- Цветные названия тем -->
<script src="https://forumstatic.ru/files/001a/f0/7d/22606.js?v=148"></script>
<!-- Цветные названия тем -->
Полный текст js скрипта (в отдельном файле)

(function() {
  // 🛠️ === НАСТРОЙКИ СКРИПТА ===
  const ALLOWED_FORUM_IDS = [];        // 📌 Разрешённые разделы ["1","2"]; (пусто = везде)
  const BLOCKED_FORUM_IDS = ["5"];     // 🚫 Заблокированные разделы (приоритет над разрешёнными)
  const ENABLE_TOPIC_LINKS = true;     // 🔗 Включить автоматическую вставку ссылки "Тема: ..." в посты?

  // 📱 Определяем, мобильное ли устройство (ширина экрана ≤ 768px)
  const IS_MOBILE = window.innerWidth <= 768;

  // 🔍 Вспомогательная функция: извлекает ID раздела (fid) или темы (id) из URL
  function getForumOrTopicId() {
    const url = window.location.href;
    let fidMatch = url.match(/[?&]fid=(\d+)/i);   // ID раздела
    let vidMatch = url.match(/[?&]id=(\d+)/i);    // ID темы
    return fidMatch ? fidMatch[1] : (vidMatch ? vidMatch[1] : null);
  }

  // ✅ Проверяет, разрешён ли текущий раздел/тема для работы скрипта
  function isForumAllowed() {
    const currentId = getForumOrTopicId();

    // ❌ Если ID есть в чёрном списке — запрещаем работу скрипта
    if (BLOCKED_FORUM_IDS.length && currentId && BLOCKED_FORUM_IDS.includes(currentId)) {
      return false;
    }

    // ✅ Если белый список пуст — разрешаем везде
    if (!ALLOWED_FORUM_IDS.length) return true;

    // ✅ Иначе — разрешаем только если ID есть в белом списке
    return currentId && ALLOWED_FORUM_IDS.includes(currentId);
  }

  const forumAllowed = isForumAllowed();

  // 🧹 === ОЧИСТКА ЗАГОЛОВКА ВКЛАДКИ И Open Graph ОТ ЦВЕТОВЫХ КОДОВ ===
  (function() {
    // Применяем только на странице просмотра темы
    if (!document.querySelector('.punbb#pun-viewtopic')) return;

    let rawSubject = null;
    // Пытаемся получить заголовок из глобальной переменной FORUM (если доступна)
    if (typeof FORUM !== 'undefined' && FORUM.topic && FORUM.topic.subject) {
      rawSubject = FORUM.topic.subject;
    } else {
      // Иначе — из DOM
      const h1 = document.querySelector('.main h1 span');
      rawSubject = h1 ? h1.textContent : null;
    }

    // Если в заголовке есть цветовые коды (;;), очищаем их

      const cleanTitle = rawSubject.split(';;').slice(2).join(';;');
      // Сохраняем суффикс (например, " — Название форума")
      const suffix = document.title.includes(' — ')
        ? ' — ' + document.title.split(' — ').slice(1).join(' — ')
        : '';
      document.title = cleanTitle + suffix;
      // Также обновляем Open Graph метатег для соцсетей
      const ogTitle = document.querySelector('meta[property="og:title"]');
      if (ogTitle) ogTitle.setAttribute('content', cleanTitle);
    }
  })();

  // 🎨 === ЗАГРУЗКА БИБЛИОТЕКИ Vanilla Picker (выбор цвета) ===
  function loadVanillaPicker() {
    return new Promise((resolve, reject) => {
      // Если библиотека уже загружена — используем её
      if (typeof Picker !== 'undefined') {
        resolve(Picker);
        return;
      }
      // Иначе — загружаем скрипт с CDN
      const script = document.createElement('script');
      script.src = 'https://forumstatic.ru/files/001a/f0/7d/21376.js';
      script.onload = () => resolve(window.Picker);
      script.onerror = () => reject(new Error('Failed to load Vanilla Picker'));
      document.head.appendChild(script);
    });
  }

  // 🎨 === ИНИЦИАЛИЗАЦИЯ ПАНЕЛИ ВЫБОРА ЦВЕТА (только на десктопе!) ===
  async function initColorPicker() {
    // 📱 На мобильных устройствах — ничего не создаём
    if (IS_MOBILE) return;
    // 🔒 Проверяем, разрешён ли текущий раздел
    if (!forumAllowed) return;

    // Находим оригинальное поле ввода темы
    const subjectInput = document.querySelector('input[name="req_subject"]');
    // Если поле не найдено или интерфейс уже создан — выходим
    if (!subjectInput || document.getElementById("color-topic-interface")) return;

    // Прячем оригинальное поле, но оставляем его в DOM для отправки формы
    subjectInput.style.visibility = "hidden";
    subjectInput.style.position = "absolute";
    const container = subjectInput.parentNode;

    // Убеждаемся, что контейнер позиционирован
    if (window.getComputedStyle(container).position === 'static') {
      container.style.position = 'relative';
    }

    // 🔸 === СОЗДАНИЕ ИНТЕРФЕЙСА ВВОДА ТЕМЫ С ЦВЕТАМИ ===
    // ⚠️ Обрати внимание: у поля ввода НЕТ атрибута maxlength — он управляется динамически!
    const interfaceHTML = `
      <div id="color-topic-interface" style="display:flex;flex-direction:column;gap:8px;margin-top:6px;width:100%;font-family:inherit;">
        <!-- Поле ввода названия темы + счётчик символов -->
        <div style="position: relative; width: 100%;">
          <input type="text" id="topic-title-input" placeholder="Название темы"
            style="width:100%;padding:7px 50px 7px 10px;border:1px solid #ccc;border-radius:6px;font-size:14px;transition:color .2s ease;box-sizing:border-box;" />
          <div id="char-counter" style="position:absolute;right:10px;top:50%;transform:translateY(-50%);font-size:12px;color:#888;pointer-events:none;">0/48</div>
        </div>
        <!-- Строка с элементами управления цветом и переключателем -->
        <div id="color-controls-row" style="display:flex;align-items:center;gap:10px;flex-wrap:wrap;">
          <!-- Контейнер для всех цветовых элементов (палитра, кнопки) -->
          <div id="color-elements" style="display:flex;align-items:center;gap:10px;flex-wrap:wrap;">
            <!-- Палитра предустановленных цветов -->
            <div id="color-palette" style="display:flex;gap:6px;flex-wrap:wrap;">
              ${['#e74c3c','#e67e22','#f1c40f','#2ecc71','#3498db','#9b59b6','#16a085','#d35400','#c0392b'].map(c =>
                `<button type="button" class="palette-color" data-color="${c}" style="width:26px;height:26px;border:1px solid #aaa;border-radius:4px;background:${c};cursor:pointer;"></button>`).join('')}
            </div>
            <!-- Кнопки выбора цвета текста и фона -->
            <div style="display:flex;align-items:center;gap:6px;">
              <button type="button" id="open-color-picker-btn" title="Выбрать цвет названия" style="width:34px;height:26px;border:1px solid #aaa;border-radius:6px;background:#f6f6f6;cursor:pointer;">🎨</button>
              <div id="current-color-display" style="width:30px;height:26px;border:1px solid #999;border-radius:4px;background:transparent;"></div>
              <button type="button" id="open-bg-picker-btn" title="Выбрать цвет фона" style="width:34px;height:26px;border:1px solid #aaa;border-radius:6px;background:#f6f6f6;cursor:pointer;">🖌</button>
              <div id="current-bg-display" style="width:30px;height:26px;border:1px solid #999;border-radius:4px;background:transparent;"></div>
            </div>
          </div>
          <!-- Переключатель режима (всегда виден, вне цветных элементов) -->
          <div style="display:flex;align-items:center;gap:6px;margin-left:auto;font-size:13px;color:#555;user-select:none;">
            <span>Цвет</span>
            <label style="display:inline-block;width:40px;height:20px;position:relative;background:#ccc;border-radius:10px;cursor:pointer;">
              <input type="checkbox" id="color-mode-toggle" checked style="opacity:0;position:absolute;">
              <span id="toggle-thumb" style="position:absolute;top:2px;left:2px;width:16px;height:16px;background:#fff;border-radius:50%;transition:transform 0.2s;"></span>
            </label>
          </div>
        </div>
        <!-- Скрытые поля для передачи цветов в форму -->
        <input type="hidden" id="selected-color-value" name="topic_color" value="">
        <input type="hidden" id="selected-bg-value" name="topic_bg_color" value="">
      </div>
    `;
    container.insertAdjacentHTML("beforeend", interfaceHTML);

    // 🔍 Получаем все элементы интерфейса
    const titleInput = document.getElementById("topic-title-input");
    const colorValueInput = document.getElementById("selected-color-value");
    const bgValueInput = document.getElementById("selected-bg-value");
    const paletteButtons = document.querySelectorAll(".palette-color");
    const openPickerBtn = document.getElementById("open-color-picker-btn");
    const openBgBtn = document.getElementById("open-bg-picker-btn");
    const currentColorDisplay = document.getElementById("current-color-display");
    const currentBgDisplay = document.getElementById("current-bg-display");
    const charCounter = document.getElementById("char-counter");
    const toggleSwitch = document.getElementById('color-mode-toggle');
    const toggleThumb = document.getElementById('toggle-thumb');
    const colorElements = document.getElementById('color-elements');

    // 🔄 Флаги для отслеживания состояния пикеров
    let isTextPickerOpen = false;
    let isBgPickerOpen = false;

текст")
    function stripColorCode(text) {
      if (!text.includes(';;')) return text;
      return text.split(';;').slice(2).join(';;');
    }

    // 📤 Синхронизирует значение с оригинальным полем формы
    function updateHiddenSubject() {
      const title = titleInput.value.trim();
      const color = colorValueInput.value.trim();
      const bg = bgValueInput.value.trim();
     
      if (toggleSwitch.checked) {
        // В цветном режиме: максимум 48 символов
        const finalTitle = title.length > 48 ? title.slice(0, 48) : title;
${finalTitle}` : "";
        // Применяем цвета к полю ввода
        titleInput.style.color = color || '';
        titleInput.style.backgroundColor = bg || '';
      } else {
        // В простом режиме: только текст
        subjectInput.value = title;
        titleInput.style.color = '';
        titleInput.style.backgroundColor = '';
      }
    }

    // 🔢 Обновляет счётчик символов и визуальную индикацию лимита
    function updateCharCounter() {
      const len = titleInput.value.length;
      // Лимит зависит от режима: 48 (цвет) или 70 (обычный)
      const max = toggleSwitch.checked ? 48 : 70;
      charCounter.textContent = `${len}/${max}`;
      // Меняем цвет счётчика и рамки в зависимости от длины
      if (len > max) {
        charCounter.style.color = "#e74c3c"; // 🔴 Превышен лимит
        titleInput.style.borderColor = "#e74c3c";
      } else if (len > (max - 8)) {
        charCounter.style.color = "#d35400"; // 🟠 Близко к лимиту
        titleInput.style.borderColor = "#d35400";
      } else {
        charCounter.style.color = "#888";    // ⚪ Норма
        titleInput.style.borderColor = "#ccc";
      }
    }

    // 🔄 Инициализация значения из оригинального поля
    titleInput.value = stripColorCode(subjectInput.value);
    // Устанавливаем начальный лимит в зависимости от состояния переключателя
    titleInput.maxLength = toggleSwitch.checked ? 48 : 70;

    // 📝 Обработчик ввода текста
    titleInput.addEventListener("input", () => {
      // Жёсткая обрезка при вводе в цветном режиме (на случай вставки)
      if (toggleSwitch.checked && titleInput.value.length > 48) {
        titleInput.value = titleInput.value.slice(0, 48);
      }
      updateHiddenSubject();
      updateCharCounter();
    });

    // 🖥️ Инициализация счётчика
    updateCharCounter();

    // 🎨 Обработка кликов по палитре цветов
    paletteButtons.forEach(btn => {
      btn.addEventListener("click", function() {
        // Снимаем выделение со всех кнопок
        paletteButtons.forEach(b => (b.style.border = "1px solid #aaa"));
        // Выделяем текущую
        this.style.border = "2px solid #000";
        const color = this.dataset.color;
        colorValueInput.value = color;
        currentColorDisplay.style.backgroundColor = color;
        titleInput.style.color = color;
        updateHiddenSubject();
      });
    });

    // 🎨 Загружаем библиотеку выбора цвета
    const Picker = await loadVanillaPicker();

    // === ЦВЕТ ТЕКСТА (расширенный пикер) ===
    const textPickerContainer = document.createElement('div');
    textPickerContainer.id = 'text-picker-container';
    textPickerContainer.style.position = 'absolute';
    textPickerContainer.style.top = 'calc(100% + 4px)';
    textPickerContainer.style.left = '0';
    textPickerContainer.style.zIndex = '1000';
    textPickerContainer.style.display = 'none';
    textPickerContainer.style.background = '#fff';
    textPickerContainer.style.border = '1px solid #ccc';
    textPickerContainer.style.borderRadius = '6px';
    textPickerContainer.style.boxShadow = '0 2px 8px rgba(0,0,0,0.15)';
    openPickerBtn.parentNode.appendChild(textPickerContainer);

    const textPicker = new Picker({
      parent: textPickerContainer,
      popup: false,
      color: colorValueInput.value || '#000000',
      editorFormat: 'hex',
      components: {
        interaction: {
          ok: true,
          cancel: true,
          input: true
        }
      },
      onChange: (color) => {
        titleInput.style.color = color.rgbaString;
        currentColorDisplay.style.backgroundColor = color.rgbaString;
      },
      onDone: (color) => {
        paletteButtons.forEach(b => b.style.border = "1px solid #aaa");
        colorValueInput.value = color.hex;
        titleInput.style.color = color.rgbaString;
        currentColorDisplay.style.backgroundColor = color.rgbaString;
        updateHiddenSubject();
        textPickerContainer.style.display = 'none';
        isTextPickerOpen = false;
      },
      onCancel: () => {
        titleInput.style.color = colorValueInput.value || '';
        currentColorDisplay.style.backgroundColor = colorValueInput.value || '';
        textPickerContainer.style.display = 'none';
        isTextPickerOpen = false;
      }
    });

    openPickerBtn.addEventListener('click', (e) => {
      e.stopPropagation();
      if (isTextPickerOpen) {
        textPickerContainer.style.display = 'none';
        isTextPickerOpen = false;
      } else {
        if (isBgPickerOpen) {
          bgPickerContainer.style.display = 'none';
          isBgPickerOpen = false;
        }
        textPickerContainer.style.display = 'block';
        isTextPickerOpen = true;
      }
    });

    // === ЦВЕТ ФОНА (расширенный пикер) ===
    const bgPickerContainer = document.createElement('div');
    bgPickerContainer.id = 'bg-picker-container';
    bgPickerContainer.style.position = 'absolute';
    bgPickerContainer.style.top = 'calc(100% + 4px)';
    bgPickerContainer.style.left = '0';
    bgPickerContainer.style.zIndex = '1000';
    bgPickerContainer.style.display = 'none';
    bgPickerContainer.style.background = '#fff';
    bgPickerContainer.style.border = '1px solid #ccc';
    bgPickerContainer.style.borderRadius = '6px';
    bgPickerContainer.style.boxShadow = '0 2px 8px rgba(0,0,0,0.15)';
    openBgBtn.parentNode.appendChild(bgPickerContainer);

    const bgPicker = new Picker({
      parent: bgPickerContainer,
      popup: false,
      color: bgValueInput.value || '#ffffff',
      editorFormat: 'hex',
      components: {
        interaction: {
          ok: true,
          cancel: true,
          input: true
        }
      },
      onChange: (color) => {
        titleInput.style.backgroundColor = color.hex;
        currentBgDisplay.style.backgroundColor = color.rgbaString;
      },
      onDone: (color) => {
        bgValueInput.value = color.hex;
        titleInput.style.backgroundColor = color.hex;
        currentBgDisplay.style.backgroundColor = color.rgbaString;
        updateHiddenSubject();
        bgPickerContainer.style.display = 'none';
        isBgPickerOpen = false;
      },
      onCancel: () => {
        titleInput.style.backgroundColor = bgValueInput.value || '';
        currentBgDisplay.style.backgroundColor = bgValueInput.value || '';
        bgPickerContainer.style.display = 'none';
        isBgPickerOpen = false;
      }
    });

    openBgBtn.addEventListener('click', (e) => {
      e.stopPropagation();
      if (isBgPickerOpen) {
        bgPickerContainer.style.display = 'none';
        isBgPickerOpen = false;
      } else {
        if (isTextPickerOpen) {
          textPickerContainer.style.display = 'none';
          isTextPickerOpen = false;
        }
        bgPickerContainer.style.display = 'block';
        isBgPickerOpen = true;
      }
    });

    // 🔄 Восстановление цветов из оригинального поля (если они есть)

      const [color, bg, ...rest] = subjectInput.value.split(';;');
      const title = rest.join(';;');
      colorValueInput.value = color;
      bgValueInput.value = bg;
      titleInput.value = title;
      titleInput.style.color = color;
      titleInput.style.backgroundColor = bg;
      currentColorDisplay.style.backgroundColor = color;
      currentBgDisplay.style.backgroundColor = bg;
      // Выделяем соответствующую кнопку в палитре
      const match = [...paletteButtons].find(b => b.dataset.color === color);
      if (match) match.style.border = "2px solid #000";
    }

    // 🔘 === УПРАВЛЕНИЕ ПЕРЕКЛЮЧАТЕЛЕМ ===
    function updateToggleStyle() {
      const isEnabled = toggleSwitch.checked;
      if (isEnabled) {
        // Включено: ползунок справа, синий фон
        toggleThumb.style.transform = 'translateX(20px)';
        toggleThumb.parentNode.style.background = '#3498db';
        colorElements.style.display = 'flex'; // Показываем панель цветов
      } else {
        // Выключено: ползунок слева, серый фон
        toggleThumb.style.transform = 'translateX(0)';
        toggleThumb.parentNode.style.background = '#ccc';
        colorElements.style.display = 'none'; // Скрываем панель цветов
      }
    }

    // 🖱️ Обработчик переключения режима
    toggleSwitch.addEventListener('change', () => {
      const nowEnabled = toggleSwitch.checked;

      updateToggleStyle();
     
      if (!nowEnabled) {
        // Выключаем цвета: сбрасываем всё
        colorValueInput.value = '';
        bgValueInput.value = '';
        currentColorDisplay.style.backgroundColor = 'transparent';
        currentBgDisplay.style.backgroundColor = 'transparent';
        paletteButtons.forEach(b => b.style.border = "1px solid #aaa");
        titleInput.maxLength = 70; // Увеличиваем лимит до 70
      } else {
        // Включаем цвета
        titleInput.maxLength = 48; // Уменьшаем лимит до 48
        if (titleInput.value.length > 48) {
          // Автообрезка, если текст слишком длинный
          titleInput.value = titleInput.value.slice(0, 48);
        }
      }
     
      updateHiddenSubject();
      updateCharCounter();
    });

    // 🖥️ Инициализация внешнего вида переключателя
    updateToggleStyle();
  }

  // 🔗 === ДОБАВЛЕНИЕ ССЫЛКИ "ТЕМА: ..." В ПОСТЫ ===
  function addTopicLinkToPostHeader() {
    if (!ENABLE_TOPIC_LINKS) return;
    if (!document.querySelector('.punbb#pun-viewtopic')) return;
    const alt = document.querySelector('link[rel="alternate"]');
    if (!alt) return;
    const match = alt.getAttribute("href").match(/id=(\d+)/);
    if (!match) return;
    const topicId = match[1];
    const topicUrl = "/viewtopic.php?id=" + topicId;
    const topicTitle = document.querySelector(".main h1 span")?.textContent?.trim();
    if (!topicTitle) return;
    const linkHTML = `<li class="TopicLnk" style="font-weight:normal;display:inline-block;color:#7c7cc2;"> Тема: <a href="${topicUrl}">${topicTitle}</a></li>`;
    document.querySelectorAll(".post h3>span a.permalink").forEach(link => {
      if (link.parentElement.querySelector(".TopicLnk")) return;
      const isTopicPost = link.closest(".topicpost") !== null;
      const finalHTML = isTopicPost ? linkHTML.replace("Re: ", "") : linkHTML;
      link.insertAdjacentHTML("afterend", finalHTML);
    });
  }

  // 🎨 === ПРИМЕНЕНИЕ ЦВЕТОВ КО ВСЕМ ЭЛЕМЕНТАМ НА СТРАНИЦЕ ===
  function applyTopicColors() {
    // Обрабатываем все элементы, которые могут содержать цветовые коды
    document.querySelectorAll(
      'a[href*="viewtopic.php"], .TopicLnk, .post-cell.tcr, .crumbs a, .main h1 span'
    ).forEach(el => {
      if (el.dataset.colorProcessed) return; // Уже обработано
      let text = el.textContent || "";

      const [color, bg, ...rest] = text.split(';;');
      const cleanText = rest.join(';;');
      // Оборачиваем текст в span с цветами
      el.innerHTML = `<span style="color:${color};background-color:${bg};padding:0 2px;border-radius:2px;">${cleanText}</span>`;
      el.dataset.colorProcessed = "1";
    });

    // 🔍 Дополнительно: обход текстовых узлов (для сложных случаев)
    const allTextNodes = [];
    const walk = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT, {
      acceptNode: function(node) {

          let currentParent = node.parentElement;
          while (currentParent && currentParent !== document.body) {
            if (currentParent.dataset.colorProcessed) return NodeFilter.FILTER_REJECT;
            currentParent = currentParent.parentElement;
          }
          return NodeFilter.FILTER_ACCEPT;
        }
        return NodeFilter.FILTER_REJECT;
      }
    });

    let node;
    while (node = walk.nextNode()) allTextNodes.push(node);

    allTextNodes.forEach(textNode => {
      let currentParent = textNode.parentElement;
      while (currentParent && currentParent !== document.body) {
        if (currentParent.dataset.colorProcessed) return;
        currentParent = currentParent.parentElement;
      }
      const parent = textNode.parentElement;
      const text = textNode.textContent;

      const [color, bg, ...rest] = text.split(';;');
      const cleanText = rest.join(';;');
      const coloredSpan = document.createElement('span');
      coloredSpan.style.color = color;
      coloredSpan.style.backgroundColor = bg;
      coloredSpan.style.padding = '0 2px';
      coloredSpan.style.borderRadius = '2px';
      coloredSpan.textContent = cleanText;
      textNode.replaceWith(coloredSpan);
      parent.dataset.colorProcessed = '1';
    });
  }

  // 🖥️ Заглушка для будущего расширения (заголовок)
  function applyTopicColorsInHeader() {}

  // ▶️ === ЗАПУСК СКРИПТА ПРИ ЗАГРУЗКЕ СТРАНИЦЫ ===
  document.addEventListener("DOMContentLoaded", () => {
    initColorPicker();
    addTopicLinkToPostHeader();
    applyTopicColors();
    applyTopicColorsInHeader();
  });

  // 👁️ === НАБЛЮДАТЕЛЬ ЗА ИЗМЕНЕНИЯМИ В DOM (для динамических элементов) ===
  const liveObserver = new MutationObserver(() => {
    applyTopicColors();
    applyTopicColorsInHeader();
  });
  liveObserver.observe(document.body, { childList: true, subtree: true });
})();

Тема на форуме техподдержки


👻В связи с «Тыквенным Спасом»©,  на форуме на несколько дней  снова поселились 🎃тыковка и 🕸 паутинка.

Тема про 🎃тыковку и 🕸 паутинку на форуме техподдержки

Подпись автора

Функционал форума Книга жалоб Книга предложений Знак зодиака Как вставить видео на форум Форум"Грибные места" Слайдер для картинок Live-box с темами

0


Вы здесь » kuban-forum.ru - Лучший форум для общения » 🛠️Технические вопросы работы форума » Исходные коды модификации этого форума.