class ClaudeChatContainer extends HTMLElement { constructor() { super(); this.autoScroll = true; } connectedCallback() { this.attachShadow({ mode: 'open' }); this.render(); this.setupEventListeners(); this.loadConversationHistory(); } render() { this.shadowRoot.innerHTML = `
Welcome to ClaudeVerse AI
I'm here to help you with writing, analysis, coding, and much more. Choose a Claude model above and start a conversation!
Claude is typing...
`; setTimeout(() => { feather.replace(); }, 100); } setupEventListeners() { const chatContainer = this.shadowRoot.getElementById('chatContainer'); const scrollToBottom = this.shadowRoot.getElementById('scrollToBottom'); // Scroll behavior chatContainer.addEventListener('scroll', () => { const { scrollTop, scrollHeight, clientHeight } = chatContainer; const isAtBottom = scrollHeight - scrollTop - clientHeight < 50; if (isAtBottom) { this.autoScroll = true; scrollToBottom.classList.remove('show'); } else { this.autoScroll = false; scrollToBottom.classList.add('show'); } }); // Scroll to bottom button scrollToBottom.addEventListener('click', () => { this.scrollToBottom(); }); // Global events document.addEventListener('claude-show-typing', () => { this.showTypingIndicator(); }); document.addEventListener('claude-hide-typing', () => { this.hideTypingIndicator(); }); document.addEventListener('claude-clear-chat', () => { this.clearMessages(); this.showEmptyState(); }); document.addEventListener('claude-new-chat', () => { this.clearMessages(); this.showEmptyState(); }); // Listen for new messages document.addEventListener('claude-message-added', (event) => { const { message } = event.detail; this.addMessage(message); }); } loadConversationHistory() { const history = window.claudeApp.conversationHistory; if (history.length === 0) { this.showEmptyState(); } else { this.hideEmptyState(); history.forEach(message => { this.addMessage(message, false); }); this.scrollToBottom(); } } addMessage(message, animate = true) { this.hideEmptyState(); const messagesWrapper = this.shadowRoot.getElementById('messagesWrapper'); const messageElement = document.createElement('div'); messageElement.className = `message ${message.role}`; if (animate) { messageElement.classList.add('message-enter'); } const timestamp = new Date(message.timestamp).toLocaleTimeString(); messageElement.innerHTML = `
${message.role === 'user' ? 'You' : 'Assistant'}
${this.formatMessageContent(message.content)}
`; messagesWrapper.appendChild(messageElement); if (this.autoScroll) { this.scrollToBottom(); } // Update feather icons setTimeout(() => { feather.replace(); }, 100); } formatMessageContent(content) { // Simple markdown parsing for code blocks and inline code return content .replace(/