code constant

String const code

Implementation

static const String code = r'''
function bindChatScreens() {
  document.querySelectorAll('.arcane-chat-screen').forEach(function(chat) {
    if (chat.dataset.arcaneInteractive === 'true') return;
    chat.dataset.arcaneInteractive = 'true';

    var inputArea = chat.querySelector('.arcane-chat-input');
    var sendBtn = chat.querySelector('.arcane-chat-send');
    var messagesArea = chat.querySelector('.arcane-chat-messages');

    if (inputArea && sendBtn) {
      // Auto-resize textarea
      inputArea.addEventListener('input', function() {
        inputArea.style.height = 'auto';
        inputArea.style.height = Math.min(inputArea.scrollHeight, 120) + 'px';
      });

      // Send on enter (without shift)
      inputArea.addEventListener('keydown', function(e) {
        if (e.key === 'Enter' && !e.shiftKey) {
          e.preventDefault();
          sendMessage();
        }
      });

      // Send button click
      sendBtn.addEventListener('click', function() {
        sendMessage();
      });
    }

    function sendMessage() {
      var text = inputArea.value.trim();
      if (!text) return;

      // Dispatch event for handling
      chat.dispatchEvent(new CustomEvent('sendmessage', {
        detail: { text: text }
      }));

      // Clear input
      inputArea.value = '';
      inputArea.style.height = 'auto';

      // Scroll to bottom
      if (messagesArea) {
        messagesArea.scrollTop = messagesArea.scrollHeight;
      }
    }

    // Auto-scroll when new messages arrive
    if (messagesArea) {
      var observer = new MutationObserver(function(mutations) {
        mutations.forEach(function(mutation) {
          if (mutation.addedNodes.length) {
            messagesArea.scrollTop = messagesArea.scrollHeight;
          }
        });
      });

      observer.observe(messagesArea, { childList: true });
    }
  });
}
''';