package main import ( "fmt" "html" "strings" ) // FragmentUserMessage returns an HTML fragment for a user message. func FragmentUserMessage(text string) string { escaped := html.EscapeString(text) return fmt.Sprintf(`
%s
`, escaped) } // FragmentAssistantStart returns the opening tag for an assistant message with streaming. func FragmentAssistantStart(msgID string) string { return fmt.Sprintf(`
`, msgID) } // FragmentAssistantChunk appends text to an existing assistant message. func FragmentAssistantChunk(msgID, textChunk string) string { escaped := html.EscapeString(textChunk) return fmt.Sprintf(`
%s
`, msgID, escaped) } // FragmentAssistantComplete replaces the content of an assistant message with final rendered content. func FragmentAssistantComplete(msgID, htmlContent string) string { return fmt.Sprintf(`
%s
`, msgID, htmlContent) } // FragmentToolCall returns an HTML fragment for a tool use notification. func FragmentToolCall(toolName string, toolInput string) string { escapedName := html.EscapeString(toolName) escapedInput := html.EscapeString(toolInput) if len(escapedInput) > 200 { escapedInput = escapedInput[:200] + "..." } return fmt.Sprintf(`
%s
%s
`, escapedName, escapedInput) } // FragmentSystemMessage returns an HTML fragment for a system message. func FragmentSystemMessage(text string) string { escaped := html.EscapeString(text) return fmt.Sprintf(`
%s
`, escaped) } // FragmentTypingIndicator shows or hides the typing indicator. func FragmentTypingIndicator(show bool) string { if show { return `
Claude razmišlja...
` } return `
` } // FragmentStatus updates the connection status indicator. func FragmentStatus(connected bool) string { if connected { return `Povezan` } return `Nepovezan` } // FragmentClearInput clears the message input field. func FragmentClearInput() string { return `` } // FragmentCombine joins multiple fragments into a single response. func FragmentCombine(fragments ...string) string { return strings.Join(fragments, "\n") }