blob: ac5f756746cfefc9ba3555be5c2215f7bc25838a [file] [log] [blame]
philip.zeyliger26bc6592025-06-30 20:15:30 -07001/* eslint-disable @typescript-eslint/no-explicit-any */
Sean McCullough618bfb22025-06-25 20:52:30 +00002/**
3 * Demo module for sketch-chat-input component
4 */
5
6import { DemoModule } from "./demo-framework/types";
7import { demoUtils } from "./demo-fixtures/index";
8
9const demo: DemoModule = {
10 title: "Chat Input Demo",
11 description: "Interactive chat input component with send functionality",
12 imports: ["../sketch-chat-input"],
13
14 setup: async (container: HTMLElement) => {
15 // Create demo sections
16 const basicSection = demoUtils.createDemoSection(
17 "Basic Chat Input",
18 "Type a message and press Enter or click Send",
19 );
20
21 const messagesSection = demoUtils.createDemoSection(
22 "Chat Messages",
23 "Messages will appear here when sent",
24 );
25
26 // Create chat messages container
27 const messagesDiv = document.createElement("div");
28 messagesDiv.id = "chat-messages";
29 messagesDiv.style.cssText = `
30 min-height: 100px;
31 max-height: 200px;
32 overflow-y: auto;
33 border: 1px solid #d1d9e0;
34 border-radius: 6px;
35 padding: 10px;
36 margin-bottom: 10px;
37 background: #f6f8fa;
38 `;
39
40 // Create chat input
41 const chatInput = document.createElement("sketch-chat-input") as any;
42 chatInput.content = "Hello, how can I help you today?";
43
44 // Add message to display
45 const addMessage = (message: string, isUser: boolean = true) => {
46 const messageDiv = document.createElement("div");
47 messageDiv.style.cssText = `
48 padding: 8px 12px;
49 margin: 4px 0;
50 border-radius: 6px;
51 background: ${isUser ? "#0969da" : "#f1f3f4"};
52 color: ${isUser ? "white" : "#24292f"};
53 max-width: 80%;
54 margin-left: ${isUser ? "auto" : "0"};
55 margin-right: ${isUser ? "0" : "auto"};
56 `;
57 messageDiv.textContent = message;
58 messagesDiv.appendChild(messageDiv);
59 messagesDiv.scrollTop = messagesDiv.scrollHeight;
60 };
61
62 // Handle send events
63 chatInput.addEventListener("send-chat", (evt: any) => {
64 const message = evt.detail.message;
65 if (message.trim()) {
66 addMessage(message, true);
67 chatInput.content = "";
68
69 // Simulate bot response after a delay
70 setTimeout(() => {
71 const responses = [
72 "Thanks for your message!",
73 "I understand your request.",
74 "Let me help you with that.",
75 "That's a great question!",
76 "I'll look into that for you.",
77 ];
78 const randomResponse =
79 responses[Math.floor(Math.random() * responses.length)];
80 addMessage(randomResponse, false);
81 }, 1000);
82 }
83 });
84
85 // Add some sample messages
86 addMessage("Welcome to the chat demo!", false);
87 addMessage("This is a sample user message", true);
88
89 // Control buttons
90 const controlsDiv = document.createElement("div");
91 controlsDiv.style.cssText = "margin-top: 15px;";
92
93 const clearButton = demoUtils.createButton("Clear Messages", () => {
94 messagesDiv.innerHTML = "";
95 addMessage("Chat cleared!", false);
96 });
97
98 const presetButton = demoUtils.createButton("Add Preset Message", () => {
99 chatInput.content = "Can you help me implement a file upload component?";
100 });
101
102 controlsDiv.appendChild(clearButton);
103 controlsDiv.appendChild(presetButton);
104
105 // Assemble the demo
106 messagesSection.appendChild(messagesDiv);
107 basicSection.appendChild(chatInput);
108 basicSection.appendChild(controlsDiv);
109
110 container.appendChild(messagesSection);
111 container.appendChild(basicSection);
112 },
113};
114
115export default demo;