Задать вопрос директору
Telegram
VK
Звонок

Отзывы о кухне на заказ для сайта мебельного цеха

Плитки отзывов, где рядом с текстом стоят срок из договора и итог по смете. Наверху фильтр по типу мебели, внизу счётчик по показанным отзывам.

Живое демо — блок работает прямо здесь

Код блока

<section class="vbok">
  <div class="vbok-wrap">
    <div class="vbok-top">
      <div class="vbok-head">
        <h2 class="vbok-h2">Заказчики о сроках и смете</h2>
        <p class="vbok-lead">Отзыв просим написать через месяц после сборки, когда ящики уже походили, а фасады пережили первую готовку. В каждой плитке стоит срок из договора и итог по смете.</p>
      </div>
      <div class="vbok-tabs" id="vbok-tabs" role="group" aria-label="Что заказывали"></div>
    </div>

    <div class="vbok-grid" id="vbok-grid" aria-live="polite"></div>
    <p class="vbok-sum" id="vbok-sum"></p>
  </div>
</section>

<style>
.vbok, .vbok *, .vbok *::before, .vbok *::after { box-sizing: border-box; }
.vbok {
  --acc: #9d5f2b; --ink: #2a2017; --muted: #7c6b5a; --line: #e8dccc; --soft: #f8f2e8; --card: #fff; --ok: #4c7a44;
  --f: var(--t-text-font, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif);
  --fh: var(--t-headline-font, var(--f));
  background: var(--card); color: var(--ink); font-family: var(--f); padding: clamp(36px, 5vw, 80px) 20px;
}
.vbok-wrap { max-width: 1240px; margin: 0 auto; padding: 0 clamp(0px, 2vw, 40px); }
.vbok-top { display: grid; grid-template-columns: minmax(0, 1.4fr) minmax(0, .6fr); gap: clamp(20px, 3vw, 44px);
  align-items: end; margin-bottom: clamp(24px, 3vw, 40px); }
.vbok-h2 { font-family: var(--fh); font-size: clamp(26px, 3.4vw, 42px); line-height: 1.1; font-weight: 700; letter-spacing: -.02em; margin: 0 0 12px; }
.vbok-lead { font-size: 16px; line-height: 1.6; color: var(--muted); margin: 0; max-width: 40em; }
.vbok-tabs { display: flex; flex-wrap: wrap; gap: 8px; }
.vbok-tab { border: 1.5px solid var(--line); margin: 0; padding: 10px 16px; -webkit-appearance: none; appearance: none;
  font: inherit; font-size: 14px; cursor: pointer; border-radius: 999px;
  background: var(--card) !important; color: var(--muted) !important; transition: .18s ease; }
.vbok-tab:hover { border-color: var(--acc); color: var(--ink) !important; }
.vbok-tab[aria-pressed="true"] { background: var(--acc) !important; border-color: var(--acc); color: #fff !important; }

.vbok-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: clamp(14px, 1.6vw, 20px); }
.vbok-card { background: var(--soft); border-radius: 20px; padding: clamp(20px, 2.3vw, 28px); display: flex; flex-direction: column; }
.vbok-card__top { display: flex; align-items: center; gap: 12px; margin-bottom: 14px; }
.vbok-ava { flex: 0 0 44px; width: 44px; height: 44px; border-radius: 13px; background: var(--card); display: flex; align-items: center;
  justify-content: center; font-family: var(--fh); font-size: 17px; font-weight: 700; color: var(--acc); }
.vbok-card h3 { font-size: 15.5px; font-weight: 600; line-height: 1.25; margin: 0; }
.vbok-card__c { display: block; font-size: 12.5px; color: var(--muted); margin-top: 3px; font-weight: 400; }
.vbok-what { font-size: 14px; line-height: 1.45; font-weight: 600; margin: 0 0 12px; }
.vbok-marks { display: flex; flex-wrap: wrap; gap: 7px; margin-bottom: 14px; }
.vbok-mark { display: inline-flex; align-items: center; gap: 6px; font-size: 12.5px; line-height: 1.3;
  background: var(--card); border-radius: 999px; padding: 7px 13px; color: var(--muted); }
.vbok-mark svg { width: 14px; height: 14px; flex: 0 0 14px; color: var(--acc); }
.vbok-mark--ok { color: var(--ok); }
.vbok-mark--ok svg { color: var(--ok); }
.vbok-card p { margin: 0; font-size: 14.5px; line-height: 1.65; color: var(--muted); }
.vbok-sum { margin: clamp(20px, 2.4vw, 30px) 0 0; padding-top: 20px; border-top: 1px solid var(--line);
  font-size: 13.5px; line-height: 1.6; color: var(--muted); }
.vbok-sum b { color: var(--ink); }

@media (max-width: 900px) { .vbok-top { grid-template-columns: minmax(0, 1fr); align-items: start; } }
@media (prefers-reduced-motion: reduce) { .vbok * { transition: none !important; } }
</style>

<script>
(function () {
  /* ── ФИЛЬТРЫ ── */
  var TABS = [
    { id: 'all', n: 'Все работы' },
    { id: 'kitchen', n: 'Кухни' },
    { id: 'shkaf', n: 'Шкафы и гардеробные' },
    { id: 'other', n: 'Другая мебель' }
  ];

  /* ── ОТЗЫВЫ: what — заказ, days — срок из договора, cost — итог по смете ── */
  var REVIEWS = [
    { n: 'Марина К.', c: 'улица Гагарина, трёхкомнатная', t: 'kitchen',
      what: 'Кухня 4,2 погонных метра, фасады в эмали', days: '34 рабочих дня', cost: 'Сумма из договора осталась прежней', ok: 1,
      text: 'Выбирали цвет по вееру дома, замерщик оставил образцы на выходные. Собрали за день, вытяжку подключили сами. Через месяц один ящик стал цеплять, мастер приехал и отрегулировал за пятнадцать минут.' },
    { n: 'Дмитрий С.', c: 'посёлок Заречный, дом', t: 'shkaf',
      what: 'Шкаф-купе 2,4 метра в прихожую', days: '19 рабочих дней', cost: 'Добавили 7 800 ₽ за зеркальные двери', ok: 0,
      text: 'Зеркала попросили уже после утверждения проекта, разницу посчитали сразу и показали в новой смете. Двери ходят мягко, порог у пола ровный, пылесос под ним проходит.' },
    { n: 'Ольга В.', c: 'жилой комплекс на Северной', t: 'shkaf',
      what: 'Гардеробная 6 м² с наполнением', days: '26 рабочих дней', cost: 'Сумма из договора осталась прежней', ok: 1,
      text: 'Планировали вдвоём с проектировщиком: высоту штанг подбирали под мой рост, обувные полки под конкретное число пар. Сетчатые корзины поставили выдвижные, они оказались удобнее, чем я думала.' },
    { n: 'Сергей П.', c: 'улица Лесная, кухня-гостиная', t: 'kitchen',
      what: 'Кухня 5,4 погонных метра с островом', days: '41 рабочий день', cost: 'Добавили 12 000 ₽ за кварцевую столешницу', ok: 0,
      text: 'Изначально считали компакт-плиту, но после образцов взяли кварц. Срок из-за этого сдвинулся на неделю, предупредили заранее и написали новую дату в дополнительном соглашении. Остров вышел ровно по чертежу.' },
    { n: 'Екатерина Л.', c: 'улица Садовая, детская', t: 'other',
      what: 'Кровать-чердак со столом и лестницей', days: '23 рабочих дня', cost: 'Сумма из договора осталась прежней', ok: 1,
      text: 'Просила скруглить все углы и вывести розетку к столу. Сделали, ступени добавили противоскользящую накладку по своей инициативе. Сын живёт в этой кровати второй год, стыки держатся.' },
    { n: 'Ирина М.', c: 'улица Мира, съёмная квартира', t: 'kitchen',
      what: 'Кухня 2,8 погонного метра из плёнки', days: '21 рабочий день', cost: 'Сумма из договора осталась прежней', ok: 1,
      text: 'Бюджет был жёсткий, поэтому верхний ряд заменили открытыми полками. Мне подсказали, где можно сэкономить, и не уговаривали на более дорогие фасады. Для сдачи квартиры получилось ровно то, что нужно.' }
  ];

  var roots = document.querySelectorAll('.vbok');
  for (var i = 0; i < roots.length; i++) init(roots[i]);

  function init(root) {
    if (root.__vb) return; root.__vb = 1;
    var tabs = root.querySelector('#vbok-tabs');
    var grid = root.querySelector('#vbok-grid');
    var sum = root.querySelector('#vbok-sum');
    var cur = 'all';

    var ICO_T = '<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false"><g fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><circle cx="12" cy="12" r="9"/><path d="M12 7v5l3.5 2"/><\/g><\/svg>';
    var ICO_M = '<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false"><g fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 12.5l5 5L20 6.5"/><\/g><\/svg>';

    tabs.innerHTML = TABS.map(function (t) {
      return '<button type="button" class="vbok-tab" data-id="' + t.id + '" aria-pressed="' + (t.id === cur) + '">' + t.n + '<\/button>';
    }).join('');

    function draw() {
      var list = [];
      for (var j = 0; j < REVIEWS.length; j++) if (cur === 'all' || REVIEWS[j].t === cur) list.push(REVIEWS[j]);
      grid.innerHTML = list.map(function (r) {
        return '<article class="vbok-card"><div class="vbok-card__top">' +
          '<span class="vbok-ava">' + r.n.charAt(0) + '<\/span>' +
          '<h3>' + r.n + '<span class="vbok-card__c">' + r.c + '<\/span><\/h3><\/div>' +
          '<p class="vbok-what">' + r.what + '<\/p>' +
          '<div class="vbok-marks"><span class="vbok-mark">' + ICO_T + r.days + '<\/span>' +
          '<span class="vbok-mark' + (r.ok ? ' vbok-mark--ok' : '') + '">' + ICO_M + r.cost + '<\/span><\/div>' +
          '<p>' + r.text + '<\/p><\/article>';
      }).join('');
      var keep = 0;
      for (var k = 0; k < list.length; k++) if (list[k].ok) keep++;
      sum.innerHTML = 'Показано отзывов: <b>' + list.length + '<\/b>. Из них сумма договора осталась прежней в <b>' + keep +
        '<\/b> случаях, в остальных заказчик сам менял наполнение уже после утверждения проекта.';
    }

    tabs.addEventListener('click', function (e) {
      var b = e.target.closest ? e.target.closest('.vbok-tab') : null;
      if (!b) return;
      cur = b.getAttribute('data-id');
      var bs = tabs.querySelectorAll('.vbok-tab');
      for (var j = 0; j < bs.length; j++) bs[j].setAttribute('aria-pressed', bs[j] === b ? 'true' : 'false');
      draw();
    });

    draw();
  }
})();
</script>

Вставляется целиком в блок T123 «HTML-код». Внутри уже есть стили и скрипт, подключать ничего не нужно.

Как вставить блок в Tilda

  1. Скопируйте кодКнопка «Скопировать код» выше кладёт всё содержимое в буфер обмена.
  2. Добавьте блок T123В редакторе страницы: «Библиотека блоков» → «Другое» → T123 «HTML-код».
  3. Вставьте и сохранитеНажмите «Контент», вставьте код в поле, сохраните и обновите страницу.
  4. ОпубликуйтеВ превью скрипты Tilda работают не всегда — проверяйте на опубликованной странице.

Подробная инструкция с граблями — как вставить вайб-блок в Tilda.

Что менять под себя

Где в кодеЗа что отвечает
REVIEWS в начале скриптаимя, адрес объекта, заказ, срок, итог по смете и текст отзыва
поле t у отзыва и массив TABSк какой группе относится отзыв и названия кнопок фильтра
поле ok у отзываподсвечивать ли метку сметы зелёным или оставить её серой
--acc и --ok в начале стилейцвет активной кнопки фильтра и цвет метки об уложенной смете

Отзывы о кухне на заказ: зачем он нужен

Отзыв о мебели убеждает деталями, поэтому в каждой плитке рядом с именем стоит строка заказа: длина кухни в погонных метрах, размер шкафа-купе или площадь гардеробной. Ниже идут две метки: срок изготовления из договора и итог по смете. Метка о смете подсвечивается зелёным, когда сумма осталась прежней, и остаётся серой, когда заказчик сам добавил позиции после утверждения проекта.

Наверху лежит фильтр из четырёх кнопок: все работы, кухни, шкафы с гардеробными и другая мебель. Список перерисовывается по клику, а строка под сеткой пересчитывает, сколько отзывов показано и в скольких случаях сумма договора осталась прежней. Данные лежат в массиве REVIEWS в начале скрипта, править их можно без знания разметки. Аватар собирается из первой буквы имени, поэтому фотографии заказчиков не нужны.

Вопросы по этому блоку

  • Удалите тег div с идентификатором vbok-tabs из разметки и обработчик клика по нему в скрипте. Функция draw останется рабочей и покажет все отзывы сразу.

  • Плитка рассчитана на инициал в цветном квадрате, это избавляет от загрузки картинок. Если фотографии нужны, замените содержимое span с классом vbok-ava на тег img со своим адресом.

  • Он считается по видимому списку в функции draw: общее число плиток и число отзывов с полем ok. Текст строки лежит там же и правится обычным текстом.

  • Да. Код на этой странице копируется целиком, без регистрации и подписки. Указывать авторство не нужно, использовать можно в коммерческих проектах.

  • Нет. Все классы внутри имеют собственный префикс vbok, поэтому не пересекаются ни со стилями Tilda, ни с другими блоками. Скрипт привязан к своему элементу и запускается один раз, даже если блок вставлен дважды.

  • Раскладка перестраивается под узкие экраны, размеры заданы через clamp, поля ввода имеют шрифт 16 пикселей — iOS не будет зумить страницу при фокусе. Отдельной мобильной версии подключать не нужно.

Другие блоки отзывов

Ещё блоки для мебельных компаний

Собрать сайт целиком, а не по блокам

Дровосеки делают сайты на Tilda под ключ: структура, тексты, дизайн, вёрстка и вайб-блоки под задачи бизнеса.