[html]<style>
  .num-table {
    border-collapse: collapse;
    margin: 15px 0;
    width: auto;
  }
  .num-table td {
    width: 52px;
    height: 52px;
    padding: 0;
    text-align: center;
    font: bold 20px/52px Arial, sans-serif;
    background: #f0f8ff;
    border: 2px solid #4a90d9;
    border-radius: 8px;
    cursor: pointer;
    transition: all 0.15s ease;
    user-select: none;
  }
  .num-table td:hover {
    background: #d4e4ff;
    transform: scale(1.05);
    border-color: #2a6fc9;
  }
  .num-table td:active {
    transform: scale(0.92);
    background: #b6d4ff;
  }
  .num-table td.taken {
    background: #d4edda;
    border-color: #28a745;
    cursor: default;
    opacity: 0.7;
  }
  .num-table td.taken:hover {
    transform: none;
    background: #d4edda;
  }
  .num-table td.my-take {
    background: #ffd700;
    border-color: #ff8c00;
    transform: scale(1.05);
  }
  .num-hint {
    font: 14px Arial, sans-serif;
    color: #333;
    margin: 5px 0 8px 0;
  }
  .num-status {
    font: 13px Arial, sans-serif;
    color: #28a745;
    margin: 5px 0;
    min-height: 20px;
  }
</style>

<script>
// === Функция должна быть определена до использования ===
function takeNumber(num) {
  // Отладка: убедимся, что клик сработал
  // alert('Клик по номеру ' + num); // раскомментируйте для проверки

  var status = document.getElementById('numStatus');
  if (!status) {
    // если нет блока статуса, создадим
    status = document.createElement('div');
    status.id = 'numStatus';
    document.querySelector('.num-table').after(status);
  }

  // Проверка занятости
  var taken = [];
  try {
    var data = localStorage.getItem('takenNumbers');
    if (data) taken = JSON.parse(data);
  } catch(e) {}

  if (taken.includes(num)) {
    status.textContent = '❌ Номер ' + num + ' уже занят!';
    status.style.color = '#dc3545';
    return;
  }

  // Поиск поля ввода (приоритет #main-reply)
  var replyField = document.getElementById('main-reply');
  if (!replyField) {
    replyField = document.querySelector('textarea[name="message"]');
  }
  if (!replyField) {
    replyField = document.querySelector('textarea[name="msg"]');
  }
  if (!replyField) {
    replyField = document.querySelector('#postform textarea');
  }
  if (!replyField) {
    replyField = document.querySelector('.resizable-textarea textarea');
  }
  if (!replyField) {
    replyField = document.querySelector('textarea'); // последняя надежда
  }

  var phrase = 'беру номер ' + num;

  if (replyField) {
    replyField.value = phrase;
    replyField.focus();
    replyField.select();
    // Триггеры для реактивных фреймворков
    var evt = new Event('input', { bubbles: true });
    replyField.dispatchEvent(evt);
    replyField.dispatchEvent(new Event('change', { bubbles: true }));

    status.textContent = '✅ Выбран номер ' + num + ' (отправьте сообщение)';
    status.style.color = '#28a745';
  } else {
    // Запасной вариант – копирование в буфер
    try {
      navigator.clipboard.writeText(phrase).catch(function() {
        var textarea = document.createElement('textarea');
        textarea.value = phrase;
        document.body.appendChild(textarea);
        textarea.select();
        document.execCommand('copy');
        document.body.removeChild(textarea);
      });
    } catch(e) {
      // если и это не работает – покажем alert
      alert('Поле ввода не найдено! Скопируйте вручную: ' + phrase);
    }
    status.textContent = '⚠ Поле не найдено, текст скопирован в буфер';
    status.style.color = '#ff8c00';
  }

  // Сохраняем выбранный номер для последующего закрепления
  window.mySelected = num;
  // Обновляем внешний вид
  updateCells();
}

// === Функция обновления ячеек ===
function updateCells() {
  var taken = [];
  try {
    var data = localStorage.getItem('takenNumbers');
    if (data) taken = JSON.parse(data);
  } catch(e) {}

  var mySel = window.mySelected || null;
  var cells = document.querySelectorAll('.num-table td');
  cells.forEach(function(cell) {
    var num = parseInt(cell.textContent);
    cell.classList.remove('taken', 'my-take');
    if (taken.includes(num)) {
      cell.classList.add('taken');
    }
    if (mySel === num) {
      cell.classList.add('my-take');
    }
  });
}

// === Функция сохранения номера после отправки ===
function saveMyNumber() {
  if (window.mySelected === undefined || window.mySelected === null) return;
  var num = window.mySelected;
  var taken = [];
  try {
    var data = localStorage.getItem('takenNumbers');
    if (data) taken = JSON.parse(data);
  } catch(e) {}
  if (!taken.includes(num)) {
    taken.push(num);
    try {
      localStorage.setItem('takenNumbers', JSON.stringify(taken));
    } catch(e) {}
    var status = document.getElementById('numStatus');
    if (status) {
      status.textContent = '✅ Номер ' + num + ' закреплён!';
      status.style.color = '#28a745';
    }
    window.mySelected = null;
    updateCells();
  }
}

// === Отслеживание отправки формы ===
function setupListeners() {
  // Все формы на странице
  var forms = document.querySelectorAll('form');
  forms.forEach(function(form) {
    form.addEventListener('submit', function() {
      setTimeout(saveMyNumber, 600);
    });
  });
  // Кнопки отправки
  var buttons = document.querySelectorAll('input[type="submit"], button[type="submit"], .button, input[name="post"]');
  buttons.forEach(function(btn) {
    btn.addEventListener('click', function() {
      setTimeout(saveMyNumber, 600);
    });
  });
}

// === Инициализация при загрузке ===
window.addEventListener('DOMContentLoaded', function() {
  updateCells();
  setupListeners();
  console.log('✅ Скрипт загружен. Нажми на любой номер.');
});
</script>

<div class="num-hint">🔢 Нажми на номер — он появится в поле ответа:</div>

<table class="num-table">
  <tr>
    <td onclick="takeNumber(1)">1</td>
    <td onclick="takeNumber(2)">2</td>
    <td onclick="takeNumber(3)">3</td>
    <td onclick="takeNumber(4)">4</td>
    <td onclick="takeNumber(5)">5</td>
  </tr>
  <tr>
    <td onclick="takeNumber(6)">6</td>
    <td onclick="takeNumber(7)">7</td>
    <td onclick="takeNumber(8)">8</td>
    <td onclick="takeNumber(9)">9</td>
    <td onclick="takeNumber(10)">10</td>
  </tr>
  <tr>
    <td onclick="takeNumber(11)">11</td>
    <td onclick="takeNumber(12)">12</td>
    <td onclick="takeNumber(13)">13</td>
    <td onclick="takeNumber(14)">14</td>
    <td onclick="takeNumber(15)">15</td>
  </tr>
  <tr>
    <td onclick="takeNumber(16)">16</td>
    <td onclick="takeNumber(17)">17</td>
    <td onclick="takeNumber(18)">18</td>
    <td onclick="takeNumber(19)">19</td>
    <td onclick="takeNumber(20)">20</td>
  </tr>
  <tr>
    <td onclick="takeNumber(21)">21</td>
    <td onclick="takeNumber(22)">22</td>
    <td onclick="takeNumber(23)">23</td>
    <td onclick="takeNumber(24)">24</td>
    <td onclick="takeNumber(25)">25</td>
  </tr>
  <tr>
    <td onclick="takeNumber(26)">26</td>
    <td onclick="takeNumber(27)">27</td>
    <td onclick="takeNumber(28)">28</td>
    <td onclick="takeNumber(29)">29</td>
    <td onclick="takeNumber(30)">30</td>
  </tr>
</table>

<div class="num-status" id="numStatus">✅ Выберите номер</div>[/html]