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