<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:yandex="http://news.yandex.ru" xmlns:turbo="http://turbo.yandex.ru" xmlns:media="http://search.yahoo.com/mrss/">
  <channel>
    <title>Модификации для тильды</title>
    <link>https://estarikova.ru</link>
    <description/>
    <language>ru</language>
    <lastBuildDate>Sat, 16 May 2026 00:01:16 +0300</lastBuildDate>
    <item turbo="true">
      <title>Как добавить дополнительные кнопки в попап BF503</title>
      <link>https://estarikova.ru/tilda-mod/dobavlenie-knopok-v-bf503</link>
      <amplink>https://estarikova.ru/tilda-mod/dobavlenie-knopok-v-bf503?amp=true</amplink>
      <pubDate>Sun, 26 Apr 2026 11:36:00 +0300</pubDate>
      <author>Елена Старикова, разработчик сайтов на тильде</author>
      <category>Формы</category>
      <turbo:content><![CDATA[<header><h1>Как добавить дополнительные кнопки в попап BF503</h1></header><div class="t-redactor__text">На Тильде есть удобный стандартный блок Popup: information (BF503). Обычно я использую этот блок для контактов: Свяжитесь со мной удобным способом и перечисляю мессенджеры. У блока BF503 есть ограничение: в него можно добавить не более двух кнопок, а мне этого не достаточно. В этой статье я покажу, как решить эту задачу с помощью небольшого фрагмента кода и готового конструктора.<br /><br /><a href="#zakazat-sajt" style="color: rgb(31, 31, 31); box-shadow: none; text-decoration: none; border-bottom: 1px solid rgb(31, 31, 31);">Смотреть пример поп-апа</a></div><h2  class="t-redactor__h2">Пошаговая инструкция</h2><h4  class="t-redactor__h4">Шаг 1. Присвойте CSS-класс блоку BF503</h4><div class="t-redactor__text">Чтобы код знал, в какой именно попап добавлять кнопки, нужно дать блоку уникальное имя.</div><div class="t-redactor__text"><ol><li data-list="ordered">Нажмите на блок <strong>BF503 </strong>и откройте его <strong>Настройки</strong>.</li><li data-list="ordered">Прокрутите настройки до самого низа — найдите поле <em>BLOCK CSS CLASS NAME</em>.</li><li data-list="ordered"><strong>Присвойте CSS-класс блоку. </strong>Впишите туда любое уникальное имя латинскими буквами. Примеры: uc-kontakty, uc-popup-links, uc-my-contacts</li><li data-list="ordered">Сохраните настройки блока.</li></ol></div><h4  class="t-redactor__h4">Шаг 2. Используйте <a href="#konstruktor-knopok" style="color: rgb(31, 31, 31); box-shadow: none; text-decoration: none; border-bottom: 1px solid rgb(31, 31, 31);">конструктор</a></h4><div class="t-redactor__text"><ol><li data-list="ordered">В поле <strong>CSS-класс блока</strong> в конструкторе ниже введите тот же класс, который вы указали в настройках блока.</li><li data-list="ordered">Выберите, сколько <strong>дополнительно</strong> кнопок хотите добавить: 2, 3 или 4. Для каждой кнопки укажите текст и ссылку.</li><li data-list="ordered">Нажмите <strong>Сгенерировать код</strong> и скопируйте результат.</li></ol></div><h4  class="t-redactor__h4">Шаг 3. Вставьте код на страницу</h4><div class="t-redactor__text"><ol><li data-list="ordered">На той же странице в Тильде добавьте блок <strong>T123</strong> (HTML-код).</li><li data-list="ordered">Вставьте скопированный код в этот блок.</li><li data-list="ordered">Сохраните и опубликуйте страницу.</li></ol></div><div class="t-redactor__text">Готово! Теперь при открытии попапа в нём появятся дополнительные кнопки. Они автоматически копируют стиль стандартных кнопок блока, поэтому будут выглядеть единообразно. Если в настройках вы задали разные стили для первой и второй кнопки, тогда все нечетные кнопки будут иметь стиль первой кнопки, а все четные — второй.</div><h2 id="konstruktor-knopok" class="t-redactor__h2">Конструктор кнопок</h2><div class="t-redactor__text">Заполните форму и скопируйте готовый код в блок T123.</div><div class="t-redactor__embedcode"><style>
  .uc-constructor {
    max-width: 680px;
    margin: 0 auto;
    font-family: 'Inter', sans-serif;
    color: #1b292b;
    line-height: 1.6;
  }
  .uc-constructor * { box-sizing: border-box; }
  .uc-constructor .uc-section {
    background: #fff;
    border: 1px solid #e2e4e9;
    border-radius: 10px;
    padding: 24px;
    margin-bottom: 16px;
    transition: border-color 0.2s;
  }
  .uc-constructor .uc-section:focus-within { border-color: #1b292b; }
  .uc-constructor .uc-section__label {
    font-size: 13px; font-weight: 700; letter-spacing: 0.5px;
    text-transform: uppercase; color: #777; margin-bottom: 14px;
    display: flex; align-items: center; gap: 8px;
  }
  .uc-constructor .uc-section__label .uc-num {
    display: inline-flex; align-items: center; justify-content: center;
    width: 22px; height: 22px; background: #1b292b; color: #fff;
    font-size: 12px; font-weight: 700; border-radius: 6px;
  }
  .uc-constructor .uc-input {
    width: 100%; background: #f7f7f8; border: 1px solid #e2e4e9;
    border-radius: 8px; padding: 13px 16px;
    font-family: 'JetBrains Mono', monospace; font-size: 14px;
    color: #1b292b; outline: none;
    transition: border-color 0.2s, box-shadow 0.2s;
  }
  .uc-constructor .uc-input:focus {
    border-color: #1b292b; box-shadow: 0 0 0 3px rgba(27,41,43,0.08);
  }
  .uc-constructor .uc-input::placeholder { color: #aaa; font-family: 'Inter', sans-serif; }
  .uc-constructor .uc-input-hint { font-size: 13px; color: #777; margin-top: 8px; line-height: 1.5; }
  .uc-constructor .uc-count-selector { display: flex; gap: 8px; }
  .uc-constructor .uc-count-btn {
    flex: 1; padding: 14px; background: #f7f7f8; border: 2px solid #e2e4e9;
    border-radius: 8px; color: #777; font-family: 'Inter', sans-serif;
    font-size: 18px; font-weight: 700; cursor: pointer;
    transition: all 0.15s; text-align: center;
  }
  .uc-constructor .uc-count-btn:hover { border-color: #999; color: #1b292b; }
  .uc-constructor .uc-count-btn.active { background: #1b292b; border-color: #1b292b; color: #fff; }
  .uc-constructor .uc-btn-fields { display: flex; flex-direction: column; gap: 14px; }
  .uc-constructor .uc-btn-field {
    background: #f7f7f8; border: 1px solid #e2e4e9; border-radius: 8px;
    padding: 18px; animation: ucSlideIn 0.2s ease;
  }
  @keyframes ucSlideIn {
    from { opacity: 0; transform: translateY(-6px); }
    to { opacity: 1; transform: translateY(0); }
  }
  .uc-constructor .uc-btn-field__header {
    display: flex; align-items: center; gap: 10px; margin-bottom: 12px;
  }
  .uc-constructor .uc-btn-field__num {
    width: 26px; height: 26px; display: inline-flex;
    align-items: center; justify-content: center;
    background: rgba(27,41,43,0.06); color: #1b292b;
    font-size: 13px; font-weight: 700; border-radius: 50%;
  }
  .uc-constructor .uc-btn-field__title { font-size: 14px; font-weight: 600; }
  .uc-constructor .uc-btn-field .uc-input { margin-bottom: 8px; background: #fff; }
  .uc-constructor .uc-checkbox {
    display: flex; align-items: center; gap: 8px;
    margin-top: 10px; font-size: 14px; color: #1b292b;
    cursor: pointer; user-select: none;
  }
  .uc-constructor .uc-checkbox input {
    width: 18px; height: 18px; margin: 0;
    accent-color: #1b292b; cursor: pointer;
  }
  .uc-constructor .uc-generate-btn {
    width: 100%; padding: 16px; background: #1b292b; border: none;
    border-radius: 10px; color: #fff; font-family: 'Inter', sans-serif;
    font-size: 16px; font-weight: 700; cursor: pointer; transition: all 0.15s;
  }
  .uc-constructor .uc-generate-btn:hover { opacity: 0.88; }
  .uc-constructor .uc-generate-btn:active { transform: scale(0.99); }
  .uc-constructor .uc-preview { display: none; margin-top: 16px; animation: ucSlideIn 0.25s ease; }
  .uc-constructor .uc-preview.visible { display: block; }
  .uc-constructor .uc-preview__title {
    font-size: 13px; font-weight: 700; letter-spacing: 0.5px;
    text-transform: uppercase; color: #777; margin-bottom: 10px;
  }
  .uc-constructor .uc-preview__box {
    background: #fff; border: 1px solid #e2e4e9; border-radius: 10px;
    padding: 28px 20px; display: flex; flex-wrap: wrap; gap: 10px; justify-content: center;
  }
  .uc-constructor .uc-preview__btn {
    width: calc(50% - 5px); padding: 14px 16px; border-radius: 8px;
    font-family: 'Inter', sans-serif; font-size: 15px; font-weight: 600;
    text-align: center; color: #fff; background: #7EB2E4; border: none;
  }
  .uc-constructor .uc-preview__btn.full { width: 100%; }
  .uc-constructor .uc-output { display: none; margin-top: 16px; animation: ucSlideIn 0.25s ease; }
  .uc-constructor .uc-output.visible { display: block; }
  .uc-constructor .uc-output__header {
    display: flex; align-items: center; justify-content: space-between; margin-bottom: 10px;
  }
  .uc-constructor .uc-output__title {
    font-size: 13px; font-weight: 700; letter-spacing: 0.5px;
    text-transform: uppercase; color: #2a9d5c;
    display: flex; align-items: center; gap: 8px;
  }
  .uc-constructor .uc-output__title::before {
    content: ''; width: 7px; height: 7px; background: #2a9d5c; border-radius: 50%;
  }
  .uc-constructor .uc-copy-btn {
    padding: 8px 16px; background: #fff; border: 1px solid #e2e4e9;
    border-radius: 8px; color: #1b292b; font-family: 'Inter', sans-serif;
    font-size: 13px; font-weight: 600; cursor: pointer; transition: all 0.15s;
  }
  .uc-constructor .uc-copy-btn:hover { border-color: #1b292b; }
  .uc-constructor .uc-copy-btn.copied {
    background: rgba(42,157,92,0.08); border-color: #2a9d5c; color: #2a9d5c;
  }
  .uc-constructor .uc-output__code {
    background: #1b292b; border-radius: 10px; padding: 20px; overflow-x: auto;
  }
  .uc-constructor .uc-output__code pre {
    font-family: 'JetBrains Mono', monospace; font-size: 13px; line-height: 1.7;
    color: #c5d0d2; white-space: pre-wrap; word-break: break-all; margin: 0;
  }
  @media (max-width: 600px) {
    .uc-constructor .uc-section { padding: 18px; }
    .uc-constructor .uc-btn-field { padding: 14px; }
    .uc-constructor .uc-count-btn { padding: 12px; font-size: 16px; }
    .uc-constructor .uc-preview__btn { width: 100%; }
  }
</style>

<div class="uc-constructor">
  <div class="uc-section">
    <div class="uc-section__label"><span class="uc-num">1</span> CSS-класс блока</div>
    <input class="uc-input" type="text" id="ucBlockClass" placeholder="uc-my-contacts">
    <div class="uc-input-hint">Введите класс из настроек блока BF503 (поле BLOCK CSS CLASS NAME)</div>
  </div>
  <div class="uc-section">
    <div class="uc-section__label"><span class="uc-num">2</span> Количество кнопок</div>
    <div class="uc-count-selector">
      <button class="uc-count-btn active" data-count="2">2</button>
      <button class="uc-count-btn" data-count="3">3</button>
      <button class="uc-count-btn" data-count="4">4</button>
    </div>
  </div>
  <div class="uc-section">
    <div class="uc-section__label"><span class="uc-num">3</span> Настройки кнопок</div>
    <div class="uc-btn-fields" id="ucBtnFields"></div>
  </div>
  <button class="uc-generate-btn" id="ucGenerateBtn">Сгенерировать код</button>
  <div class="uc-preview" id="ucPreview">
    <div class="uc-preview__title">Предпросмотр</div>
    <div class="uc-preview__box" id="ucPreviewBox"></div>
  </div>
  <div class="uc-output" id="ucOutput">
    <div class="uc-output__header">
      <div class="uc-output__title">Готовый код</div>
      <button class="uc-copy-btn" id="ucCopyBtn">Скопировать</button>
    </div>
    <div class="uc-output__code">
      <pre id="ucCodeOutput"></pre>
    </div>
  </div>
</div>

<script>
(function(){
  var count=2;
  var savedData=[];
  var countBtns=document.querySelectorAll('.uc-count-btn');
  var btnFields=document.getElementById('ucBtnFields');
  var generateBtn=document.getElementById('ucGenerateBtn');
  var output=document.getElementById('ucOutput');
  var codeOutput=document.getElementById('ucCodeOutput');
  var copyBtn=document.getElementById('ucCopyBtn');
  var preview=document.getElementById('ucPreview');
  var previewBox=document.getElementById('ucPreviewBox');

  function escAttr(s){
    return String(s||'').replace(/&/g,'&amp;').replace(/"/g,'&quot;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
  }

  function saveCurrent(){
    var texts=document.querySelectorAll('.uc-btn-text');
    var links=document.querySelectorAll('.uc-btn-link');
    var newtabs=document.querySelectorAll('.uc-btn-newtab');
    for(var i=0;i<texts.length;i++){
      savedData[i]={
        text:texts[i].value,
        link:links[i].value,
        newtab:newtabs[i].checked
      };
    }
  }

  function renderFields(){
    btnFields.innerHTML='';
    for(var i=0;i<count;i++){
      var s=savedData[i]||{text:'',link:'',newtab:true};
      var d=document.createElement('div');
      d.className='uc-btn-field';
      d.innerHTML='<div class="uc-btn-field__header"><span class="uc-btn-field__num">'+(i+1)+'</span><span class="uc-btn-field__title">Кнопка '+(i+1)+'</span></div>'
        +'<input class="uc-input uc-btn-text" type="text" placeholder="Текст на кнопке" data-index="'+i+'" value="'+escAttr(s.text)+'">'
        +'<input class="uc-input uc-btn-link" type="text" placeholder="https://..." data-index="'+i+'" value="'+escAttr(s.link)+'">'
        +'<label class="uc-checkbox"><input type="checkbox" class="uc-btn-newtab" data-index="'+i+'" '+(s.newtab?'checked':'')+'> Открывать в новом окне</label>';
      btnFields.appendChild(d);
    }
  }

  countBtns.forEach(function(btn){
    btn.addEventListener('click',function(){
      saveCurrent();
      countBtns.forEach(function(b){b.classList.remove('active')});
      btn.classList.add('active');
      count=parseInt(btn.dataset.count);
      renderFields();
      output.classList.remove('visible');
      preview.classList.remove('visible');
    });
  });

  function renderPreview(buttons){
    previewBox.innerHTML='';
    for(var i=0;i<buttons.length;i++){
      var el=document.createElement('div');
      el.className='uc-preview__btn';
      if(buttons.length%2!==0&&i===buttons.length-1) el.classList.add('full');
      el.textContent=buttons[i].text||'Кнопка '+(i+1);
      previewBox.appendChild(el);
    }
    preview.classList.add('visible');
  }

  function esc(s){return s.replace(/\\/g,'\\\\').replace(/'/g,"\\'")}

  generateBtn.addEventListener('click',function(){
    var cls=document.getElementById('ucBlockClass').value.trim();
    if(!cls){document.getElementById('ucBlockClass').focus();return}
    var sel='.'+cls;
    var buttons=[];
    var texts=document.querySelectorAll('.uc-btn-text');
    var links=document.querySelectorAll('.uc-btn-link');
    var newtabs=document.querySelectorAll('.uc-btn-newtab');
    for(var i=0;i<count;i++){
      buttons.push({
        text:texts[i].value.trim()||'Кнопка '+(i+1),
        link:links[i].value.trim()||'#',
        newtab:newtabs[i].checked
      });
    }
    renderPreview(buttons);

    var odd='';
    if(count%2!==0){
      odd='\n'+sel+' .t390__btn-wrapper .uc-extra-btn:last-child {\n  width: 100% !important;\n}';
    }

    var css='<style>\n'+sel+' .t390__btn-wrapper {\n  display: flex !important;\n  flex-wrap: wrap !important;\n  gap: 10px !important;\n  justify-content: center !important;\n}\n'+sel+' .t390__btn-wrapper .t-btnflex {\n  width: calc(50% - 5px) !important;\n  box-sizing: border-box !important;\n  text-align: center !important;\n  justify-content: center !important;\n  margin: 0 !important;\n}'+odd+'\n@media (max-width: 768px) {\n  '+sel+' .t390__btn-wrapper .t-btnflex {\n    width: 100% !important;\n  }\n}\n</style>';

    var jsB='';
    for(var j=0;j<buttons.length;j++){
      var cl=j%2===0?'existing[0]':'existing[existing.length>1?1:0]';
      var tgt=buttons[j].newtab
        ?'    btn'+(j+1)+'.target = \'_blank\';\n    btn'+(j+1)+'.rel = \'noopener\';\n'
        :'    btn'+(j+1)+'.target = \'_self\';\n    btn'+(j+1)+'.removeAttribute(\'rel\');\n';
      jsB+='\n    var btn'+(j+1)+' = '+cl+'.cloneNode(false);\n    btn'+(j+1)+'.href = \''+esc(buttons[j].link)+'\';\n'+tgt+'    btn'+(j+1)+'.textContent = \''+esc(buttons[j].text)+'\';\n    btn'+(j+1)+'.classList.add(\'uc-extra-btn\');\n';
    }
    var jsA='';
    for(var k=0;k<buttons.length;k++){jsA+='    wrap.appendChild(btn'+(k+1)+');\n'}

    var js='\n<sc'+'ript>\n(function() {\n  function insertButtons() {\n    var popup = document.querySelector(\''+esc(sel)+'\');\n    if (!popup) return;\n    var wrap = popup.querySelector(\'.t390__btn-wrapper\');\n    if (!wrap) return;\n    if (wrap.querySelector(\'.uc-extra-btn\')) return;\n\n    var existing = wrap.querySelectorAll(\'.t-btnflex\');\n    if (!existing.length) return;\n'+jsB+'\n'+jsA+'  }\n\n  var observer = new MutationObserver(function() {\n    insertButtons();\n  });\n  observer.observe(document.body, { childList: true, subtree: true });\n\n  document.addEventListener(\'click\', function() {\n    setTimeout(insertButtons, 500);\n  });\n})();\n<\/sc'+'ript>';

    codeOutput.textContent=css+js;
    output.classList.add('visible');
    output.scrollIntoView({behavior:'smooth',block:'nearest'});
  });

  copyBtn.addEventListener('click',function(){
    navigator.clipboard.writeText(codeOutput.textContent).then(function(){
      copyBtn.textContent='Скопировано!';
      copyBtn.classList.add('copied');
      setTimeout(function(){copyBtn.textContent='Скопировать';copyBtn.classList.remove('copied')},2000);
    });
  });

  renderFields();
})();
</script>
</div><h2  class="t-redactor__h2">Как работает код</h2><div class="t-redactor__text">Сгенерированный код состоит из двух частей:</div><div class="t-redactor__text"><ul><li data-list="bullet"><strong>CSS</strong> — выравнивает кнопки в сетку по 2 в ряд. Если кнопок нечётное количество, последняя растягивается на всю ширину. На мобильных устройствах кнопки выстраиваются в одну колонку.</li><li data-list="bullet"><strong>JavaScript</strong> — находит попап по CSS-классу, клонирует существующие кнопки (сохраняя их стили) и заменяет текст и ссылки на ваши. Код срабатывает автоматически при открытии попапа.</li></ul></div>]]></turbo:content>
    </item>
  </channel>
</rss>
