@maebgch/rcs-emulator 0.1.6 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/rcs-emulator.cjs.js +132 -132
- package/dist/rcs-emulator.cjs.js.map +1 -1
- package/dist/rcs-emulator.es.js +2189 -1781
- package/dist/rcs-emulator.es.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rcs-emulator.cjs.js","sources":["../src/components/RcsEmulator/types/rbm.types.ts","../src/components/RcsEmulator/context/EmulatorContext.tsx","../src/components/RcsEmulator/utils/messageParser.ts","../src/components/RcsEmulator/hooks/useConversation.ts","../src/components/RcsEmulator/hooks/useJsonFetch.ts","../src/components/RcsEmulator/hooks/useAutoScroll.ts","../src/components/RcsEmulator/components/BusinessHeader/BusinessHeader.tsx","../src/components/RcsEmulator/components/BrandedHero/BrandedHero.tsx","../src/components/RcsEmulator/components/Message/TextMessage.tsx","../src/components/RcsEmulator/components/Message/UserReply.tsx","../src/components/RcsEmulator/components/Message/RichCard.tsx","../src/components/RcsEmulator/components/Message/Carousel.tsx","../src/components/RcsEmulator/components/Message/MessageRenderer.tsx","../src/components/RcsEmulator/components/TypingIndicator/TypingIndicator.tsx","../src/components/RcsEmulator/components/MessageList/MessageList.tsx","../src/components/RcsEmulator/components/Suggestions/SuggestionChip.tsx","../src/components/RcsEmulator/components/Suggestions/SuggestionsBar.tsx","../src/components/RcsEmulator/components/ChatWindow/ChatWindow.tsx","../src/components/RcsEmulator/components/BusinessProfile/BusinessProfile.tsx","../src/components/RcsEmulator/components/WebView/WebViewRenderer.tsx","../src/components/RcsEmulator/components/LockScreen/LockScreen.tsx","../src/components/RcsEmulator/RcsEmulator.tsx"],"sourcesContent":["/**\n * RCS Business Messaging (RBM) JSON Schema Types\n *\n * These interfaces define the structure of RBM conversation flows\n * as documented in the RBM specification.\n */\n\n// ============================================\n// Top-Level Conversation Flow\n// ============================================\n\nexport interface RbmConversationFlow {\n /** Campaign / flow identifier */\n name: string;\n /** All conversation nodes (message states) */\n messages: Record<string, RbmMessage>;\n /** Keyword to restart the conversation flow */\n reset_keyword?: string;\n /** Session validity window in hours */\n expireInHours?: number;\n}\n\n// ============================================\n// Message Node\n// ============================================\n\nexport interface RbmMessage {\n /** Unique identifier for this message node */\n id: string;\n /** Marks the entry point of the conversation (only one should be true) */\n is_first: boolean;\n /** Response handlers for user interactions */\n responses: RbmResponses;\n /** UI components to render */\n parts: RbmMessagePart[];\n}\n\nexport interface RbmResponses {\n keyword?: RbmKeywordResponse;\n}\n\nexport interface RbmKeywordResponse {\n keyword_response: {\n choices: Record<string, RbmChoice>;\n };\n}\n\nexport interface RbmChoice {\n /** Display text for the choice */\n display_text: string;\n /** Message ID to navigate to */\n next_message: string;\n /** Context variables to pass */\n variables?: Record<string, unknown>;\n}\n\n// ============================================\n// Message Parts (UI Components)\n// ============================================\n\nexport interface RbmMessagePart {\n RCSMessage: RCSMessage;\n}\n\nexport interface RCSMessage {\n /** Traffic type classification */\n trafficType?: \"advertisement\" | \"transactional\" | \"promotional\";\n /** Simple text message */\n textMessage?: string;\n /** Rich card message */\n richcardMessage?: RbmRichCardMessage;\n /** Suggested chip list (for text messages with suggestions) */\n suggestedChipList?: RbmSuggestedChipList;\n /** Message contact info */\n messageContact?: RbmMessageContact;\n}\n\nexport interface RbmSuggestedChipList {\n suggestions: RbmSuggestion[];\n}\n\nexport interface RbmMessageContact {\n userContact: string;\n}\n\n// ============================================\n// Rich Card Messages\n// ============================================\n\nexport interface RbmRichCardMessage {\n message: {\n generalPurposeCard?: RbmGeneralPurposeCard;\n generalPurposeCardCarousel?: RbmGeneralPurposeCardCarousel;\n };\n}\n\nexport interface RbmGeneralPurposeCard {\n layout: RbmCardLayout;\n content: RbmCardContent;\n}\n\nexport interface RbmGeneralPurposeCardCarousel {\n layout: RbmCarouselLayout;\n content: RbmCardContent[];\n}\n\nexport interface RbmCardLayout {\n cardOrientation: \"VERTICAL\" | \"HORIZONTAL\";\n cardWidth?: \"SMALL_WIDTH\" | \"MEDIUM_WIDTH\";\n imageAlignment?: \"LEFT\" | \"RIGHT\";\n}\n\nexport interface RbmCarouselLayout {\n cardWidth: \"SMALL_WIDTH\" | \"MEDIUM_WIDTH\";\n cardOrientation?: \"VERTICAL\" | \"HORIZONTAL\";\n}\n\nexport interface RbmCardContent {\n /** Media content (image/video) */\n media?: RbmMedia;\n /** Card title */\n title?: string;\n /** Card description */\n description?: string;\n /** Interactive suggestions */\n suggestions?: RbmSuggestion[];\n}\n\n// ============================================\n// Media\n// ============================================\n\n/**\n * RBM Media - supports both API formats:\n * - Flat format: mediaUrl, mediaContentType, mediaFileSize (from messagingstudio API)\n * - Nested format: contentInfo.fileUrl (alternate format)\n */\nexport interface RbmMedia {\n height: \"SHORT_HEIGHT\" | \"MEDIUM_HEIGHT\" | \"TALL_HEIGHT\";\n /** Media URL (flat format from API) */\n mediaUrl?: string;\n /** MIME type (flat format from API) */\n mediaContentType?: string;\n /** File size in bytes (flat format from API) */\n mediaFileSize?: number;\n /** Nested content info (alternate format) */\n contentInfo?: RbmContentInfo;\n /** Thumbnail URL for video content */\n thumbnailUri?: string;\n}\n\nexport interface RbmContentInfo {\n fileUrl: string;\n thumbnailUrl?: string;\n forceRefresh?: boolean;\n /** MIME type of the file */\n mimeType?: string;\n /** File size in bytes */\n fileSize?: number;\n}\n\n// ============================================\n// Suggestions (Replies & Actions)\n// ============================================\n\nexport type RbmSuggestion = RbmSuggestedReply | RbmSuggestedAction;\n\nexport interface RbmSuggestedReply {\n reply: {\n displayText: string;\n postback: RbmPostback;\n };\n}\n\nexport interface RbmSuggestedAction {\n action: {\n displayText: string;\n postback: RbmPostback;\n /** Open URL action (legacy simple format) */\n openUrlAction?: {\n url: string;\n };\n /** URL action with WebView support (from messagingstudio API) */\n urlAction?: {\n openUrl: RbmOpenUrl;\n };\n /** Dial phone action (legacy format) */\n dialAction?: {\n phoneNumber: string;\n };\n /** Dialer action (from messagingstudio API) */\n dialerAction?: {\n dialPhoneNumber: {\n phoneNumber: string;\n };\n };\n /** Share location action */\n shareLocationAction?: Record<string, never>;\n /** View location action (legacy format) */\n viewLocationAction?: {\n latLong?: {\n latitude: number;\n longitude: number;\n };\n query?: string;\n label?: string;\n };\n /** Map action (from messagingstudio API) */\n mapAction?: {\n showLocation: {\n location: {\n latitude: number;\n longitude: number;\n label?: string;\n };\n };\n };\n /** Create calendar event action */\n createCalendarEventAction?: {\n title: string;\n description?: string;\n startTime?: string;\n endTime?: string;\n };\n /** Calendar action (from messagingstudio API) */\n calendarAction?: {\n createCalendarEvent: {\n title: string;\n description?: string;\n startTime?: string;\n endTime?: string;\n };\n };\n };\n}\n\n/** WebView mode for opening URLs */\nexport type RbmWebViewMode = \"FULL\" | \"TALL\" | \"HALF\";\n\n/** Application type for URL actions */\nexport type RbmUrlApplication = \"BROWSER\" | \"WEBVIEW\";\n\n/** Open URL configuration */\nexport interface RbmOpenUrl {\n /** Target URL */\n url: string;\n /** Application to open URL in */\n application?: RbmUrlApplication;\n /** WebView display mode (only when application is WEBVIEW) */\n webviewViewMode?: RbmWebViewMode;\n /** Description/title for WebView header */\n description?: string;\n}\n\nexport interface RbmPostback {\n data: string;\n}\n\n// ============================================\n// Type Guards\n// ============================================\n\nexport function isSuggestedReply(\n suggestion: RbmSuggestion\n): suggestion is RbmSuggestedReply {\n return \"reply\" in suggestion;\n}\n\nexport function isSuggestedAction(\n suggestion: RbmSuggestion\n): suggestion is RbmSuggestedAction {\n return \"action\" in suggestion;\n}\n\nexport function hasRichCard(message: RCSMessage): boolean {\n return !!message.richcardMessage?.message?.generalPurposeCard;\n}\n\nexport function hasCarousel(message: RCSMessage): boolean {\n return !!message.richcardMessage?.message?.generalPurposeCardCarousel;\n}\n\nexport function hasTextMessage(message: RCSMessage): boolean {\n return !!message.textMessage;\n}\n\n/** Check if an action should open in WebView */\nexport function isWebViewAction(suggestion: RbmSuggestion): boolean {\n if (!isSuggestedAction(suggestion)) return false;\n const { urlAction } = suggestion.action;\n return urlAction?.openUrl?.application === \"WEBVIEW\";\n}\n\n/** Get WebView config from action */\nexport function getWebViewConfig(\n suggestion: RbmSuggestedAction\n): RbmOpenUrl | null {\n const { urlAction } = suggestion.action;\n if (urlAction?.openUrl?.application === \"WEBVIEW\") {\n return urlAction.openUrl;\n }\n return null;\n}\n","/**\n * Emulator Context Provider\n * \n * Provides theme, device type, and conversation state to all child components.\n */\n\nimport { createContext, useContext, type ReactNode } from 'react';\nimport type {\n EmulatorContextValue,\n EmulatorTheme,\n EmulatorDevice,\n BusinessInfo,\n ConversationState,\n WebViewState,\n} from '../types/emulator.types';\nimport type { RbmSuggestion } from '../types/rbm.types';\n\nconst defaultBusinessInfo: BusinessInfo = {\n name: 'Business',\n verified: false,\n};\n\nconst defaultState: ConversationState = {\n currentMessageId: null,\n chatHistory: [],\n isTyping: false,\n error: null,\n};\n\nconst EmulatorContext = createContext<EmulatorContextValue | null>(null);\n\nexport interface EmulatorProviderProps {\n children: ReactNode;\n theme: EmulatorTheme;\n device: EmulatorDevice;\n businessInfo: BusinessInfo;\n state: ConversationState;\n showSuggestions: boolean;\n isProfileOpen: boolean;\n toggleProfile: () => void;\n onReply: (suggestion: RbmSuggestion) => void;\n onAction: (suggestion: RbmSuggestion) => void;\n webView: WebViewState | null;\n openWebView: (config: Omit<WebViewState, 'isOpen'>) => void;\n closeWebView: () => void;\n}\n\nexport function EmulatorProvider({\n children,\n theme,\n device,\n businessInfo,\n state,\n showSuggestions,\n isProfileOpen,\n toggleProfile,\n onReply,\n onAction,\n webView,\n openWebView,\n closeWebView,\n}: EmulatorProviderProps) {\n const value: EmulatorContextValue = {\n theme,\n device,\n businessInfo: { ...defaultBusinessInfo, ...businessInfo },\n state: { ...defaultState, ...state },\n showSuggestions,\n isProfileOpen,\n toggleProfile,\n handleReply: onReply,\n handleAction: onAction,\n webView,\n openWebView,\n closeWebView,\n };\n\n return (\n <EmulatorContext.Provider value={value}>\n {children}\n </EmulatorContext.Provider>\n );\n}\n\nexport function useEmulator(): EmulatorContextValue {\n const context = useContext(EmulatorContext);\n if (!context) {\n throw new Error('useEmulator must be used within an EmulatorProvider');\n }\n return context;\n}\n\nexport { EmulatorContext };\n\n","/**\n * Message Parser Utilities\n * \n * Parses and normalizes RBM JSON into internal component-ready structures.\n */\n\nimport type {\n RbmConversationFlow,\n RbmMessage,\n RbmMessagePart,\n RbmCardContent,\n RbmSuggestion,\n} from '../types/rbm.types';\nimport type { ChatMessage, RichCardData, MessageContent } from '../types/emulator.types';\n\n/**\n * Find the first message (entry point) in a conversation flow\n */\nexport function findFirstMessage(flow: RbmConversationFlow): RbmMessage | null {\n const messages = Object.values(flow.messages);\n return messages.find((msg) => msg.is_first) || messages[0] || null;\n}\n\n/**\n * Get a message by ID from the conversation flow\n */\nexport function getMessageById(\n flow: RbmConversationFlow,\n messageId: string\n): RbmMessage | null {\n return flow.messages[messageId] || null;\n}\n\n/**\n * Find the next message ID based on postback data\n */\nexport function findNextMessageId(\n message: RbmMessage,\n postbackData: string\n): string | null {\n const choices = message.responses?.keyword?.keyword_response?.choices;\n if (!choices) return null;\n \n const choice = choices[postbackData];\n return choice?.next_message || null;\n}\n\n/**\n * Convert RBM message parts to internal ChatMessage format\n */\nexport function parseMessageParts(\n message: RbmMessage,\n messageIndex: number\n): ChatMessage {\n const parts = message.parts;\n const content = parseContent(parts);\n // Only extract message-level chips (suggestedChipList), NOT card suggestions\n const suggestions = extractMessageLevelSuggestions(parts);\n\n return {\n id: `${message.id}-${messageIndex}-${Date.now()}`,\n sender: 'business',\n content,\n timestamp: Date.now(),\n suggestions,\n };\n}\n\n/**\n * Parse message parts into MessageContent\n */\nfunction parseContent(parts: RbmMessagePart[]): MessageContent {\n for (const part of parts) {\n const rcsMessage = part.RCSMessage;\n\n // Text message\n if (rcsMessage.textMessage) {\n return {\n type: 'text',\n text: rcsMessage.textMessage,\n };\n }\n\n // Rich card (single)\n const card = rcsMessage.richcardMessage?.message?.generalPurposeCard;\n if (card) {\n return {\n type: 'richcard',\n card: parseCardContent(card.content, card.layout),\n };\n }\n\n // Carousel\n const carousel = rcsMessage.richcardMessage?.message?.generalPurposeCardCarousel;\n if (carousel) {\n return {\n type: 'carousel',\n cards: carousel.content.map((cardContent) =>\n parseCardContent(cardContent, {\n cardOrientation: 'VERTICAL',\n cardWidth: carousel.layout.cardWidth,\n })\n ),\n };\n }\n }\n\n // Fallback for unknown content\n return {\n type: 'text',\n text: '[Unsupported message type]',\n };\n}\n\n/**\n * Parse card content into RichCardData\n * Supports both API formats:\n * - Flat format: media.mediaUrl (from messagingstudio API)\n * - Nested format: media.contentInfo.fileUrl (alternate format)\n */\nfunction parseCardContent(\n content: RbmCardContent,\n layout: { cardOrientation: string; cardWidth?: string; imageAlignment?: string }\n): RichCardData {\n // Extract media URL - support both flat and nested formats\n const getMediaUrl = (): string | undefined => {\n if (!content.media) return undefined;\n // Flat format (messagingstudio API): mediaUrl\n if (content.media.mediaUrl) return content.media.mediaUrl;\n // Nested format: contentInfo.fileUrl\n if (content.media.contentInfo?.fileUrl) return content.media.contentInfo.fileUrl;\n return undefined;\n };\n\n const getThumbnailUrl = (): string | undefined => {\n if (!content.media) return undefined;\n // Try thumbnailUri first, then nested contentInfo\n if (content.media.thumbnailUri) return content.media.thumbnailUri;\n if (content.media.contentInfo?.thumbnailUrl) return content.media.contentInfo.thumbnailUrl;\n return undefined;\n };\n\n const mediaUrl = getMediaUrl();\n\n return {\n title: content.title,\n description: content.description,\n media: mediaUrl\n ? {\n url: mediaUrl,\n height: mapHeight(content.media?.height || 'MEDIUM_HEIGHT'),\n thumbnailUrl: getThumbnailUrl(),\n }\n : undefined,\n suggestions: content.suggestions,\n layout: {\n orientation: layout.cardOrientation === 'HORIZONTAL' ? 'horizontal' : 'vertical',\n width: layout.cardWidth === 'SMALL_WIDTH' ? 'small' : 'medium',\n imageAlignment: layout.imageAlignment === 'RIGHT' ? 'right' : 'left',\n },\n };\n}\n\n/**\n * Map RBM height values to internal format\n */\nfunction mapHeight(height: string): 'short' | 'medium' | 'tall' {\n switch (height) {\n case 'SHORT_HEIGHT':\n return 'short';\n case 'TALL_HEIGHT':\n return 'tall';\n default:\n return 'medium';\n }\n}\n\n/**\n * Extract MESSAGE-LEVEL suggestions (suggestedChipList only)\n * These are quick-reply chips that appear in the bottom bar and disappear after selection\n * \n * Card-level suggestions stay ON the card and are handled by the RichCard/Carousel components\n */\nfunction extractMessageLevelSuggestions(parts: RbmMessagePart[]): RbmSuggestion[] {\n const suggestions: RbmSuggestion[] = [];\n\n for (const part of parts) {\n const rcsMessage = part.RCSMessage;\n\n // Only extract suggestedChipList (message-level quick replies)\n if (rcsMessage.suggestedChipList?.suggestions) {\n suggestions.push(...rcsMessage.suggestedChipList.suggestions);\n }\n }\n\n return suggestions;\n}\n\n/**\n * Extract all suggestions from message parts (for backward compatibility/testing)\n * @deprecated Use extractMessageLevelSuggestions for proper RCS behavior\n */\nexport function extractAllSuggestions(parts: RbmMessagePart[]): RbmSuggestion[] {\n const suggestions: RbmSuggestion[] = [];\n\n for (const part of parts) {\n const rcsMessage = part.RCSMessage;\n\n // Suggested chip list (message-level)\n if (rcsMessage.suggestedChipList?.suggestions) {\n suggestions.push(...rcsMessage.suggestedChipList.suggestions);\n }\n\n // Single card suggestions (card-level)\n const card = rcsMessage.richcardMessage?.message?.generalPurposeCard;\n if (card?.content.suggestions) {\n suggestions.push(...card.content.suggestions);\n }\n\n // Carousel card suggestions (card-level)\n const carousel = rcsMessage.richcardMessage?.message?.generalPurposeCardCarousel;\n if (carousel) {\n for (const cardContent of carousel.content) {\n if (cardContent.suggestions) {\n suggestions.push(...cardContent.suggestions);\n }\n }\n }\n }\n\n return suggestions;\n}\n\n/**\n * Create a user reply message\n */\nexport function createUserReplyMessage(text: string): ChatMessage {\n return {\n id: `user-${Date.now()}`,\n sender: 'user',\n content: {\n type: 'userReply',\n text,\n },\n timestamp: Date.now(),\n };\n}\n\n/**\n * Validate RBM conversation flow structure\n */\nexport function validateConversationFlow(flow: unknown): flow is RbmConversationFlow {\n if (!flow || typeof flow !== 'object') return false;\n \n const f = flow as Record<string, unknown>;\n \n if (typeof f.name !== 'string') return false;\n if (!f.messages || typeof f.messages !== 'object') return false;\n \n // Check at least one message exists\n const messages = Object.values(f.messages as Record<string, unknown>);\n if (messages.length === 0) return false;\n \n // Validate each message has required fields\n for (const msg of messages) {\n if (!msg || typeof msg !== 'object') return false;\n const m = msg as Record<string, unknown>;\n if (typeof m.id !== 'string') return false;\n if (!Array.isArray(m.parts)) return false;\n }\n \n return true;\n}\n\n/**\n * Get preview text from the first message for lock screen notification\n */\nexport function getFirstMessagePreview(flow: RbmConversationFlow): string {\n const firstMessage = findFirstMessage(flow);\n if (!firstMessage || !firstMessage.parts.length) return \"New message\";\n\n const part = firstMessage.parts[0];\n const rcsMessage = part.RCSMessage;\n\n // Text message\n if (rcsMessage.textMessage) {\n return rcsMessage.textMessage.slice(0, 50) + (rcsMessage.textMessage.length > 50 ? '...' : '');\n }\n\n // Rich card\n const card = rcsMessage.richcardMessage?.message?.generalPurposeCard;\n if (card?.content.title) {\n return card.content.title;\n }\n\n // Carousel\n const carousel = rcsMessage.richcardMessage?.message?.generalPurposeCardCarousel;\n if (carousel?.content[0]?.title) {\n return carousel.content[0].title;\n }\n\n return \"New message\";\n}\n\n","/**\n * useConversation Hook\n *\n * Manages conversation flow state, navigation between message nodes,\n * and chat history.\n */\n\nimport { useReducer, useCallback, useEffect, useRef } from \"react\";\nimport type {\n ConversationState,\n ConversationAction,\n UserReplyPayload,\n} from \"../types/emulator.types\";\nimport type { RbmConversationFlow, RbmSuggestion } from \"../types/rbm.types\";\nimport { isSuggestedReply, isSuggestedAction } from \"../types/rbm.types\";\nimport {\n findFirstMessage,\n getMessageById,\n findNextMessageId,\n parseMessageParts,\n createUserReplyMessage,\n} from \"../utils/messageParser\";\n\nconst initialState: ConversationState = {\n currentMessageId: null,\n chatHistory: [],\n isTyping: false,\n error: null,\n};\n\nfunction conversationReducer(\n state: ConversationState,\n action: ConversationAction\n): ConversationState {\n switch (action.type) {\n case \"INIT\":\n return {\n ...state,\n currentMessageId: action.messageId,\n error: null,\n };\n\n case \"ADD_BUSINESS_MESSAGE\":\n return {\n ...state,\n chatHistory: [...state.chatHistory, action.message],\n isTyping: false,\n };\n\n case \"ADD_USER_REPLY\": {\n const userMessage = createUserReplyMessage(action.text);\n // Remove suggestions from previous business message\n const updatedHistory = state.chatHistory.map((msg, idx) =>\n idx === state.chatHistory.length - 1\n ? { ...msg, suggestions: undefined }\n : msg\n );\n return {\n ...state,\n chatHistory: [...updatedHistory, userMessage],\n };\n }\n\n case \"SET_TYPING\":\n return {\n ...state,\n isTyping: action.isTyping,\n };\n\n case \"NAVIGATE_TO\":\n return {\n ...state,\n currentMessageId: action.messageId,\n };\n\n case \"SET_ERROR\":\n return {\n ...state,\n error: action.error,\n isTyping: false,\n };\n\n case \"RESET\":\n return initialState;\n\n default:\n return state;\n }\n}\n\ninterface UseConversationOptions {\n flow: RbmConversationFlow;\n onUserReply: (payload: UserReplyPayload) => void;\n typingDelay?: number;\n}\n\nexport function useConversation({\n flow,\n onUserReply,\n typingDelay = 800,\n}: UseConversationOptions) {\n const [state, dispatch] = useReducer(conversationReducer, initialState);\n const messageIndexRef = useRef(0);\n const initializedRef = useRef(false);\n\n // Initialize conversation with first message\n useEffect(() => {\n if (initializedRef.current) return;\n initializedRef.current = true;\n\n const firstMessage = findFirstMessage(flow);\n if (!firstMessage) {\n dispatch({\n type: \"SET_ERROR\",\n error: \"No first message found in conversation flow\",\n });\n return;\n }\n\n dispatch({ type: \"INIT\", messageId: firstMessage.id });\n\n // Add first message to chat history\n const chatMessage = parseMessageParts(\n firstMessage,\n messageIndexRef.current++\n );\n dispatch({ type: \"ADD_BUSINESS_MESSAGE\", message: chatMessage });\n }, [flow]);\n\n // Handle user selecting a suggested reply\n const handleReply = useCallback(\n (suggestion: RbmSuggestion) => {\n if (!isSuggestedReply(suggestion)) return;\n\n const { displayText, postback } = suggestion.reply;\n const postbackData = postback.data;\n\n // Add user reply to chat\n dispatch({ type: \"ADD_USER_REPLY\", text: displayText, postbackData });\n\n // Emit callback\n const payload: UserReplyPayload = {\n type: \"reply\",\n postbackData,\n displayText,\n timestamp: Date.now(),\n };\n onUserReply(payload);\n\n // Find current message and next message\n const currentMessage = state.currentMessageId\n ? getMessageById(flow, state.currentMessageId)\n : null;\n\n if (!currentMessage) {\n dispatch({ type: \"SET_ERROR\", error: \"Current message not found\" });\n return;\n }\n\n const nextMessageId = findNextMessageId(currentMessage, postbackData);\n if (!nextMessageId) {\n // End of conversation or no matching response\n return;\n }\n\n const nextMessage = getMessageById(flow, nextMessageId);\n if (!nextMessage) {\n dispatch({\n type: \"SET_ERROR\",\n error: `Next message \"${nextMessageId}\" not found`,\n });\n return;\n }\n\n // Show typing indicator then add next message\n dispatch({ type: \"SET_TYPING\", isTyping: true });\n dispatch({ type: \"NAVIGATE_TO\", messageId: nextMessageId });\n\n setTimeout(() => {\n const chatMessage = parseMessageParts(\n nextMessage,\n messageIndexRef.current++\n );\n dispatch({ type: \"ADD_BUSINESS_MESSAGE\", message: chatMessage });\n }, typingDelay);\n },\n [flow, state.currentMessageId, onUserReply, typingDelay]\n );\n\n // Handle user clicking a suggested action\n const handleAction = useCallback(\n (suggestion: RbmSuggestion) => {\n if (!isSuggestedAction(suggestion)) return;\n\n const {\n displayText,\n postback,\n openUrlAction,\n dialAction,\n dialerAction,\n mapAction,\n viewLocationAction,\n } = suggestion.action;\n const postbackData = postback.data;\n\n // Get phone number from either format\n const phoneNumber =\n dialAction?.phoneNumber || dialerAction?.dialPhoneNumber?.phoneNumber;\n\n // Get location from either format\n const location =\n mapAction?.showLocation?.location || viewLocationAction?.latLong;\n\n // Build action data\n let actionData: UserReplyPayload[\"actionData\"];\n if (openUrlAction) {\n actionData = { type: \"openUrl\", url: openUrlAction.url };\n } else if (phoneNumber) {\n actionData = { type: \"dial\", phoneNumber };\n } else if (location) {\n actionData = {\n type: \"viewLocation\",\n latitude: location.latitude,\n longitude: location.longitude,\n query: viewLocationAction?.query,\n };\n }\n\n // Emit callback with action data\n const payload: UserReplyPayload = {\n type: \"action\",\n postbackData,\n displayText,\n timestamp: Date.now(),\n actionData,\n };\n onUserReply(payload);\n\n // Execute action\n if (openUrlAction) {\n window.open(openUrlAction.url, \"_blank\", \"noopener,noreferrer\");\n } else if (phoneNumber) {\n window.location.href = `tel:${phoneNumber}`;\n } else if (location) {\n // Open Google Maps with location\n const label =\n mapAction?.showLocation?.location?.label ||\n viewLocationAction?.label ||\n \"\";\n const mapsUrl = `https://www.google.com/maps/search/?api=1&query=${\n location.latitude\n },${location.longitude}${\n label ? `&query_place_id=${encodeURIComponent(label)}` : \"\"\n }`;\n window.open(mapsUrl, \"_blank\", \"noopener,noreferrer\");\n }\n\n // For actions, also try to navigate if there's a next message\n const currentMessage = state.currentMessageId\n ? getMessageById(flow, state.currentMessageId)\n : null;\n\n if (currentMessage) {\n const nextMessageId = findNextMessageId(currentMessage, postbackData);\n if (nextMessageId) {\n const nextMessage = getMessageById(flow, nextMessageId);\n if (nextMessage) {\n dispatch({\n type: \"ADD_USER_REPLY\",\n text: displayText,\n postbackData,\n });\n dispatch({ type: \"SET_TYPING\", isTyping: true });\n dispatch({ type: \"NAVIGATE_TO\", messageId: nextMessageId });\n\n setTimeout(() => {\n const chatMessage = parseMessageParts(\n nextMessage,\n messageIndexRef.current++\n );\n dispatch({ type: \"ADD_BUSINESS_MESSAGE\", message: chatMessage });\n }, typingDelay);\n }\n }\n }\n },\n [flow, state.currentMessageId, onUserReply, typingDelay]\n );\n\n // Reset conversation\n const reset = useCallback(() => {\n initializedRef.current = false;\n messageIndexRef.current = 0;\n dispatch({ type: \"RESET\" });\n }, []);\n\n return {\n state,\n handleReply,\n handleAction,\n reset,\n };\n}\n","/**\n * useJsonFetch Hook\n *\n * Fetches RBM conversation flow JSON from a URL.\n */\n\nimport { useState, useEffect, useCallback } from \"react\";\nimport type { RbmConversationFlow } from \"../types/rbm.types\";\n\nexport interface UseJsonFetchResult {\n /** Fetched data */\n data: RbmConversationFlow | null;\n /** Loading state */\n isLoading: boolean;\n /** Error message if fetch failed */\n error: string | null;\n /** Refetch function */\n refetch: () => void;\n}\n\nexport function useJsonFetch(url: string | undefined): UseJsonFetchResult {\n const [data, setData] = useState<RbmConversationFlow | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const fetchJson = useCallback(async () => {\n if (!url) {\n setData(null);\n setError(null);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const response = await fetch(url, {\n method: \"GET\",\n headers: {\n Accept: \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const json = await response.json();\n\n // Validate basic structure\n if (!json || typeof json !== \"object\") {\n throw new Error(\"Invalid JSON: Expected an object\");\n }\n\n if (!json.messages || typeof json.messages !== \"object\") {\n throw new Error(\"Invalid RBM JSON: Missing 'messages' object\");\n }\n\n setData(json as RbmConversationFlow);\n } catch (err) {\n const message =\n err instanceof Error ? err.message : \"Failed to fetch JSON\";\n setError(message);\n setData(null);\n } finally {\n setIsLoading(false);\n }\n }, [url]);\n\n useEffect(() => {\n fetchJson();\n }, [fetchJson]);\n\n return {\n data,\n isLoading,\n error,\n refetch: fetchJson,\n };\n}\n\n\n","/**\n * useAutoScroll Hook\n * \n * Automatically scrolls to bottom when new messages are added,\n * mimicking real chat app behavior.\n */\n\nimport { useEffect, useRef, type RefObject } from 'react';\n\nexport function useAutoScroll<T extends HTMLElement>(\n dependency: unknown\n): RefObject<T | null> {\n const scrollRef = useRef<T>(null);\n\n useEffect(() => {\n if (scrollRef.current) {\n scrollRef.current.scrollTo({\n top: scrollRef.current.scrollHeight,\n behavior: 'smooth',\n });\n }\n }, [dependency]);\n\n return scrollRef;\n}\n\n","/**\n * BusinessHeader Component\n *\n * Displays business branding at the top of the chat window.\n * Styled to match Google Messages RCS appearance.\n */\n\nimport { memo } from \"react\";\nimport { useEmulator } from \"../../context/EmulatorContext\";\n\nexport const BusinessHeader = memo(function BusinessHeader() {\n const { theme, businessInfo, toggleProfile } = useEmulator();\n\n const isDark = theme === \"dark\";\n const brandColor = businessInfo.brandColor || \"#0084ff\";\n\n return (\n <header\n className={`\n flex items-center gap-3 px-3 py-2.5 border-b\n ${isDark ? \"bg-zinc-900 border-zinc-800\" : \"bg-white border-gray-100\"}\n `}\n role=\"banner\"\n aria-label={`Chat with ${businessInfo.name}`}\n >\n {/* Back button */}\n <button\n type=\"button\"\n className={`\n p-1.5 -ml-1 rounded-full transition-colors\n ${isDark ? \"hover:bg-zinc-800 text-white\" : \"hover:bg-gray-100 text-gray-700\"}\n `}\n aria-label=\"Go back\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n\n {/* Clickable Business Info Section */}\n <button\n onClick={toggleProfile}\n className=\"flex items-center gap-2.5 flex-1 min-w-0 text-left\"\n aria-label=\"View business info\"\n >\n {/* Logo */}\n <div\n className={`\n relative w-9 h-9 rounded-full overflow-hidden flex-shrink-0\n ${isDark ? \"bg-zinc-800\" : \"bg-gray-100\"}\n `}\n style={{\n backgroundColor: businessInfo.logo ? undefined : brandColor,\n }}\n >\n {businessInfo.logo ? (\n <img\n src={businessInfo.logo}\n alt={`${businessInfo.name} logo`}\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <div className=\"w-full h-full flex items-center justify-center text-sm font-bold text-white\">\n {businessInfo.name.charAt(0).toUpperCase()}\n </div>\n )}\n </div>\n\n {/* Business Name */}\n <h1\n className={`\n text-base font-medium truncate\n ${isDark ? \"text-white\" : \"text-gray-900\"}\n `}\n >\n {businessInfo.name}\n </h1>\n </button>\n\n {/* Action Buttons */}\n <div className=\"flex items-center gap-0.5\">\n {/* Verified badge button */}\n {businessInfo.verified && (\n <button\n type=\"button\"\n className={`\n p-2 rounded-full transition-colors\n ${isDark ? \"hover:bg-zinc-800\" : \"hover:bg-gray-100\"}\n `}\n aria-label=\"Verified business\"\n >\n <svg className=\"w-5 h-5\" viewBox=\"0 0 24 24\" fill=\"none\">\n {/* Shield outline */}\n <path\n d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\"\n stroke={isDark ? \"#9ca3af\" : \"#6b7280\"}\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n {/* Checkmark */}\n <path\n d=\"M9 12l2 2 4-4\"\n stroke=\"#3b82f6\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n\n {/* More options */}\n <button\n type=\"button\"\n className={`\n p-2 rounded-full transition-colors\n ${isDark ? \"hover:bg-zinc-800 text-zinc-400\" : \"hover:bg-gray-100 text-gray-500\"}\n `}\n aria-label=\"More options\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 5v.01M12 12v.01M12 19v.01M12 6a1 1 0 110-2 1 1 0 010 2zm0 7a1 1 0 110-2 1 1 0 010 2zm0 7a1 1 0 110-2 1 1 0 010 2z\" />\n </svg>\n </button>\n </div>\n </header>\n );\n});\n","/**\n * BrandedHero Component\n *\n * Displays the business branding at the top of the chat (logo, name, tagline).\n * This is the branded intro section shown before messages.\n */\n\nimport { memo } from \"react\";\nimport { useEmulator } from \"../../context/EmulatorContext\";\n\nexport const BrandedHero = memo(function BrandedHero() {\n const { theme, businessInfo } = useEmulator();\n\n const isDark = theme === \"dark\";\n const brandColor = businessInfo.brandColor || \"#0084ff\";\n\n return (\n <div className=\"flex flex-col items-center py-4 px-4\">\n {/* Logo with verified badge */}\n <div className=\"relative mb-3\">\n <div\n className={`\n w-16 h-16 rounded-full overflow-hidden\n ${isDark ? \"bg-zinc-800\" : \"bg-gray-100\"}\n shadow-lg\n `}\n style={{\n backgroundColor: businessInfo.logo ? undefined : brandColor,\n }}\n >\n {businessInfo.logo ? (\n <img\n src={businessInfo.logo}\n alt={`${businessInfo.name} logo`}\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <div className=\"w-full h-full flex items-center justify-center text-2xl font-bold text-white\">\n {businessInfo.name.charAt(0).toUpperCase()}\n </div>\n )}\n </div>\n \n {/* Verified badge */}\n {businessInfo.verified && (\n <div\n className=\"absolute -bottom-0.5 -right-0.5 w-5 h-5 rounded-full bg-blue-500 flex items-center justify-center border-2 border-white shadow-sm\"\n >\n <svg\n className=\"w-3 h-3 text-white\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n >\n <path d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41L9 16.17z\" />\n </svg>\n </div>\n )}\n </div>\n\n {/* Business name */}\n <h1\n className={`\n text-lg font-semibold text-center\n ${isDark ? \"text-white\" : \"text-gray-900\"}\n `}\n >\n {businessInfo.name}\n </h1>\n\n {/* Tagline/description */}\n {businessInfo.description && (\n <p\n className={`\n text-sm text-center mt-0.5\n ${isDark ? \"text-zinc-400\" : \"text-gray-500\"}\n `}\n >\n {businessInfo.description}\n </p>\n )}\n </div>\n );\n});\n\nexport default BrandedHero;\n\n","/**\n * TextMessage Component\n *\n * Renders a simple text message bubble.\n * Styled to match Google Messages RCS appearance.\n */\n\nimport { memo } from \"react\";\nimport { useEmulator } from \"../../context/EmulatorContext\";\n\ninterface TextMessageProps {\n text: string;\n sender: \"business\" | \"user\";\n timestamp: number;\n}\n\nexport const TextMessage = memo(function TextMessage({\n text,\n sender,\n timestamp,\n}: TextMessageProps) {\n const { theme, businessInfo } = useEmulator();\n\n const isDark = theme === \"dark\";\n const isBusiness = sender === \"business\";\n const brandColor = businessInfo.brandColor || \"#0084ff\";\n\n const formattedTime = new Date(timestamp).toLocaleTimeString([], {\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n\n if (isBusiness) {\n return (\n <div className=\"max-w-[90%]\">\n <div\n className={`\n px-4 py-3 rounded-2xl text-sm leading-relaxed\n ${isDark ? \"bg-zinc-800 text-white\" : \"bg-gray-100 text-gray-900\"}\n `}\n >\n {text}\n </div>\n <span className=\"sr-only\">{formattedTime}</span>\n </div>\n );\n }\n\n // User message with checkmark\n return (\n <div className=\"flex items-end gap-1.5 max-w-[85%] ml-auto\">\n <div\n className=\"px-4 py-2.5 rounded-full text-white text-sm leading-relaxed\"\n style={{ backgroundColor: brandColor }}\n >\n {text}\n </div>\n <div\n className=\"w-5 h-5 rounded-full flex items-center justify-center flex-shrink-0\"\n style={{ backgroundColor: brandColor }}\n >\n <svg\n className=\"w-3 h-3 text-white\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={3}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 13l4 4L19 7\" />\n </svg>\n </div>\n <span className=\"sr-only\">{formattedTime}</span>\n </div>\n );\n});\n","/**\n * UserReply Component\n *\n * Renders a user's reply message bubble with delivery status.\n * Styled to match Google Messages RCS appearance.\n */\n\nimport { memo } from \"react\";\nimport { useEmulator } from \"../../context/EmulatorContext\";\n\ninterface UserReplyProps {\n text: string;\n timestamp: number;\n}\n\nexport const UserReply = memo(function UserReply({\n text,\n timestamp,\n}: UserReplyProps) {\n const { businessInfo } = useEmulator();\n const brandColor = businessInfo.brandColor || \"#0084ff\";\n\n const formattedTime = new Date(timestamp).toLocaleTimeString([], {\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n\n return (\n <div className=\"flex items-end gap-1.5 max-w-[85%] ml-auto\">\n {/* Message bubble */}\n <div\n className=\"px-4 py-2.5 rounded-full text-white text-sm leading-relaxed shadow-sm\"\n style={{ backgroundColor: brandColor }}\n >\n {text}\n </div>\n\n {/* Delivery status checkmark */}\n <div\n className=\"w-5 h-5 rounded-full flex items-center justify-center flex-shrink-0\"\n style={{ backgroundColor: brandColor }}\n >\n <svg\n className=\"w-3 h-3 text-white\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={3}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n </div>\n\n {/* Timestamp - screen reader only */}\n <span className=\"sr-only\">{formattedTime}</span>\n </div>\n );\n});\n","/**\n * RichCard Component\n *\n * Renders a rich card with media, title, description, and suggestions.\n * Styled to match Google Messages RCS appearance.\n */\n\nimport { memo } from \"react\";\nimport { useEmulator } from \"../../context/EmulatorContext\";\nimport type { RichCardData } from \"../../types/emulator.types\";\nimport type { RbmSuggestion } from \"../../types/rbm.types\";\nimport { isSuggestedAction } from \"../../types/rbm.types\";\n\ninterface RichCardProps {\n card: RichCardData;\n timestamp: number;\n}\n\n/**\n * RichCard always shows its card-level suggestions.\n * Card suggestions are tied to the card content and persist.\n * (Unlike message-level chips which disappear after selection)\n */\nexport const RichCard = memo(function RichCard({\n card,\n timestamp,\n}: RichCardProps) {\n const { theme, handleReply, handleAction } = useEmulator();\n\n const isDark = theme === \"dark\";\n\n const formattedTime = new Date(timestamp).toLocaleTimeString([], {\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n\n const handleSuggestionClick = (suggestion: RbmSuggestion) => {\n if (\"reply\" in suggestion) {\n handleReply(suggestion);\n } else {\n handleAction(suggestion);\n }\n };\n\n // Height mappings for media\n const heightMap = {\n short: \"h-36\",\n medium: \"h-44\",\n tall: \"h-56\",\n };\n\n // Generate a lighter tint of brand color for card background\n const cardBgColor = isDark ? \"bg-zinc-800\" : `bg-[#e8f5e9]`; // Mint/teal like Google Messages\n\n return (\n <div className=\"w-full\">\n <div\n className={`\n overflow-hidden rounded-2xl w-full shadow-sm\n ${cardBgColor}\n `}\n >\n {/* Media - Full width with rounded top corners */}\n {card.media && (\n <div\n className={`\n w-full overflow-hidden\n ${heightMap[card.media.height]}\n `}\n >\n <img\n src={card.media.url}\n alt={card.title || \"Rich card media\"}\n className=\"w-full h-full object-cover\"\n loading=\"lazy\"\n />\n </div>\n )}\n\n {/* Content */}\n <div className=\"p-4\">\n {card.title && (\n <h3\n className={`\n text-base font-semibold leading-snug\n ${isDark ? \"text-white\" : \"text-gray-900\"}\n `}\n >\n {card.title}\n </h3>\n )}\n\n {card.description && (\n <p\n className={`\n text-sm leading-relaxed mt-1.5\n ${isDark ? \"text-zinc-300\" : \"text-gray-700\"}\n `}\n >\n {card.description}\n </p>\n )}\n\n {/* Card-level suggestions - Grouped list style */}\n {card.suggestions && card.suggestions.length > 0 && (\n <div\n className={`\n mt-4 rounded-xl overflow-hidden divide-y\n ${isDark ? \"divide-zinc-700 bg-zinc-800\" : \"divide-gray-100 bg-white\"}\n `}\n >\n {card.suggestions.map((suggestion, idx) => (\n <RichCardSuggestionItem\n key={idx}\n suggestion={suggestion}\n onClick={() => handleSuggestionClick(suggestion)}\n isDark={isDark}\n />\n ))}\n </div>\n )}\n </div>\n </div>\n\n {/* Timestamp - hidden for cleaner look, can be shown if needed */}\n <span className=\"sr-only\">{formattedTime}</span>\n </div>\n );\n});\n\n// Suggestion item for rich card (flat list style)\ninterface RichCardSuggestionItemProps {\n suggestion: RbmSuggestion;\n onClick: () => void;\n isDark: boolean;\n}\n\n// Icon color for all action types (gray/muted)\nconst ICON_CLASS = \"w-5 h-5 text-gray-400\";\n\n// Globe icon for URL actions\nconst GlobeIcon = () => (\n <svg className={ICON_CLASS} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9\" />\n </svg>\n);\n\n// Phone icon for dial actions\nconst PhoneIcon = () => (\n <svg className={ICON_CLASS} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3 5a2 2 0 012-2h3.28a1 1 0 01.948.684l1.498 4.493a1 1 0 01-.502 1.21l-2.257 1.13a11.042 11.042 0 005.516 5.516l1.13-2.257a1 1 0 011.21-.502l4.493 1.498a1 1 0 01.684.949V19a2 2 0 01-2 2h-1C9.716 21 3 14.284 3 6V5z\" />\n </svg>\n);\n\n// Map marker icon for location actions\nconst MapMarkerIcon = () => (\n <svg className={ICON_CLASS} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15 11a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n);\n\n// Calendar icon\nconst CalendarIcon = () => (\n <svg className={ICON_CLASS} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n);\n\n// Reply/chat icon for suggested replies\nconst ReplyIcon = () => (\n <svg className={ICON_CLASS} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z\" />\n </svg>\n);\n\nconst RichCardSuggestionItem = memo(function RichCardSuggestionItem({\n suggestion,\n onClick,\n isDark,\n}: RichCardSuggestionItemProps) {\n const isAction = isSuggestedAction(suggestion);\n const displayText = isAction\n ? suggestion.action.displayText\n : suggestion.reply.displayText;\n\n // Get icon for action type (all gray)\n const getActionIcon = () => {\n if (!isAction) return <ReplyIcon />;\n\n const { action } = suggestion;\n\n if (action.urlAction || action.openUrlAction) return <GlobeIcon />;\n if (action.dialerAction || action.dialAction) return <PhoneIcon />;\n if (action.mapAction || action.viewLocationAction) return <MapMarkerIcon />;\n if (action.calendarAction || action.createCalendarEventAction) return <CalendarIcon />;\n\n return <ReplyIcon />;\n };\n\n return (\n <button\n onClick={onClick}\n className={`\n w-full flex items-center gap-3 px-4 py-3 text-left transition-colors\n ${isDark ? \"hover:bg-zinc-700\" : \"hover:bg-gray-50\"}\n `}\n >\n <span className=\"flex-shrink-0\">{getActionIcon()}</span>\n <span className={`text-sm ${isDark ? \"text-white\" : \"text-gray-900\"}`}>\n {displayText}\n </span>\n </button>\n );\n});\n","/**\n * Carousel Component\n *\n * Renders a horizontally scrollable carousel of rich cards.\n * Styled to match Google Messages RCS appearance.\n */\n\nimport { memo, useRef, useState, useCallback } from \"react\";\nimport { useEmulator } from \"../../context/EmulatorContext\";\nimport type { RichCardData } from \"../../types/emulator.types\";\nimport type { RbmSuggestion } from \"../../types/rbm.types\";\nimport { isSuggestedAction } from \"../../types/rbm.types\";\n\ninterface CarouselProps {\n cards: RichCardData[];\n timestamp: number;\n}\n\nexport const Carousel = memo(function Carousel({ cards, timestamp }: CarouselProps) {\n const { theme, handleReply, handleAction } = useEmulator();\n const scrollRef = useRef<HTMLDivElement>(null);\n const [canScrollLeft, setCanScrollLeft] = useState(false);\n const [canScrollRight, setCanScrollRight] = useState(cards.length > 1);\n\n const isDark = theme === \"dark\";\n\n const formattedTime = new Date(timestamp).toLocaleTimeString([], {\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n\n const handleSuggestionClick = (suggestion: RbmSuggestion) => {\n if (\"reply\" in suggestion) {\n handleReply(suggestion);\n } else {\n handleAction(suggestion);\n }\n };\n\n const updateScrollButtons = useCallback(() => {\n if (scrollRef.current) {\n const { scrollLeft, scrollWidth, clientWidth } = scrollRef.current;\n setCanScrollLeft(scrollLeft > 0);\n setCanScrollRight(scrollLeft < scrollWidth - clientWidth - 10);\n }\n }, []);\n\n const scroll = (direction: \"left\" | \"right\") => {\n if (scrollRef.current) {\n const scrollAmount = 200;\n scrollRef.current.scrollBy({\n left: direction === \"left\" ? -scrollAmount : scrollAmount,\n behavior: \"smooth\",\n });\n }\n };\n\n return (\n <div className=\"w-full -mx-3\">\n {/* Carousel Container */}\n <div className=\"relative\">\n {/* Left Arrow */}\n {canScrollLeft && (\n <button\n onClick={() => scroll(\"left\")}\n className={`\n absolute left-2 top-1/2 -translate-y-1/2 z-10\n w-8 h-8 rounded-full flex items-center justify-center\n shadow-lg transition-opacity\n ${isDark ? \"bg-zinc-700 text-white\" : \"bg-white text-gray-700\"}\n `}\n aria-label=\"Scroll left\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n )}\n\n {/* Cards Container */}\n <div\n ref={scrollRef}\n onScroll={updateScrollButtons}\n className=\"flex gap-2.5 overflow-x-auto py-1 px-3 snap-x snap-mandatory\"\n style={{ scrollbarWidth: \"none\", msOverflowStyle: \"none\" }}\n >\n {cards.map((card, idx) => (\n <CarouselCard\n key={idx}\n card={card}\n isDark={isDark}\n onSuggestionClick={handleSuggestionClick}\n />\n ))}\n </div>\n\n {/* Right Arrow */}\n {canScrollRight && (\n <button\n onClick={() => scroll(\"right\")}\n className={`\n absolute right-2 top-1/2 -translate-y-1/2 z-10\n w-8 h-8 rounded-full flex items-center justify-center\n shadow-lg transition-opacity\n ${isDark ? \"bg-zinc-700 text-white\" : \"bg-white text-gray-700\"}\n `}\n aria-label=\"Scroll right\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n )}\n </div>\n\n {/* Timestamp - screen reader only */}\n <span className=\"sr-only\">{formattedTime}</span>\n </div>\n );\n});\n\n// Individual carousel card\ninterface CarouselCardProps {\n card: RichCardData;\n isDark: boolean;\n onSuggestionClick: (suggestion: RbmSuggestion) => void;\n}\n\n// Gray icon class for carousel actions\nconst CAROUSEL_ICON_CLASS = \"w-4 h-4 text-gray-400\";\n\n// Get icon for carousel card action (all gray)\nconst getCarouselActionIcon = (suggestion: RbmSuggestion) => {\n if (!isSuggestedAction(suggestion)) {\n return (\n <svg className={CAROUSEL_ICON_CLASS} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z\" />\n </svg>\n );\n }\n\n const { action } = suggestion;\n\n // URL actions\n if (action.urlAction || action.openUrlAction) {\n return (\n <svg className={CAROUSEL_ICON_CLASS} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9\" />\n </svg>\n );\n }\n\n // Phone actions\n if (action.dialerAction || action.dialAction) {\n return (\n <svg className={CAROUSEL_ICON_CLASS} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3 5a2 2 0 012-2h3.28a1 1 0 01.948.684l1.498 4.493a1 1 0 01-.502 1.21l-2.257 1.13a11.042 11.042 0 005.516 5.516l1.13-2.257a1 1 0 011.21-.502l4.493 1.498a1 1 0 01.684.949V19a2 2 0 01-2 2h-1C9.716 21 3 14.284 3 6V5z\" />\n </svg>\n );\n }\n\n // Map actions\n if (action.mapAction || action.viewLocationAction) {\n return (\n <svg className={CAROUSEL_ICON_CLASS} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15 11a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n );\n }\n\n // Calendar\n if (action.calendarAction || action.createCalendarEventAction) {\n return (\n <svg className={CAROUSEL_ICON_CLASS} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n );\n }\n\n return (\n <svg className={CAROUSEL_ICON_CLASS} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z\" />\n </svg>\n );\n};\n\nconst CarouselCard = memo(function CarouselCard({\n card,\n isDark,\n onSuggestionClick,\n}: CarouselCardProps) {\n const widthClass = card.layout.width === \"small\" ? \"w-44\" : \"w-52\";\n\n return (\n <div\n className={`\n flex-shrink-0 snap-start rounded-2xl overflow-hidden shadow-sm\n ${widthClass}\n ${isDark ? \"bg-zinc-800\" : \"bg-[#e8f5e9]\"}\n `}\n >\n {/* Media */}\n {card.media && (\n <div className=\"w-full h-32 bg-gray-200 overflow-hidden\">\n <img\n src={card.media.url}\n alt={card.title || \"Carousel card media\"}\n className=\"w-full h-full object-cover\"\n loading=\"lazy\"\n />\n </div>\n )}\n\n {/* Content */}\n <div className=\"p-3\">\n {card.title && (\n <h4\n className={`\n text-sm font-semibold leading-tight mb-1 line-clamp-2\n ${isDark ? \"text-white\" : \"text-gray-900\"}\n `}\n >\n {card.title}\n </h4>\n )}\n\n {card.description && (\n <p\n className={`\n text-xs leading-relaxed line-clamp-3\n ${isDark ? \"text-zinc-400\" : \"text-gray-700\"}\n `}\n >\n {card.description}\n </p>\n )}\n\n {/* Suggestions - flat list style */}\n {card.suggestions && card.suggestions.length > 0 && (\n <div\n className={`\n mt-3 rounded-lg overflow-hidden divide-y\n ${isDark ? \"divide-zinc-600 bg-zinc-700\" : \"divide-gray-100 bg-white\"}\n `}\n >\n {card.suggestions.map((suggestion, idx) => {\n const isAction = isSuggestedAction(suggestion);\n const displayText = isAction\n ? suggestion.action.displayText\n : suggestion.reply.displayText;\n\n return (\n <button\n key={idx}\n onClick={() => onSuggestionClick(suggestion)}\n className={`\n w-full flex items-center gap-2 px-3 py-2.5\n text-xs transition-colors text-left\n ${isDark ? \"hover:bg-zinc-600 text-white\" : \"hover:bg-gray-50 text-gray-900\"}\n `}\n >\n <span className=\"flex-shrink-0\">{getCarouselActionIcon(suggestion)}</span>\n <span className=\"truncate\">{displayText}</span>\n </button>\n );\n })}\n </div>\n )}\n </div>\n </div>\n );\n});\n","/**\n * MessageRenderer Component\n * \n * Factory component that renders the appropriate message type\n * based on content using a registry pattern.\n */\n\nimport { memo, type ComponentType } from 'react';\nimport type { ChatMessage, MessageContent } from '../../types/emulator.types';\nimport { TextMessage } from './TextMessage';\nimport { UserReply } from './UserReply';\nimport { RichCard } from './RichCard';\nimport { Carousel } from './Carousel';\n\ninterface MessageRendererProps {\n message: ChatMessage;\n isLast: boolean;\n}\n\n// Type for renderer component props\ntype RendererProps = {\n content: MessageContent;\n sender: 'business' | 'user';\n timestamp: number;\n showSuggestions: boolean;\n};\n\n// Registry of content type to renderer\nconst renderers: Record<\n MessageContent['type'],\n ComponentType<RendererProps>\n> = {\n text: ({ content, sender, timestamp }) => {\n if (content.type !== 'text') return null;\n return <TextMessage text={content.text} sender={sender} timestamp={timestamp} />;\n },\n userReply: ({ content, timestamp }) => {\n if (content.type !== 'userReply') return null;\n return <UserReply text={content.text} timestamp={timestamp} />;\n },\n richcard: ({ content, timestamp }) => {\n if (content.type !== 'richcard') return null;\n // Card-level suggestions always show on the card itself\n return <RichCard card={content.card} timestamp={timestamp} />;\n },\n carousel: ({ content, timestamp }) => {\n if (content.type !== 'carousel') return null;\n return <Carousel cards={content.cards} timestamp={timestamp} />;\n },\n};\n\nexport const MessageRenderer = memo(function MessageRenderer({\n message,\n isLast,\n}: MessageRendererProps) {\n const { content, sender, timestamp } = message;\n \n const Renderer = renderers[content.type];\n \n if (!Renderer) {\n // Fallback for unknown message types\n console.warn(`Unknown message type: ${content.type}`);\n return (\n <div className=\"px-4 py-2 text-gray-500 text-sm italic\">\n [Unsupported message type]\n </div>\n );\n }\n\n return (\n <Renderer\n content={content}\n sender={sender}\n timestamp={timestamp}\n showSuggestions={isLast && sender === 'business'}\n />\n );\n});\n\n// Export individual renderers for testing\nexport { TextMessage, UserReply, RichCard, Carousel };\n\n","/**\n * TypingIndicator Component\n * \n * Shows animated dots to indicate the business is typing.\n */\n\nimport { memo } from 'react';\nimport { useEmulator } from '../../context/EmulatorContext';\n\nexport const TypingIndicator = memo(function TypingIndicator() {\n const { theme } = useEmulator();\n\n const isDark = theme === 'dark';\n\n return (\n <div\n className=\"flex items-start gap-2 px-4 py-2\"\n role=\"status\"\n aria-label=\"Business is typing\"\n >\n <div\n className={`\n inline-flex items-center gap-1 px-4 py-3 rounded-2xl rounded-bl-sm\n ${isDark ? 'bg-zinc-800' : 'bg-gray-100'}\n `}\n >\n <span\n className={`\n rcs-typing-dot w-2 h-2 rounded-full\n ${isDark ? 'bg-zinc-500' : 'bg-gray-400'}\n `}\n />\n <span\n className={`\n rcs-typing-dot w-2 h-2 rounded-full\n ${isDark ? 'bg-zinc-500' : 'bg-gray-400'}\n `}\n />\n <span\n className={`\n rcs-typing-dot w-2 h-2 rounded-full\n ${isDark ? 'bg-zinc-500' : 'bg-gray-400'}\n `}\n />\n </div>\n </div>\n );\n});\n\n","/**\n * MessageList Component\n *\n * Renders the list of chat messages with date dividers.\n * Styled to match Google Messages RCS appearance.\n */\n\nimport { memo } from \"react\";\nimport { useEmulator } from \"../../context/EmulatorContext\";\nimport { MessageRenderer } from \"../Message\";\nimport { TypingIndicator } from \"../TypingIndicator\";\n\nexport const MessageList = memo(function MessageList() {\n const { theme, state } = useEmulator();\n const { chatHistory, isTyping } = state;\n\n const isDark = theme === \"dark\";\n\n return (\n <div\n className=\"px-3 pb-3 space-y-3\"\n role=\"log\"\n aria-label=\"Chat messages\"\n aria-live=\"polite\"\n >\n {/* Date divider - always show \"Today\" for demo */}\n {chatHistory.length > 0 && (\n <div className=\"flex justify-center py-2\">\n <span\n className={`\n text-xs font-medium px-3 py-1\n ${isDark ? \"text-zinc-500\" : \"text-gray-500\"}\n `}\n >\n Today\n </span>\n </div>\n )}\n\n {/* Messages Container - Chat bubble style */}\n <div\n className={`\n rounded-3xl overflow-hidden\n ${isDark ? \"bg-zinc-900\" : \"bg-gray-50\"}\n `}\n >\n {/* Empty state */}\n {chatHistory.length === 0 && !isTyping && (\n <div className=\"flex items-center justify-center py-12\">\n <p className={`text-sm ${isDark ? \"text-zinc-500\" : \"text-gray-400\"}`}>\n No messages yet\n </p>\n </div>\n )}\n\n {/* Messages */}\n <div className=\"p-3 space-y-3\">\n {chatHistory.map((message, idx) => (\n <div\n key={message.id}\n className={`\n ${message.sender === \"user\" ? \"flex justify-end\" : \"flex justify-start\"}\n `}\n >\n <MessageRenderer\n message={message}\n isLast={idx === chatHistory.length - 1 && !isTyping}\n />\n </div>\n ))}\n\n {/* Typing indicator */}\n {isTyping && <TypingIndicator />}\n </div>\n </div>\n </div>\n );\n});\n","/**\n * SuggestionChip Component\n *\n * Renders a single suggestion chip (reply or action).\n * Styled to match Google Messages RCS appearance.\n */\n\nimport { memo } from \"react\";\nimport { useEmulator } from \"../../context/EmulatorContext\";\nimport type { RbmSuggestion } from \"../../types/rbm.types\";\nimport { isSuggestedAction } from \"../../types/rbm.types\";\n\ninterface SuggestionChipProps {\n suggestion: RbmSuggestion;\n onClick: () => void;\n variant?: \"bar\" | \"card\" | \"carousel\";\n}\n\nexport const SuggestionChip = memo(function SuggestionChip({\n suggestion,\n onClick,\n variant = \"bar\",\n}: SuggestionChipProps) {\n const { theme, businessInfo } = useEmulator();\n\n const isDark = theme === \"dark\";\n const isAction = isSuggestedAction(suggestion);\n\n const displayText = isAction\n ? suggestion.action.displayText\n : suggestion.reply.displayText;\n\n // Get action icon\n const ActionIcon = isAction ? getActionIcon(suggestion) : null;\n const brandColor = businessInfo.brandColor || \"#0084ff\";\n\n // Bar variant - pill shaped chips at bottom\n if (variant === \"bar\") {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={`\n inline-flex items-center gap-2 px-4 py-2 rounded-full text-sm font-medium\n whitespace-nowrap transition-colors flex-shrink-0\n border\n ${isDark\n ? \"bg-zinc-800 border-zinc-700 hover:bg-zinc-700 text-white\"\n : \"bg-white border-gray-300 hover:bg-gray-50 text-gray-900\"\n }\n `}\n aria-label={isAction ? `${getActionLabel(suggestion)}: ${displayText}` : displayText}\n >\n {ActionIcon && (\n <span style={{ color: brandColor }}>\n <ActionIcon className=\"w-4 h-4\" />\n </span>\n )}\n <span>{displayText}</span>\n </button>\n );\n }\n\n // Card variant - used inside rich cards (not used anymore, keeping for compatibility)\n if (variant === \"card\") {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={`\n w-full flex items-center gap-3 px-3 py-2.5 text-left transition-colors rounded-lg\n ${isDark ? \"hover:bg-zinc-700\" : \"hover:bg-gray-100\"}\n `}\n >\n {ActionIcon && (\n <div\n className=\"w-8 h-8 rounded-full flex items-center justify-center flex-shrink-0\"\n style={{ backgroundColor: `${brandColor}15` }}\n >\n <ActionIcon className=\"w-4 h-4\" style={{ color: brandColor }} />\n </div>\n )}\n <span\n className={`text-sm font-medium ${isDark ? \"text-white\" : \"text-gray-900\"}`}\n >\n {displayText}\n </span>\n </button>\n );\n }\n\n // Carousel variant - compact for carousel cards\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={`\n w-full px-3 py-2 rounded-lg text-xs font-medium text-center\n border transition-colors\n ${isDark\n ? \"border-zinc-600 hover:bg-zinc-700 text-white\"\n : \"border-gray-300 hover:bg-gray-50 text-gray-900\"\n }\n `}\n >\n {displayText}\n </button>\n );\n});\n\n// Icon component type\ntype IconComponent = React.FC<{ className?: string; style?: React.CSSProperties }>;\n\n// Get icon component based on action type\nfunction getActionIcon(suggestion: RbmSuggestion): IconComponent | null {\n if (!isSuggestedAction(suggestion)) return null;\n\n const { action } = suggestion;\n\n if (action.openUrlAction) {\n return ({ className, style }) => (\n <svg className={className} style={style} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9\" />\n </svg>\n );\n }\n\n if (action.dialAction) {\n return ({ className, style }) => (\n <svg className={className} style={style} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3 5a2 2 0 012-2h3.28a1 1 0 01.948.684l1.498 4.493a1 1 0 01-.502 1.21l-2.257 1.13a11.042 11.042 0 005.516 5.516l1.13-2.257a1 1 0 011.21-.502l4.493 1.498a1 1 0 01.684.949V19a2 2 0 01-2 2h-1C9.716 21 3 14.284 3 6V5z\" />\n </svg>\n );\n }\n\n if (action.shareLocationAction) {\n return ({ className, style }) => (\n <svg className={className} style={style} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15 11a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n );\n }\n\n if (action.viewLocationAction) {\n return ({ className, style }) => (\n <svg className={className} style={style} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15 11a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n );\n }\n\n if (action.createCalendarEventAction) {\n return ({ className, style }) => (\n <svg className={className} style={style} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n );\n }\n\n return null;\n}\n\n// Get accessibility label for action type\nfunction getActionLabel(suggestion: RbmSuggestion): string {\n if (!isSuggestedAction(suggestion)) return \"Reply\";\n\n const { action } = suggestion;\n\n if (action.openUrlAction) return \"Open link\";\n if (action.dialAction) return \"Call\";\n if (action.shareLocationAction) return \"Share location\";\n if (action.viewLocationAction) return \"View location\";\n if (action.createCalendarEventAction) return \"Add to calendar\";\n\n return \"Action\";\n}\n","/**\n * SuggestionsBar Component\n *\n * Renders a horizontal scrollable list of suggestion chips.\n * Styled to match Google Messages RCS appearance.\n */\n\nimport { memo } from \"react\";\nimport { useEmulator } from \"../../context/EmulatorContext\";\nimport type { RbmSuggestion } from \"../../types/rbm.types\";\nimport { isSuggestedReply, isSuggestedAction } from \"../../types/rbm.types\";\nimport { SuggestionChip } from \"./SuggestionChip\";\n\ninterface SuggestionsBarProps {\n suggestions: RbmSuggestion[];\n}\n\nexport const SuggestionsBar = memo(function SuggestionsBar({\n suggestions,\n}: SuggestionsBarProps) {\n const { theme, handleReply, handleAction } = useEmulator();\n\n const isDark = theme === \"dark\";\n\n if (!suggestions || suggestions.length === 0) {\n return null;\n }\n\n const handleClick = (suggestion: RbmSuggestion) => {\n if (isSuggestedReply(suggestion)) {\n handleReply(suggestion);\n } else if (isSuggestedAction(suggestion)) {\n handleAction(suggestion);\n }\n };\n\n return (\n <div\n className={`\n px-3 py-2\n ${isDark ? \"bg-zinc-900\" : \"bg-white\"}\n `}\n role=\"group\"\n aria-label=\"Quick replies\"\n >\n <div\n className=\"flex gap-2 overflow-x-auto pb-1 -mx-1 px-1\"\n style={{ scrollbarWidth: \"none\", msOverflowStyle: \"none\" }}\n >\n {suggestions.map((suggestion, idx) => (\n <SuggestionChip\n key={idx}\n suggestion={suggestion}\n onClick={() => handleClick(suggestion)}\n variant=\"bar\"\n />\n ))}\n </div>\n </div>\n );\n});\n","/**\n * ChatWindow Component\n *\n * Main container for the chat UI, combining header, messages, and suggestions.\n * Styled to match Google Messages RCS appearance.\n */\n\nimport { memo } from \"react\";\nimport { useEmulator } from \"../../context/EmulatorContext\";\nimport { useAutoScroll } from \"../../hooks/useAutoScroll\";\nimport { BusinessHeader } from \"../BusinessHeader\";\nimport { BrandedHero } from \"../BrandedHero\";\nimport { MessageList } from \"../MessageList\";\nimport { SuggestionsBar } from \"../Suggestions\";\n\nexport const ChatWindow = memo(function ChatWindow() {\n const { theme, state, showSuggestions } = useEmulator();\n const { chatHistory, isTyping, error } = state;\n\n // Auto-scroll when messages change or typing indicator appears\n const scrollRef = useAutoScroll<HTMLDivElement>([\n chatHistory.length,\n isTyping,\n ]);\n\n const isDark = theme === \"dark\";\n\n // Get suggestions from the last business message (only if showSuggestions is enabled)\n const lastMessage = chatHistory[chatHistory.length - 1];\n const suggestions =\n showSuggestions && lastMessage?.sender === \"business\" && !isTyping\n ? lastMessage.suggestions\n : undefined;\n\n return (\n <div\n className={`\n flex flex-col h-full w-full overflow-hidden\n ${isDark ? \"bg-zinc-950\" : \"bg-white\"}\n `}\n >\n {/* Header */}\n <BusinessHeader />\n\n {/* Error State */}\n {error && (\n <div\n className=\"px-4 py-2 bg-red-500/10 border-b border-red-500/20\"\n role=\"alert\"\n >\n <p className=\"text-sm text-red-500\">{error}</p>\n </div>\n )}\n\n {/* Scrollable Content Area */}\n <div ref={scrollRef} className=\"flex-1 overflow-y-auto rcs-scrollbar\">\n {/* Branded Hero Section */}\n <BrandedHero />\n\n {/* Message List */}\n <MessageList />\n </div>\n\n {/* Suggestions Bar */}\n {suggestions && suggestions.length > 0 && (\n <SuggestionsBar suggestions={suggestions} />\n )}\n\n {/* RCS Input Area - Google Messages style */}\n <div\n className={`\n px-3 py-2 flex items-center gap-2\n ${isDark ? \"bg-zinc-900\" : \"bg-white\"}\n `}\n >\n {/* Add/Plus button */}\n <button\n type=\"button\"\n className={`\n w-9 h-9 flex items-center justify-center rounded-full flex-shrink-0\n border transition-colors\n ${\n isDark\n ? \"border-zinc-700 text-zinc-400 hover:bg-zinc-800\"\n : \"border-gray-300 text-gray-500 hover:bg-gray-100\"\n }\n `}\n aria-label=\"Add attachment\"\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 4v16m8-8H4\"\n />\n </svg>\n </button>\n\n {/* Message input container */}\n <div\n className={`\n flex-1 flex items-center gap-2 px-4 py-2 rounded-full\n ${isDark ? \"bg-zinc-800\" : \"bg-gray-100\"}\n `}\n >\n <span\n className={`flex-1 text-sm ${\n isDark ? \"text-zinc-500\" : \"text-gray-400\"\n }`}\n >\n RCS message\n </span>\n\n {/* Emoji button */}\n <button\n type=\"button\"\n className={`p-1 ${isDark ? \"text-zinc-500\" : \"text-gray-400\"}`}\n aria-label=\"Emoji\"\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M14.828 14.828a4 4 0 01-5.656 0M9 10h.01M15 10h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n </button>\n\n {/* Image/Gallery button */}\n <button\n type=\"button\"\n className={`p-1 ${isDark ? \"text-zinc-500\" : \"text-gray-400\"}`}\n aria-label=\"Attach image\"\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\"\n />\n </svg>\n </button>\n </div>\n\n {/* Voice/Record button */}\n <button\n type=\"button\"\n className=\"w-10 h-10 flex items-center justify-center rounded-full bg-green-100 text-green-600 flex-shrink-0\"\n aria-label=\"Voice message\"\n >\n <svg className=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M12 14c1.66 0 3-1.34 3-3V5c0-1.66-1.34-3-3-3S9 3.34 9 5v6c0 1.66 1.34 3 3 3zm-1 1.93c-3.94-.49-7-3.85-7-7.93h2c0 3.31 2.69 6 6 6s6-2.69 6-6h2c0 4.08-3.06 7.44-7 7.93V20h4v2H8v-2h4v-4.07z\" />\n </svg>\n </button>\n </div>\n </div>\n );\n});\n","/**\n * BusinessProfile Component\n *\n * Full-screen overlay showing business information, branding, and contact details.\n * Based on RCS Business Messaging agent profile UI.\n */\n\nimport { memo, useState } from \"react\";\nimport { useEmulator } from \"../../context/EmulatorContext\";\n\ntype TabType = \"info\" | \"options\";\n\nexport const BusinessProfile = memo(function BusinessProfile() {\n const { theme, businessInfo, toggleProfile } = useEmulator();\n const [activeTab, setActiveTab] = useState<TabType>(\"info\");\n\n const isDark = theme === \"dark\";\n\n // Default banner if none provided\n const bannerUrl =\n businessInfo.bannerImage ||\n \"https://images.unsplash.com/photo-1436491865332-7a61a109cc05?w=800&q=80\";\n\n const brandColor = businessInfo.brandColor || \"#0084ff\";\n\n return (\n <div\n className={`\n absolute inset-0 z-50 flex flex-col\n ${isDark ? \"bg-zinc-950\" : \"bg-white\"}\n `}\n >\n {/* Header */}\n <header\n className={`\n flex items-center gap-3 px-4 py-3 border-b\n ${isDark ? \"bg-zinc-900 border-zinc-800\" : \"bg-white border-gray-200\"}\n `}\n >\n <button\n onClick={toggleProfile}\n className={`\n p-1.5 -ml-1.5 rounded-full transition-colors\n ${isDark ? \"hover:bg-zinc-800 text-white\" : \"hover:bg-gray-100 text-gray-900\"}\n `}\n aria-label=\"Go back\"\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 19l-7-7 7-7\"\n />\n </svg>\n </button>\n <span\n className={`text-base font-medium ${isDark ? \"text-white\" : \"text-gray-900\"}`}\n >\n Info & options\n </span>\n </header>\n\n {/* Scrollable Content */}\n <div className=\"flex-1 overflow-y-auto\">\n {/* Banner Image */}\n <div className=\"relative h-40 bg-gray-200\">\n <img\n src={bannerUrl}\n alt=\"Business banner\"\n className=\"w-full h-full object-cover\"\n />\n </div>\n\n {/* Logo - overlapping banner */}\n <div className=\"relative px-4\">\n <div\n className={`\n absolute -top-10 left-1/2 -translate-x-1/2\n w-20 h-20 rounded-full overflow-hidden border-4\n ${isDark ? \"border-zinc-950 bg-zinc-800\" : \"border-white bg-gray-100\"}\n shadow-lg\n `}\n >\n {businessInfo.logo ? (\n <img\n src={businessInfo.logo}\n alt={`${businessInfo.name} logo`}\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <div\n className=\"w-full h-full flex items-center justify-center text-2xl font-bold text-white\"\n style={{ backgroundColor: brandColor }}\n >\n {businessInfo.name.charAt(0).toUpperCase()}\n </div>\n )}\n </div>\n </div>\n\n {/* Business Name & Description */}\n <div className=\"pt-12 pb-4 px-4 text-center\">\n <h1\n className={`text-xl font-semibold ${isDark ? \"text-white\" : \"text-gray-900\"}`}\n >\n {businessInfo.name}\n </h1>\n {businessInfo.description && (\n <p className={`text-sm mt-1 ${isDark ? \"text-zinc-400\" : \"text-gray-500\"}`}>\n {businessInfo.description}\n </p>\n )}\n </div>\n\n {/* Quick Actions */}\n <div className=\"flex justify-center gap-4 px-4 pb-4\">\n {businessInfo.phoneNumbers && businessInfo.phoneNumbers.length > 0 && (\n <QuickActionButton\n icon=\"phone\"\n label=\"Call\"\n isDark={isDark}\n brandColor={brandColor}\n onClick={() => {\n const phone = businessInfo.phoneNumbers?.[0]?.number;\n if (phone) window.location.href = `tel:${phone}`;\n }}\n />\n )}\n {businessInfo.websites && businessInfo.websites.length > 0 && (\n <QuickActionButton\n icon=\"globe\"\n label=\"Website\"\n isDark={isDark}\n brandColor={brandColor}\n onClick={() => {\n const url = businessInfo.websites?.[0]?.url;\n if (url) window.open(url, \"_blank\", \"noopener,noreferrer\");\n }}\n />\n )}\n {businessInfo.emails && businessInfo.emails.length > 0 && (\n <QuickActionButton\n icon=\"mail\"\n label=\"Contact\"\n isDark={isDark}\n brandColor={brandColor}\n onClick={() => {\n const email = businessInfo.emails?.[0]?.email;\n if (email) window.location.href = `mailto:${email}`;\n }}\n />\n )}\n </div>\n\n {/* Tabs */}\n <div\n className={`\n flex mx-4 rounded-lg overflow-hidden border\n ${isDark ? \"border-zinc-700 bg-zinc-800\" : \"border-gray-200 bg-gray-100\"}\n `}\n >\n <TabButton\n active={activeTab === \"info\"}\n onClick={() => setActiveTab(\"info\")}\n isDark={isDark}\n brandColor={brandColor}\n >\n Info\n </TabButton>\n <TabButton\n active={activeTab === \"options\"}\n onClick={() => setActiveTab(\"options\")}\n isDark={isDark}\n brandColor={brandColor}\n >\n Options\n </TabButton>\n </div>\n\n {/* Tab Content */}\n <div className=\"p-4\">\n {activeTab === \"info\" ? (\n <InfoTab isDark={isDark} brandColor={brandColor} />\n ) : (\n <OptionsTab isDark={isDark} />\n )}\n </div>\n </div>\n </div>\n );\n});\n\n// Quick Action Button Component\ninterface QuickActionButtonProps {\n icon: \"phone\" | \"globe\" | \"mail\";\n label: string;\n isDark: boolean;\n brandColor: string;\n onClick: () => void;\n}\n\nconst QuickActionButton = memo(function QuickActionButton({\n icon,\n label,\n isDark,\n brandColor,\n onClick,\n}: QuickActionButtonProps) {\n const icons = {\n phone: (\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M3 5a2 2 0 012-2h3.28a1 1 0 01.948.684l1.498 4.493a1 1 0 01-.502 1.21l-2.257 1.13a11.042 11.042 0 005.516 5.516l1.13-2.257a1 1 0 011.21-.502l4.493 1.498a1 1 0 01.684.949V19a2 2 0 01-2 2h-1C9.716 21 3 14.284 3 6V5z\"\n />\n ),\n globe: (\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9\"\n />\n ),\n mail: (\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z\"\n />\n ),\n };\n\n return (\n <button\n onClick={onClick}\n className={`\n flex flex-col items-center gap-2 px-6 py-3 rounded-xl border transition-colors\n ${isDark\n ? \"bg-zinc-800 border-zinc-700 hover:bg-zinc-700\"\n : \"bg-white border-gray-200 hover:bg-gray-50\"\n }\n `}\n >\n <svg\n className=\"w-6 h-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke={brandColor}\n >\n {icons[icon]}\n </svg>\n <span\n className={`text-xs font-medium ${isDark ? \"text-zinc-300\" : \"text-gray-600\"}`}\n >\n {label}\n </span>\n </button>\n );\n});\n\n// Tab Button Component\ninterface TabButtonProps {\n active: boolean;\n onClick: () => void;\n isDark: boolean;\n brandColor: string;\n children: React.ReactNode;\n}\n\nconst TabButton = memo(function TabButton({\n active,\n onClick,\n isDark,\n brandColor,\n children,\n}: TabButtonProps) {\n return (\n <button\n onClick={onClick}\n className={`\n flex-1 py-2.5 text-sm font-medium transition-colors rounded-lg\n ${active\n ? \"text-white\"\n : isDark\n ? \"text-zinc-400 hover:text-zinc-200\"\n : \"text-gray-500 hover:text-gray-700\"\n }\n `}\n style={active ? { backgroundColor: brandColor } : undefined}\n >\n {children}\n </button>\n );\n});\n\n// Info Tab Component\ninterface InfoTabProps {\n isDark: boolean;\n brandColor: string;\n}\n\nconst InfoTab = memo(function InfoTab({ isDark, brandColor }: InfoTabProps) {\n const { businessInfo } = useEmulator();\n\n const hasContactInfo =\n (businessInfo.phoneNumbers && businessInfo.phoneNumbers.length > 0) ||\n (businessInfo.websites && businessInfo.websites.length > 0) ||\n (businessInfo.emails && businessInfo.emails.length > 0);\n\n if (!hasContactInfo) {\n return (\n <div\n className={`text-center py-8 ${isDark ? \"text-zinc-500\" : \"text-gray-400\"}`}\n >\n No contact information available\n </div>\n );\n }\n\n return (\n <div\n className={`\n rounded-xl overflow-hidden border divide-y\n ${isDark\n ? \"bg-zinc-900 border-zinc-800 divide-zinc-800\"\n : \"bg-gray-50 border-gray-200 divide-gray-200\"\n }\n `}\n >\n {/* Phone Numbers */}\n {businessInfo.phoneNumbers?.map((phone, idx) => (\n <ContactItem\n key={`phone-${idx}`}\n icon=\"phone\"\n primary={phone.number}\n secondary={phone.label}\n isDark={isDark}\n brandColor={brandColor}\n onClick={() => (window.location.href = `tel:${phone.number}`)}\n />\n ))}\n\n {/* Websites */}\n {businessInfo.websites?.map((website, idx) => (\n <ContactItem\n key={`web-${idx}`}\n icon=\"globe\"\n primary={website.url.replace(/^https?:\\/\\//, \"\")}\n secondary={website.label || \"Website\"}\n isDark={isDark}\n brandColor={brandColor}\n onClick={() => window.open(website.url, \"_blank\", \"noopener,noreferrer\")}\n />\n ))}\n\n {/* Emails */}\n {businessInfo.emails?.map((email, idx) => (\n <ContactItem\n key={`email-${idx}`}\n icon=\"mail\"\n primary={email.email}\n secondary={email.label || \"Email\"}\n isDark={isDark}\n brandColor={brandColor}\n onClick={() => (window.location.href = `mailto:${email.email}`)}\n />\n ))}\n </div>\n );\n});\n\n// Contact Item Component\ninterface ContactItemProps {\n icon: \"phone\" | \"globe\" | \"mail\";\n primary: string;\n secondary?: string;\n isDark: boolean;\n brandColor: string;\n onClick: () => void;\n}\n\nconst ContactItem = memo(function ContactItem({\n icon,\n primary,\n secondary,\n isDark,\n onClick,\n}: ContactItemProps) {\n const iconPaths = {\n phone: \"M3 5a2 2 0 012-2h3.28a1 1 0 01.948.684l1.498 4.493a1 1 0 01-.502 1.21l-2.257 1.13a11.042 11.042 0 005.516 5.516l1.13-2.257a1 1 0 011.21-.502l4.493 1.498a1 1 0 01.684.949V19a2 2 0 01-2 2h-1C9.716 21 3 14.284 3 6V5z\",\n globe: \"M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9\",\n mail: \"M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z\",\n };\n\n return (\n <button\n onClick={onClick}\n className={`\n w-full flex items-center gap-4 px-4 py-3.5 text-left transition-colors\n ${isDark ? \"hover:bg-zinc-800\" : \"hover:bg-gray-100\"}\n `}\n >\n <svg\n className={`w-5 h-5 flex-shrink-0 ${isDark ? \"text-zinc-500\" : \"text-gray-400\"}`}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d={iconPaths[icon]}\n />\n </svg>\n <div className=\"flex-1 min-w-0\">\n <p\n className={`text-sm font-medium truncate ${isDark ? \"text-white\" : \"text-gray-900\"}`}\n >\n {primary}\n </p>\n {secondary && (\n <p\n className={`text-xs truncate ${isDark ? \"text-zinc-500\" : \"text-gray-500\"}`}\n >\n {secondary}\n </p>\n )}\n </div>\n </button>\n );\n});\n\n// Options Tab Component\ninterface OptionsTabProps {\n isDark: boolean;\n}\n\nconst OptionsTab = memo(function OptionsTab({ isDark }: OptionsTabProps) {\n return (\n <div\n className={`\n rounded-xl overflow-hidden border divide-y\n ${isDark\n ? \"bg-zinc-900 border-zinc-800 divide-zinc-800\"\n : \"bg-gray-50 border-gray-200 divide-gray-200\"\n }\n `}\n >\n <OptionItem\n icon=\"bell\"\n label=\"Notifications\"\n isDark={isDark}\n />\n <OptionItem\n icon=\"block\"\n label=\"Block & report spam\"\n isDark={isDark}\n />\n <OptionItem\n icon=\"info\"\n label=\"About RCS\"\n isDark={isDark}\n />\n </div>\n );\n});\n\n// Option Item Component\ninterface OptionItemProps {\n icon: \"bell\" | \"block\" | \"info\";\n label: string;\n isDark: boolean;\n}\n\nconst OptionItem = memo(function OptionItem({\n icon,\n label,\n isDark,\n}: OptionItemProps) {\n const iconPaths = {\n bell: \"M15 17h5l-1.405-1.405A2.032 2.032 0 0118 14.158V11a6.002 6.002 0 00-4-5.659V5a2 2 0 10-4 0v.341C7.67 6.165 6 8.388 6 11v3.159c0 .538-.214 1.055-.595 1.436L4 17h5m6 0v1a3 3 0 11-6 0v-1m6 0H9\",\n block: \"M18.364 18.364A9 9 0 005.636 5.636m12.728 12.728A9 9 0 015.636 5.636m12.728 12.728L5.636 5.636\",\n info: \"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\",\n };\n\n return (\n <button\n className={`\n w-full flex items-center gap-4 px-4 py-3.5 text-left transition-colors\n ${isDark ? \"hover:bg-zinc-800\" : \"hover:bg-gray-100\"}\n `}\n >\n <svg\n className={`w-5 h-5 flex-shrink-0 ${isDark ? \"text-zinc-500\" : \"text-gray-400\"}`}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d={iconPaths[icon]}\n />\n </svg>\n <span\n className={`text-sm font-medium ${isDark ? \"text-white\" : \"text-gray-900\"}`}\n >\n {label}\n </span>\n </button>\n );\n});\n\nexport default BusinessProfile;\n\n","/**\n * WebViewRenderer Component\n *\n * Renders an embedded WebView that mimics real mobile RCS client behavior.\n * Supports three view modes:\n * - FULL: Covers entire device screen (100%)\n * - TALL: Bottom sheet covering 80% of screen\n * - HALF: Bottom sheet covering 50% of screen\n */\n\nimport { memo, useState, useCallback, useEffect } from \"react\";\nimport { useEmulator } from \"../../context/EmulatorContext\";\nimport type { RbmWebViewMode } from \"../../types/rbm.types\";\n\n// Height configuration for each view mode\nconst VIEW_MODE_HEIGHTS: Record<RbmWebViewMode, string> = {\n FULL: \"h-full\",\n TALL: \"h-[80%]\",\n HALF: \"h-[50%]\",\n};\n\nexport const WebViewRenderer = memo(function WebViewRenderer() {\n const { theme, businessInfo, webView, closeWebView } = useEmulator();\n const [isLoading, setIsLoading] = useState(true);\n const [loadError, setLoadError] = useState(false);\n\n const isDark = theme === \"dark\";\n const brandColor = businessInfo.brandColor || \"#0084ff\";\n\n // Reset loading state when URL changes\n useEffect(() => {\n if (webView?.url) {\n setIsLoading(true);\n setLoadError(false);\n }\n }, [webView?.url]);\n\n const handleIframeLoad = useCallback(() => {\n setIsLoading(false);\n }, []);\n\n const handleIframeError = useCallback(() => {\n setIsLoading(false);\n setLoadError(true);\n }, []);\n\n // Extract domain for title fallback\n const getDomainFromUrl = (url: string): string => {\n try {\n const urlObj = new URL(url);\n return urlObj.hostname;\n } catch {\n return \"Web Page\";\n }\n };\n\n if (!webView || !webView.isOpen) return null;\n\n const { url, viewMode, title, postbackData } = webView;\n const displayTitle = title || getDomainFromUrl(url);\n const isFull = viewMode === \"FULL\";\n const isBottomSheet = viewMode === \"TALL\" || viewMode === \"HALF\";\n const heightClass = VIEW_MODE_HEIGHTS[viewMode] || VIEW_MODE_HEIGHTS.TALL;\n\n return (\n <div\n className={`\n rcs-webview-overlay absolute inset-0 z-50 flex flex-col\n ${isFull ? \"\" : \"justify-end\"}\n ${isDark ? \"bg-black/60\" : \"bg-black/40\"}\n `}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={`WebView: ${displayTitle}`}\n data-postback={postbackData}\n data-view-mode={viewMode}\n >\n {/* Backdrop for bottom sheet modes - clicking closes WebView */}\n {isBottomSheet && (\n <button\n type=\"button\"\n className=\"absolute inset-0 w-full h-full cursor-default\"\n onClick={closeWebView}\n aria-label=\"Close WebView\"\n />\n )}\n\n {/* WebView Container */}\n <div\n className={`\n rcs-webview-container relative flex flex-col overflow-hidden\n ${isDark ? \"bg-zinc-900\" : \"bg-white\"}\n ${heightClass} w-full\n ${isBottomSheet ? \"rounded-t-2xl shadow-2xl\" : \"\"}\n `}\n style={{\n // Ensure container is above backdrop\n position: \"relative\",\n zIndex: 1,\n }}\n >\n {/* Header - Mobile style */}\n <header\n className={`\n rcs-webview-header flex items-center gap-3 px-2 py-2 flex-shrink-0\n border-b\n ${isDark ? \"bg-zinc-900 border-zinc-800\" : \"bg-white border-gray-200\"}\n `}\n >\n {/* Back/Close Button */}\n <button\n type=\"button\"\n onClick={closeWebView}\n className={`\n rcs-webview-close w-10 h-10 rounded-full flex items-center justify-center\n transition-colors\n ${isDark\n ? \"text-white hover:bg-zinc-800\"\n : \"text-gray-700 hover:bg-gray-100\"\n }\n `}\n aria-label=\"Close WebView\"\n >\n <svg\n className=\"w-6 h-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M15 19l-7-7 7-7\"\n />\n </svg>\n </button>\n\n {/* Title */}\n <div className=\"flex-1 min-w-0\">\n <h2\n className={`\n rcs-webview-title text-base font-medium truncate\n ${isDark ? \"text-white\" : \"text-gray-900\"}\n `}\n >\n {displayTitle}\n </h2>\n <p\n className={`\n rcs-webview-url text-xs truncate\n ${isDark ? \"text-zinc-400\" : \"text-gray-500\"}\n `}\n >\n {getDomainFromUrl(url)}\n </p>\n </div>\n\n {/* Menu Button (decorative) */}\n <button\n type=\"button\"\n className={`\n w-10 h-10 rounded-full flex items-center justify-center\n ${isDark\n ? \"text-zinc-400 hover:bg-zinc-800\"\n : \"text-gray-500 hover:bg-gray-100\"\n }\n `}\n aria-label=\"More options\"\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <circle cx=\"12\" cy=\"5\" r=\"2\" />\n <circle cx=\"12\" cy=\"12\" r=\"2\" />\n <circle cx=\"12\" cy=\"19\" r=\"2\" />\n </svg>\n </button>\n </header>\n\n {/* Loading indicator */}\n {isLoading && (\n <div\n className=\"rcs-webview-loading absolute top-14 left-0 right-0 h-1 overflow-hidden\"\n style={{ backgroundColor: `${brandColor}20` }}\n >\n <div\n className=\"h-full animate-pulse\"\n style={{\n backgroundColor: brandColor,\n animation: \"webview-loading 1.5s ease-in-out infinite\",\n width: \"30%\",\n }}\n />\n </div>\n )}\n\n {/* Error State */}\n {loadError && (\n <div\n className={`\n rcs-webview-error flex-1 flex flex-col items-center justify-center p-6 text-center\n ${isDark ? \"text-zinc-400\" : \"text-gray-500\"}\n `}\n >\n <svg\n className=\"w-16 h-16 mb-4 opacity-50\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"\n />\n </svg>\n <p className=\"text-sm font-medium mb-2\">Unable to load page</p>\n <p className=\"text-xs opacity-75 mb-4\">\n This content cannot be displayed in the emulator\n </p>\n <button\n type=\"button\"\n onClick={closeWebView}\n className={`\n px-4 py-2 rounded-full text-sm font-medium\n ${isDark\n ? \"bg-zinc-800 text-white hover:bg-zinc-700\"\n : \"bg-gray-100 text-gray-700 hover:bg-gray-200\"\n }\n `}\n >\n Go Back\n </button>\n </div>\n )}\n\n {/* Iframe */}\n {!loadError && (\n <div className=\"rcs-webview-iframe-container flex-1 overflow-hidden\">\n <iframe\n src={url}\n title={displayTitle}\n className=\"w-full h-full border-0\"\n onLoad={handleIframeLoad}\n onError={handleIframeError}\n sandbox=\"allow-scripts allow-same-origin allow-forms allow-popups\"\n referrerPolicy=\"no-referrer-when-downgrade\"\n loading=\"lazy\"\n />\n </div>\n )}\n\n {/* Bottom Safe Area (for bottom sheet modes) */}\n {isBottomSheet && (\n <div\n className={`\n rcs-webview-safe-area h-2 flex-shrink-0\n ${isDark ? \"bg-zinc-900\" : \"bg-white\"}\n `}\n />\n )}\n </div>\n\n {/* CSS Animation for loading bar */}\n <style>{`\n @keyframes webview-loading {\n 0% { transform: translateX(-100%); }\n 50% { transform: translateX(200%); }\n 100% { transform: translateX(-100%); }\n }\n `}</style>\n </div>\n );\n});\n\n","/**\n * LockScreen Component\n *\n * Displays a mobile lock screen with time, date, and notification preview.\n * Clicking the notification opens the chat.\n */\n\nimport { memo, useState, useEffect } from \"react\";\nimport { useEmulator } from \"../../context/EmulatorContext\";\n\ninterface LockScreenProps {\n onUnlock: () => void;\n messagePreview?: string;\n}\n\nexport const LockScreen = memo(function LockScreen({\n onUnlock,\n messagePreview = \"New message\",\n}: LockScreenProps) {\n const { theme, businessInfo } = useEmulator();\n const [currentTime, setCurrentTime] = useState(new Date());\n\n const isDark = theme === \"dark\";\n\n // Update time every second\n useEffect(() => {\n const timer = setInterval(() => {\n setCurrentTime(new Date());\n }, 1000);\n\n return () => clearInterval(timer);\n }, []);\n\n // Format time (e.g., \"6:06 PM\")\n const formattedTime = currentTime.toLocaleTimeString([], {\n hour: \"numeric\",\n minute: \"2-digit\",\n hour12: true,\n });\n\n // Format date (e.g., \"Tue, January 6\")\n const formattedDate = currentTime.toLocaleDateString([], {\n weekday: \"short\",\n month: \"long\",\n day: \"numeric\",\n });\n\n // Get weather icon and temp (mock data - could be made dynamic)\n const weatherTemp = \"19°C\";\n\n return (\n <div\n className={`\n lock-screen flex flex-col h-full w-full select-none\n ${isDark ? \"bg-zinc-900\" : \"bg-zinc-800\"}\n `}\n >\n {/* Status Bar Area */}\n <div className=\"h-6\" />\n\n {/* Lock Icon */}\n <div className=\"flex justify-center mt-4\">\n <div className=\"w-8 h-8 rounded-full bg-zinc-700 flex items-center justify-center\">\n <svg\n className=\"w-4 h-4 text-zinc-400\"\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M5 9V7a5 5 0 0110 0v2a2 2 0 012 2v5a2 2 0 01-2 2H5a2 2 0 01-2-2v-5a2 2 0 012-2zm8-2v2H7V7a3 3 0 016 0z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </div>\n </div>\n\n {/* Time */}\n <div className=\"mt-6 text-center\">\n <h1 className=\"text-5xl font-light text-white tracking-tight\">\n {formattedTime}\n </h1>\n </div>\n\n {/* Date & Weather */}\n <div className=\"mt-2 text-center\">\n <p className=\"text-zinc-400 text-sm\">{formattedDate}</p>\n <div className=\"flex items-center justify-center gap-1 mt-1 text-zinc-500 text-xs\">\n <svg className=\"w-3.5 h-3.5\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path d=\"M5.5 16a3.5 3.5 0 01-.369-6.98 4 4 0 117.753-1.977A4.5 4.5 0 1113.5 16h-8z\" />\n </svg>\n <span>{weatherTemp}</span>\n </div>\n </div>\n\n {/* Spacer */}\n <div className=\"h-24\" />\n\n {/* Notification Card */}\n <div className=\"px-4 pb-8\">\n <button\n onClick={onUnlock}\n className=\"w-full bg-white rounded-2xl p-3 flex items-center gap-3 shadow-lg \n transition-transform active:scale-[0.98] hover:shadow-xl\"\n >\n {/* App Icon */}\n <div className=\"w-12 h-12 rounded-xl bg-zinc-900 flex items-center justify-center flex-shrink-0 overflow-hidden\">\n {businessInfo.logo ? (\n <img\n src={businessInfo.logo}\n alt={businessInfo.name}\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <div className=\"text-white\">\n {/* Default RCS icon pattern */}\n <svg\n className=\"w-7 h-7\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"1.5\" />\n <circle cx=\"12\" cy=\"6\" r=\"1\" />\n <circle cx=\"12\" cy=\"18\" r=\"1\" />\n <circle cx=\"6\" cy=\"12\" r=\"1\" />\n <circle cx=\"18\" cy=\"12\" r=\"1\" />\n <circle cx=\"8\" cy=\"8\" r=\"0.8\" />\n <circle cx=\"16\" cy=\"8\" r=\"0.8\" />\n <circle cx=\"8\" cy=\"16\" r=\"0.8\" />\n <circle cx=\"16\" cy=\"16\" r=\"0.8\" />\n <circle cx=\"6\" cy=\"6\" r=\"0.5\" />\n <circle cx=\"18\" cy=\"6\" r=\"0.5\" />\n <circle cx=\"6\" cy=\"18\" r=\"0.5\" />\n <circle cx=\"18\" cy=\"18\" r=\"0.5\" />\n </svg>\n </div>\n )}\n </div>\n\n {/* Message Info */}\n <div className=\"flex-1 text-left min-w-0\">\n <p className=\"text-sm font-semibold text-gray-900 truncate\">\n {businessInfo.name}\n </p>\n <p className=\"text-sm text-gray-500 truncate\">{messagePreview}</p>\n </div>\n\n {/* Timestamp */}\n <span className=\"text-xs text-gray-400 flex-shrink-0\">now</span>\n </button>\n </div>\n\n <div className=\"flex-1\" />\n {/* Home Indicator */}\n <div className=\"flex justify-center pb-2\">\n <div className=\"w-32 h-1 rounded-full bg-zinc-600\" />\n </div>\n </div>\n );\n});\n\n","/**\n * RcsEmulator Component\n *\n * Main entry point for the RCS Business Messaging Emulator.\n * This is the public API component that wraps all internal components.\n *\n * Supports two input modes:\n * - messages: Direct RBM JSON object\n * - jsonUrl: URL to fetch RBM JSON from\n */\n\nimport { memo, useMemo, useState, useCallback } from \"react\";\nimport type {\n RcsEmulatorProps,\n BusinessInfo,\n WebViewState,\n} from \"./types/emulator.types\";\nimport type { RbmSuggestion, RbmConversationFlow } from \"./types/rbm.types\";\nimport { isSuggestedAction, getWebViewConfig } from \"./types/rbm.types\";\nimport { EmulatorProvider } from \"./context/EmulatorContext\";\nimport { useConversation } from \"./hooks/useConversation\";\nimport { useJsonFetch } from \"./hooks/useJsonFetch\";\nimport { ChatWindow } from \"./components/ChatWindow\";\nimport { BusinessProfile } from \"./components/BusinessProfile\";\nimport { WebViewRenderer } from \"./components/WebView\";\nimport { LockScreen } from \"./components/LockScreen\";\nimport {\n validateConversationFlow,\n getFirstMessagePreview,\n} from \"./utils/messageParser\";\n\nconst defaultBusinessInfo: BusinessInfo = {\n name: \"Business\",\n verified: false,\n};\n\n/**\n * Internal component that renders the emulator with validated data\n */\nconst RcsEmulatorInner = memo(function RcsEmulatorInner({\n flow,\n onUserReply,\n theme,\n device,\n businessInfo,\n showSuggestions,\n}: {\n flow: RbmConversationFlow;\n onUserReply: RcsEmulatorProps[\"onUserReply\"];\n theme: NonNullable<RcsEmulatorProps[\"theme\"]>;\n device: NonNullable<RcsEmulatorProps[\"device\"]>;\n businessInfo: BusinessInfo;\n showSuggestions: boolean;\n}) {\n // Initialize conversation engine\n const {\n state,\n handleReply,\n handleAction: baseHandleAction,\n } = useConversation({\n flow,\n onUserReply,\n typingDelay: 800,\n });\n\n // Business profile state\n const [isProfileOpen, setIsProfileOpen] = useState(false);\n const toggleProfile = useCallback(() => {\n setIsProfileOpen((prev) => !prev);\n }, []);\n\n // WebView state\n const [webView, setWebView] = useState<WebViewState | null>(null);\n\n const openWebView = useCallback((config: Omit<WebViewState, \"isOpen\">) => {\n setWebView({\n ...config,\n isOpen: true,\n });\n }, []);\n\n const closeWebView = useCallback(() => {\n setWebView(null);\n }, []);\n\n // Enhanced action handler that intercepts WebView actions\n const handleAction = useCallback(\n (suggestion: RbmSuggestion) => {\n if (!isSuggestedAction(suggestion)) return;\n\n // Check for WebView action\n const webViewConfig = getWebViewConfig(suggestion);\n if (webViewConfig) {\n // Open WebView instead of browser\n openWebView({\n url: webViewConfig.url,\n viewMode: webViewConfig.webviewViewMode || \"TALL\",\n title: webViewConfig.description || \"\",\n postbackData: suggestion.action.postback.data,\n });\n\n // Emit callback with webview action data\n onUserReply({\n type: \"action\",\n postbackData: suggestion.action.postback.data,\n displayText: suggestion.action.displayText,\n timestamp: Date.now(),\n actionData: {\n type: \"webview\",\n url: webViewConfig.url,\n viewMode: webViewConfig.webviewViewMode || \"TALL\",\n description: webViewConfig.description,\n },\n });\n\n return;\n }\n\n // Default action handling (opens browser for regular URLs)\n baseHandleAction(suggestion);\n },\n [baseHandleAction, openWebView, onUserReply]\n );\n\n return (\n <EmulatorProvider\n theme={theme}\n device={device}\n businessInfo={businessInfo}\n state={state}\n showSuggestions={showSuggestions}\n isProfileOpen={isProfileOpen}\n toggleProfile={toggleProfile}\n onReply={handleReply}\n onAction={handleAction}\n webView={webView}\n openWebView={openWebView}\n closeWebView={closeWebView}\n >\n <ChatWindow />\n {isProfileOpen && <BusinessProfile />}\n <WebViewRenderer />\n </EmulatorProvider>\n );\n});\n\nexport const RcsEmulator = memo(function RcsEmulator({\n messages,\n jsonUrl,\n onUserReply,\n theme = \"light\",\n device = \"android\",\n businessInfo,\n className = \"\",\n width = 375,\n height = 667,\n showSuggestions = true,\n showLockScreen = false,\n}: RcsEmulatorProps) {\n // Lock screen state\n const [isLocked, setIsLocked] = useState(showLockScreen);\n\n const handleUnlock = useCallback(() => {\n setIsLocked(false);\n }, []);\n\n // Fetch JSON from URL if provided\n const {\n data: fetchedData,\n isLoading,\n error: fetchError,\n } = useJsonFetch(jsonUrl);\n\n // Use fetched data or direct messages prop\n const flowData = jsonUrl ? fetchedData : messages;\n\n // Validate JSON structure\n const isValidFlow = useMemo(\n () => (flowData ? validateConversationFlow(flowData) : false),\n [flowData]\n );\n\n // Merge business info with defaults\n const mergedBusinessInfo = useMemo(\n () => ({\n ...defaultBusinessInfo,\n ...businessInfo,\n // Extract name from flow if not provided\n name: businessInfo?.name || flowData?.name || defaultBusinessInfo.name,\n }),\n [businessInfo, flowData?.name]\n );\n\n // Get first message preview for lock screen notification\n const messagePreview = useMemo(\n () =>\n flowData && isValidFlow\n ? getFirstMessagePreview(flowData)\n : \"New message\",\n [flowData, isValidFlow]\n );\n\n const isDark = theme === \"dark\";\n\n // Container wrapper component\n const EmulatorContainer = ({ children }: { children: React.ReactNode }) => (\n <div\n className={`\n rcs-emulator relative overflow-hidden\n rounded-2xl shadow-2xl\n ${isDark ? \"bg-zinc-950\" : \"bg-white\"}\n ${className}\n `}\n style={{ width, height }}\n role=\"application\"\n aria-label=\"RCS Message Emulator\"\n data-theme={theme}\n data-device={device}\n >\n {children}\n </div>\n );\n\n // Loading state (when fetching from URL)\n if (jsonUrl && isLoading) {\n return (\n <EmulatorContainer>\n <div className=\"flex flex-col items-center justify-center h-full p-6\">\n <div\n className={`\n w-10 h-10 border-3 border-t-transparent rounded-full animate-spin mb-4\n ${isDark ? \"border-zinc-600\" : \"border-gray-300\"}\n `}\n style={{ borderTopColor: \"transparent\" }}\n />\n <p\n className={`text-sm ${isDark ? \"text-zinc-400\" : \"text-gray-500\"}`}\n >\n Loading conversation...\n </p>\n </div>\n </EmulatorContainer>\n );\n }\n\n // Fetch error state\n if (jsonUrl && fetchError) {\n return (\n <EmulatorContainer>\n <div className=\"flex flex-col items-center justify-center h-full p-6 text-center\">\n <svg\n className=\"w-12 h-12 mx-auto mb-4 text-red-500\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <h3\n className={`text-lg font-medium mb-2 ${\n isDark ? \"text-white\" : \"text-gray-900\"\n }`}\n >\n Failed to Load\n </h3>\n <p\n className={`text-sm ${isDark ? \"text-zinc-400\" : \"text-gray-500\"}`}\n >\n {fetchError}\n </p>\n <p\n className={`text-xs mt-2 break-all max-w-full ${\n isDark ? \"text-zinc-500\" : \"text-gray-400\"\n }`}\n >\n {jsonUrl}\n </p>\n </div>\n </EmulatorContainer>\n );\n }\n\n // No data provided\n if (!flowData) {\n return (\n <EmulatorContainer>\n <div className=\"flex flex-col items-center justify-center h-full p-6 text-center\">\n <svg\n className={`w-12 h-12 mx-auto mb-4 ${\n isDark ? \"text-zinc-600\" : \"text-gray-300\"\n }`}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z\"\n />\n </svg>\n <h3\n className={`text-lg font-medium mb-2 ${\n isDark ? \"text-white\" : \"text-gray-900\"\n }`}\n >\n No Conversation Data\n </h3>\n <p\n className={`text-sm ${isDark ? \"text-zinc-400\" : \"text-gray-500\"}`}\n >\n Provide either{\" \"}\n <code className=\"px-1 py-0.5 rounded bg-gray-100 dark:bg-zinc-800\">\n messages\n </code>{\" \"}\n or{\" \"}\n <code className=\"px-1 py-0.5 rounded bg-gray-100 dark:bg-zinc-800\">\n jsonUrl\n </code>{\" \"}\n prop\n </p>\n </div>\n </EmulatorContainer>\n );\n }\n\n // Invalid JSON structure\n if (!isValidFlow) {\n return (\n <EmulatorContainer>\n <div className=\"flex flex-col items-center justify-center h-full p-6 text-center\">\n <svg\n className=\"w-12 h-12 mx-auto mb-4 text-amber-500\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"\n />\n </svg>\n <h3\n className={`text-lg font-medium mb-2 ${\n isDark ? \"text-white\" : \"text-gray-900\"\n }`}\n >\n Invalid RBM JSON\n </h3>\n <p\n className={`text-sm ${isDark ? \"text-zinc-400\" : \"text-gray-500\"}`}\n >\n The conversation flow structure is not valid\n </p>\n </div>\n </EmulatorContainer>\n );\n }\n\n // Valid flow - render lock screen or emulator\n return (\n <EmulatorContainer>\n {isLocked ? (\n <EmulatorProvider\n theme={theme}\n device={device}\n businessInfo={mergedBusinessInfo}\n state={{\n currentMessageId: null,\n chatHistory: [],\n isTyping: false,\n error: null,\n }}\n showSuggestions={false}\n isProfileOpen={false}\n toggleProfile={() => {}}\n onReply={() => {}}\n onAction={() => {}}\n webView={null}\n openWebView={() => {}}\n closeWebView={() => {}}\n >\n <LockScreen onUnlock={handleUnlock} messagePreview={messagePreview} />\n </EmulatorProvider>\n ) : (\n <RcsEmulatorInner\n flow={flowData}\n onUserReply={onUserReply}\n theme={theme}\n device={device}\n businessInfo={mergedBusinessInfo}\n showSuggestions={showSuggestions}\n />\n )}\n </EmulatorContainer>\n );\n});\n\n// Default export for convenience\nexport default RcsEmulator;\n"],"names":["isSuggestedReply","suggestion","isSuggestedAction","isWebViewAction","urlAction","action","openUrl","application","getWebViewConfig","defaultBusinessInfo","name","verified","defaultState","currentMessageId","chatHistory","isTyping","error","EmulatorContext","createContext","EmulatorProvider","t0","$","_c","children","theme","device","businessInfo","state","showSuggestions","isProfileOpen","toggleProfile","onReply","onAction","webView","openWebView","closeWebView","t1","t2","t3","handleReply","handleAction","value","t4","jsx","useEmulator","context","useContext","Error","findFirstMessage","flow","messages","Object","values","find","msg","is_first","getMessageById","messageId","findNextMessageId","message","postbackData","choices","responses","keyword","keyword_response","next_message","parseMessageParts","messageIndex","parts","content","parseContent","suggestions","extractMessageLevelSuggestions","id","Date","now","sender","timestamp","part","rcsMessage","RCSMessage","textMessage","type","text","card","richcardMessage","generalPurposeCard","parseCardContent","layout","carousel","generalPurposeCardCarousel","cards","map","cardContent","cardOrientation","cardWidth","getMediaUrl","media","mediaUrl","contentInfo","fileUrl","getThumbnailUrl","thumbnailUri","thumbnailUrl","title","description","url","height","mapHeight","undefined","orientation","width","imageAlignment","suggestedChipList","push","createUserReplyMessage","validateConversationFlow","f","length","m","Array","isArray","getFirstMessagePreview","firstMessage","slice","initialState","conversationReducer","userMessage","updatedHistory","idx","useConversation","onUserReply","typingDelay","dispatch","useReducer","messageIndexRef","useRef","initializedRef","current","chatMessage","useEffect","displayText","postback","reply","data","payload","currentMessage","nextMessageId","nextMessage","setTimeout","chatMessage_0","t5","suggestion_0","displayText_0","postback_0","openUrlAction","dialAction","dialerAction","mapAction","viewLocationAction","postbackData_0","phoneNumber","dialPhoneNumber","location","showLocation","latLong","actionData","latitude","longitude","query","payload_0","window","open","href","label","mapsUrl","encodeURIComponent","currentMessage_0","nextMessageId_0","nextMessage_0","chatMessage_1","t6","Symbol","for","reset","t7","useJsonFetch","setData","useState","isLoading","setIsLoading","setError","fetchJson","useCallback","response","fetch","method","headers","Accept","ok","status","statusText","json","err","refetch","useAutoScroll","dependency","scrollRef","scrollTo","top","scrollHeight","behavior","BusinessHeader","memo","isDark","brandColor","logo","backgroundColor","t8","charAt","toUpperCase","t9","t10","t11","t12","t13","jsxs","t14","t15","t16","t17","t18","BrandedHero","TextMessage","isBusiness","toLocaleTimeString","hour","minute","formattedTime","UserReply","RichCard","handleSuggestionClick","short","medium","tall","heightMap","RichCardSuggestionItem","ICON_CLASS","GlobeIcon","PhoneIcon","MapMarkerIcon","CalendarIcon","ReplyIcon","onClick","isAction","calendarAction","createCalendarEventAction","getActionIcon","Carousel","canScrollLeft","setCanScrollLeft","canScrollRight","setCanScrollRight","scrollLeft","scrollWidth","clientWidth","updateScrollButtons","direction","scrollBy","left","scroll","scrollbarWidth","msOverflowStyle","CarouselCard","CAROUSEL_ICON_CLASS","getCarouselActionIcon","onSuggestionClick","renderers","userReply","richcard","MessageRenderer","isLast","Renderer","console","warn","TypingIndicator","MessageList","SuggestionChip","variant","ActionIcon","getActionLabel","color","className","style","shareLocationAction","SuggestionsBar","handleClick","ChatWindow","lastMessage","t19","t20","t21","t22","t23","t24","BusinessProfile","activeTab","setActiveTab","bannerUrl","bannerImage","phoneNumbers","QuickActionButton","phone","number","websites","emails","email","TabButton","t25","t26","t27","t28","InfoTab","OptionsTab","t29","t30","icon","globe","mail","icons","active","ContactItem","website","idx_0","replace","idx_1","primary","secondary","iconPaths","OptionItem","bell","block","info","VIEW_MODE_HEIGHTS","FULL","TALL","HALF","WebViewRenderer","loadError","setLoadError","handleIframeLoad","handleIframeError","getDomainFromUrl","_temp","isOpen","url_0","viewMode","displayTitle","isFull","isBottomSheet","heightClass","position","zIndex","animation","t31","URL","hostname","LockScreen","onUnlock","messagePreview","currentTime","setCurrentTime","timer","setInterval","clearInterval","hour12","toLocaleDateString","weekday","month","day","formattedDate","weatherTemp","RcsEmulatorInner","baseHandleAction","setIsProfileOpen","setWebView","config","webViewConfig","webviewViewMode","RcsEmulator","jsonUrl","showLockScreen","isLocked","setIsLocked","handleUnlock","fetchedData","fetchError","flowData","isValidFlow","mergedBusinessInfo","EmulatorContainer","borderTopColor","_temp2","_temp3","_temp4","_temp5","_temp6","prev"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"rcs-emulator.cjs.js","sources":["../src/components/RcsEmulator/types/rbm.types.ts","../src/components/RcsEmulator/context/EmulatorContext.tsx","../src/components/RcsEmulator/utils/messageParser.ts","../src/components/RcsEmulator/hooks/useConversation.ts","../src/components/RcsEmulator/hooks/useJsonFetch.ts","../src/components/RcsEmulator/hooks/useAutoScroll.ts","../src/components/RcsEmulator/components/BusinessHeader/BusinessHeader.tsx","../src/components/RcsEmulator/components/BrandedHero/BrandedHero.tsx","../src/components/RcsEmulator/components/Message/TextMessage.tsx","../src/components/RcsEmulator/components/Message/UserReply.tsx","../src/components/RcsEmulator/components/Message/RichCard.tsx","../src/components/RcsEmulator/components/Message/Carousel.tsx","../src/components/RcsEmulator/components/Message/MessageRenderer.tsx","../src/components/RcsEmulator/components/TypingIndicator/TypingIndicator.tsx","../src/components/RcsEmulator/components/MessageList/MessageList.tsx","../src/components/RcsEmulator/components/Suggestions/SuggestionChip.tsx","../src/components/RcsEmulator/components/Suggestions/SuggestionsBar.tsx","../src/components/RcsEmulator/components/ChatWindow/ChatWindow.tsx","../src/components/RcsEmulator/components/BusinessProfile/BusinessProfile.tsx","../src/components/RcsEmulator/components/WebView/WebViewRenderer.tsx","../src/components/RcsEmulator/components/LockScreen/LockScreen.tsx","../src/components/RcsEmulator/RcsEmulator.tsx"],"sourcesContent":["/**\n * RCS Business Messaging (RBM) JSON Schema Types\n *\n * These interfaces define the structure of RBM conversation flows\n * as documented in the RBM specification.\n */\n\n// ============================================\n// Top-Level Conversation Flow\n// ============================================\n\nexport interface RbmConversationFlow {\n /** Campaign / flow identifier */\n name: string;\n /** All conversation nodes (message states) */\n messages: Record<string, RbmMessage>;\n /** Keyword to restart the conversation flow */\n reset_keyword?: string;\n /** Session validity window in hours */\n expireInHours?: number;\n}\n\n// ============================================\n// Message Node\n// ============================================\n\nexport interface RbmMessage {\n /** Unique identifier for this message node */\n id: string;\n /** Marks the entry point of the conversation (only one should be true) */\n is_first: boolean;\n /** Response handlers for user interactions */\n responses: RbmResponses;\n /** UI components to render */\n parts: RbmMessagePart[];\n}\n\nexport interface RbmResponses {\n keyword?: RbmKeywordResponse;\n}\n\nexport interface RbmKeywordResponse {\n keyword_response: {\n choices: Record<string, RbmChoice>;\n };\n}\n\nexport interface RbmChoice {\n /** Display text for the choice */\n display_text: string;\n /** Message ID to navigate to */\n next_message: string;\n /** Context variables to pass */\n variables?: Record<string, unknown>;\n}\n\n// ============================================\n// Message Parts (UI Components)\n// ============================================\n\nexport interface RbmMessagePart {\n RCSMessage: RCSMessage;\n}\n\nexport interface RCSMessage {\n /** Traffic type classification */\n trafficType?: \"advertisement\" | \"transactional\" | \"promotional\";\n /** Simple text message */\n textMessage?: string;\n /** Rich card message */\n richcardMessage?: RbmRichCardMessage;\n /** Suggested chip list (for text messages with suggestions) */\n suggestedChipList?: RbmSuggestedChipList;\n /** Message contact info */\n messageContact?: RbmMessageContact;\n}\n\nexport interface RbmSuggestedChipList {\n suggestions: RbmSuggestion[];\n}\n\nexport interface RbmMessageContact {\n userContact: string;\n}\n\n// ============================================\n// Rich Card Messages\n// ============================================\n\nexport interface RbmRichCardMessage {\n message: {\n generalPurposeCard?: RbmGeneralPurposeCard;\n generalPurposeCardCarousel?: RbmGeneralPurposeCardCarousel;\n };\n}\n\nexport interface RbmGeneralPurposeCard {\n layout: RbmCardLayout;\n content: RbmCardContent;\n}\n\nexport interface RbmGeneralPurposeCardCarousel {\n layout: RbmCarouselLayout;\n content: RbmCardContent[];\n}\n\nexport interface RbmCardLayout {\n cardOrientation: \"VERTICAL\" | \"HORIZONTAL\";\n cardWidth?: \"SMALL_WIDTH\" | \"MEDIUM_WIDTH\";\n imageAlignment?: \"LEFT\" | \"RIGHT\";\n}\n\nexport interface RbmCarouselLayout {\n cardWidth: \"SMALL_WIDTH\" | \"MEDIUM_WIDTH\";\n cardOrientation?: \"VERTICAL\" | \"HORIZONTAL\";\n}\n\nexport interface RbmCardContent {\n /** Media content (image/video) */\n media?: RbmMedia;\n /** Card title */\n title?: string;\n /** Card description */\n description?: string;\n /** Interactive suggestions */\n suggestions?: RbmSuggestion[];\n}\n\n// ============================================\n// Media\n// ============================================\n\n/**\n * RBM Media - supports both API formats:\n * - Flat format: mediaUrl, mediaContentType, mediaFileSize (from messagingstudio API)\n * - Nested format: contentInfo.fileUrl (alternate format)\n */\nexport interface RbmMedia {\n height: \"SHORT_HEIGHT\" | \"MEDIUM_HEIGHT\" | \"TALL_HEIGHT\";\n /** Media URL (flat format from API) */\n mediaUrl?: string;\n /** MIME type (flat format from API) */\n mediaContentType?: string;\n /** File size in bytes (flat format from API) */\n mediaFileSize?: number;\n /** Nested content info (alternate format) */\n contentInfo?: RbmContentInfo;\n /** Thumbnail URL for video content */\n thumbnailUri?: string;\n}\n\nexport interface RbmContentInfo {\n fileUrl: string;\n thumbnailUrl?: string;\n forceRefresh?: boolean;\n /** MIME type of the file */\n mimeType?: string;\n /** File size in bytes */\n fileSize?: number;\n}\n\n// ============================================\n// Suggestions (Replies & Actions)\n// ============================================\n\nexport type RbmSuggestion = RbmSuggestedReply | RbmSuggestedAction;\n\nexport interface RbmSuggestedReply {\n reply: {\n displayText: string;\n postback: RbmPostback;\n };\n}\n\nexport interface RbmSuggestedAction {\n action: {\n displayText: string;\n postback: RbmPostback;\n /** Open URL action (legacy simple format) */\n openUrlAction?: {\n url: string;\n };\n /** URL action with WebView support (from messagingstudio API) */\n urlAction?: {\n openUrl: RbmOpenUrl;\n };\n /** Dial phone action (legacy format) */\n dialAction?: {\n phoneNumber: string;\n };\n /** Dialer action (from messagingstudio API) */\n dialerAction?: {\n dialPhoneNumber: {\n phoneNumber: string;\n };\n };\n /** Share location action */\n shareLocationAction?: Record<string, never>;\n /** View location action (legacy format) */\n viewLocationAction?: {\n latLong?: {\n latitude: number;\n longitude: number;\n };\n query?: string;\n label?: string;\n };\n /** Map action (from messagingstudio API) */\n mapAction?: {\n showLocation: {\n location: {\n latitude: number;\n longitude: number;\n label?: string;\n };\n };\n };\n /** Create calendar event action */\n createCalendarEventAction?: {\n title: string;\n description?: string;\n startTime?: string;\n endTime?: string;\n };\n /** Calendar action (from messagingstudio API) */\n calendarAction?: {\n createCalendarEvent: {\n title: string;\n description?: string;\n startTime?: string;\n endTime?: string;\n };\n };\n };\n}\n\n/** WebView mode for opening URLs */\nexport type RbmWebViewMode = \"FULL\" | \"TALL\" | \"HALF\";\n\n/** Application type for URL actions */\nexport type RbmUrlApplication = \"BROWSER\" | \"WEBVIEW\";\n\n/** Open URL configuration */\nexport interface RbmOpenUrl {\n /** Target URL */\n url: string;\n /** Application to open URL in */\n application?: RbmUrlApplication;\n /** WebView display mode (only when application is WEBVIEW) */\n webviewViewMode?: RbmWebViewMode;\n /** Description/title for WebView header */\n description?: string;\n}\n\nexport interface RbmPostback {\n data: string;\n}\n\n// ============================================\n// Type Guards\n// ============================================\n\nexport function isSuggestedReply(\n suggestion: RbmSuggestion\n): suggestion is RbmSuggestedReply {\n return \"reply\" in suggestion;\n}\n\nexport function isSuggestedAction(\n suggestion: RbmSuggestion\n): suggestion is RbmSuggestedAction {\n return \"action\" in suggestion;\n}\n\nexport function hasRichCard(message: RCSMessage): boolean {\n return !!message.richcardMessage?.message?.generalPurposeCard;\n}\n\nexport function hasCarousel(message: RCSMessage): boolean {\n return !!message.richcardMessage?.message?.generalPurposeCardCarousel;\n}\n\nexport function hasTextMessage(message: RCSMessage): boolean {\n return !!message.textMessage;\n}\n\n/** Check if an action should open in WebView */\nexport function isWebViewAction(suggestion: RbmSuggestion): boolean {\n if (!isSuggestedAction(suggestion)) return false;\n const { urlAction } = suggestion.action;\n return urlAction?.openUrl?.application === \"WEBVIEW\";\n}\n\n/** Get WebView config from action */\nexport function getWebViewConfig(\n suggestion: RbmSuggestedAction\n): RbmOpenUrl | null {\n const { urlAction } = suggestion.action;\n if (urlAction?.openUrl?.application === \"WEBVIEW\") {\n return urlAction.openUrl;\n }\n return null;\n}\n","/**\n * Emulator Context Provider\n * \n * Provides theme, device type, and conversation state to all child components.\n */\n\nimport { createContext, useContext, type ReactNode } from 'react';\nimport type {\n EmulatorContextValue,\n EmulatorTheme,\n EmulatorDevice,\n BusinessInfo,\n ConversationState,\n WebViewState,\n} from '../types/emulator.types';\nimport type { RbmSuggestion } from '../types/rbm.types';\n\nconst defaultBusinessInfo: BusinessInfo = {\n name: 'Business',\n verified: false,\n};\n\nconst defaultState: ConversationState = {\n currentMessageId: null,\n chatHistory: [],\n isTyping: false,\n error: null,\n};\n\nconst EmulatorContext = createContext<EmulatorContextValue | null>(null);\n\nexport interface EmulatorProviderProps {\n children: ReactNode;\n theme: EmulatorTheme;\n device: EmulatorDevice;\n businessInfo: BusinessInfo;\n state: ConversationState;\n showSuggestions: boolean;\n isProfileOpen: boolean;\n toggleProfile: () => void;\n onReply: (suggestion: RbmSuggestion) => void;\n onAction: (suggestion: RbmSuggestion) => void;\n webView: WebViewState | null;\n openWebView: (config: Omit<WebViewState, 'isOpen'>) => void;\n closeWebView: () => void;\n}\n\nexport function EmulatorProvider({\n children,\n theme,\n device,\n businessInfo,\n state,\n showSuggestions,\n isProfileOpen,\n toggleProfile,\n onReply,\n onAction,\n webView,\n openWebView,\n closeWebView,\n}: EmulatorProviderProps) {\n const value: EmulatorContextValue = {\n theme,\n device,\n businessInfo: { ...defaultBusinessInfo, ...businessInfo },\n state: { ...defaultState, ...state },\n showSuggestions,\n isProfileOpen,\n toggleProfile,\n handleReply: onReply,\n handleAction: onAction,\n webView,\n openWebView,\n closeWebView,\n };\n\n return (\n <EmulatorContext.Provider value={value}>\n {children}\n </EmulatorContext.Provider>\n );\n}\n\nexport function useEmulator(): EmulatorContextValue {\n const context = useContext(EmulatorContext);\n if (!context) {\n throw new Error('useEmulator must be used within an EmulatorProvider');\n }\n return context;\n}\n\nexport { EmulatorContext };\n\n","/**\n * Message Parser Utilities\n * \n * Parses and normalizes RBM JSON into internal component-ready structures.\n */\n\nimport type {\n RbmConversationFlow,\n RbmMessage,\n RbmMessagePart,\n RbmCardContent,\n RbmSuggestion,\n} from '../types/rbm.types';\nimport type { ChatMessage, RichCardData, MessageContent } from '../types/emulator.types';\n\n/**\n * Find the first message (entry point) in a conversation flow\n */\nexport function findFirstMessage(flow: RbmConversationFlow): RbmMessage | null {\n const messages = Object.values(flow.messages);\n return messages.find((msg) => msg.is_first) || messages[0] || null;\n}\n\n/**\n * Get a message by ID from the conversation flow\n */\nexport function getMessageById(\n flow: RbmConversationFlow,\n messageId: string\n): RbmMessage | null {\n return flow.messages[messageId] || null;\n}\n\n/**\n * Find the next message ID based on postback data\n */\nexport function findNextMessageId(\n message: RbmMessage,\n postbackData: string\n): string | null {\n const choices = message.responses?.keyword?.keyword_response?.choices;\n if (!choices) return null;\n \n const choice = choices[postbackData];\n return choice?.next_message || null;\n}\n\n/**\n * Convert RBM message parts to internal ChatMessage format\n */\nexport function parseMessageParts(\n message: RbmMessage,\n messageIndex: number\n): ChatMessage {\n const parts = message.parts;\n const content = parseContent(parts);\n // Only extract message-level chips (suggestedChipList), NOT card suggestions\n const suggestions = extractMessageLevelSuggestions(parts);\n\n return {\n id: `${message.id}-${messageIndex}-${Date.now()}`,\n sender: 'business',\n content,\n timestamp: Date.now(),\n suggestions,\n };\n}\n\n/**\n * Parse message parts into MessageContent\n */\nfunction parseContent(parts: RbmMessagePart[]): MessageContent {\n for (const part of parts) {\n const rcsMessage = part.RCSMessage;\n\n // Text message\n if (rcsMessage.textMessage) {\n return {\n type: 'text',\n text: rcsMessage.textMessage,\n };\n }\n\n // Rich card (single)\n const card = rcsMessage.richcardMessage?.message?.generalPurposeCard;\n if (card) {\n return {\n type: 'richcard',\n card: parseCardContent(card.content, card.layout),\n };\n }\n\n // Carousel\n const carousel = rcsMessage.richcardMessage?.message?.generalPurposeCardCarousel;\n if (carousel) {\n return {\n type: 'carousel',\n cards: carousel.content.map((cardContent) =>\n parseCardContent(cardContent, {\n cardOrientation: 'VERTICAL',\n cardWidth: carousel.layout.cardWidth,\n })\n ),\n };\n }\n }\n\n // Fallback for unknown content\n return {\n type: 'text',\n text: '[Unsupported message type]',\n };\n}\n\n/**\n * Parse card content into RichCardData\n * Supports both API formats:\n * - Flat format: media.mediaUrl (from messagingstudio API)\n * - Nested format: media.contentInfo.fileUrl (alternate format)\n */\nfunction parseCardContent(\n content: RbmCardContent,\n layout: { cardOrientation: string; cardWidth?: string; imageAlignment?: string }\n): RichCardData {\n // Extract media URL - support both flat and nested formats\n const getMediaUrl = (): string | undefined => {\n if (!content.media) return undefined;\n // Flat format (messagingstudio API): mediaUrl\n if (content.media.mediaUrl) return content.media.mediaUrl;\n // Nested format: contentInfo.fileUrl\n if (content.media.contentInfo?.fileUrl) return content.media.contentInfo.fileUrl;\n return undefined;\n };\n\n const getThumbnailUrl = (): string | undefined => {\n if (!content.media) return undefined;\n // Try thumbnailUri first, then nested contentInfo\n if (content.media.thumbnailUri) return content.media.thumbnailUri;\n if (content.media.contentInfo?.thumbnailUrl) return content.media.contentInfo.thumbnailUrl;\n return undefined;\n };\n\n const mediaUrl = getMediaUrl();\n\n return {\n title: content.title,\n description: content.description,\n media: mediaUrl\n ? {\n url: mediaUrl,\n height: mapHeight(content.media?.height || 'MEDIUM_HEIGHT'),\n thumbnailUrl: getThumbnailUrl(),\n }\n : undefined,\n suggestions: content.suggestions,\n layout: {\n orientation: layout.cardOrientation === 'HORIZONTAL' ? 'horizontal' : 'vertical',\n width: layout.cardWidth === 'SMALL_WIDTH' ? 'small' : 'medium',\n imageAlignment: layout.imageAlignment === 'RIGHT' ? 'right' : 'left',\n },\n };\n}\n\n/**\n * Map RBM height values to internal format\n */\nfunction mapHeight(height: string): 'short' | 'medium' | 'tall' {\n switch (height) {\n case 'SHORT_HEIGHT':\n return 'short';\n case 'TALL_HEIGHT':\n return 'tall';\n default:\n return 'medium';\n }\n}\n\n/**\n * Extract MESSAGE-LEVEL suggestions (suggestedChipList only)\n * These are quick-reply chips that appear in the bottom bar and disappear after selection\n * \n * Card-level suggestions stay ON the card and are handled by the RichCard/Carousel components\n */\nfunction extractMessageLevelSuggestions(parts: RbmMessagePart[]): RbmSuggestion[] {\n const suggestions: RbmSuggestion[] = [];\n\n for (const part of parts) {\n const rcsMessage = part.RCSMessage;\n\n // Only extract suggestedChipList (message-level quick replies)\n if (rcsMessage.suggestedChipList?.suggestions) {\n suggestions.push(...rcsMessage.suggestedChipList.suggestions);\n }\n }\n\n return suggestions;\n}\n\n/**\n * Extract all suggestions from message parts (for backward compatibility/testing)\n * @deprecated Use extractMessageLevelSuggestions for proper RCS behavior\n */\nexport function extractAllSuggestions(parts: RbmMessagePart[]): RbmSuggestion[] {\n const suggestions: RbmSuggestion[] = [];\n\n for (const part of parts) {\n const rcsMessage = part.RCSMessage;\n\n // Suggested chip list (message-level)\n if (rcsMessage.suggestedChipList?.suggestions) {\n suggestions.push(...rcsMessage.suggestedChipList.suggestions);\n }\n\n // Single card suggestions (card-level)\n const card = rcsMessage.richcardMessage?.message?.generalPurposeCard;\n if (card?.content.suggestions) {\n suggestions.push(...card.content.suggestions);\n }\n\n // Carousel card suggestions (card-level)\n const carousel = rcsMessage.richcardMessage?.message?.generalPurposeCardCarousel;\n if (carousel) {\n for (const cardContent of carousel.content) {\n if (cardContent.suggestions) {\n suggestions.push(...cardContent.suggestions);\n }\n }\n }\n }\n\n return suggestions;\n}\n\n/**\n * Create a user reply message\n */\nexport function createUserReplyMessage(text: string): ChatMessage {\n return {\n id: `user-${Date.now()}`,\n sender: 'user',\n content: {\n type: 'userReply',\n text,\n },\n timestamp: Date.now(),\n };\n}\n\n/**\n * Validate RBM conversation flow structure\n */\nexport function validateConversationFlow(flow: unknown): flow is RbmConversationFlow {\n if (!flow || typeof flow !== 'object') return false;\n \n const f = flow as Record<string, unknown>;\n \n if (typeof f.name !== 'string') return false;\n if (!f.messages || typeof f.messages !== 'object') return false;\n \n // Check at least one message exists\n const messages = Object.values(f.messages as Record<string, unknown>);\n if (messages.length === 0) return false;\n \n // Validate each message has required fields\n for (const msg of messages) {\n if (!msg || typeof msg !== 'object') return false;\n const m = msg as Record<string, unknown>;\n if (typeof m.id !== 'string') return false;\n if (!Array.isArray(m.parts)) return false;\n }\n \n return true;\n}\n\n/**\n * Get preview text from the first message for lock screen notification\n */\nexport function getFirstMessagePreview(flow: RbmConversationFlow): string {\n const firstMessage = findFirstMessage(flow);\n if (!firstMessage || !firstMessage.parts.length) return \"New message\";\n\n const part = firstMessage.parts[0];\n const rcsMessage = part.RCSMessage;\n\n // Text message\n if (rcsMessage.textMessage) {\n return rcsMessage.textMessage.slice(0, 50) + (rcsMessage.textMessage.length > 50 ? '...' : '');\n }\n\n // Rich card\n const card = rcsMessage.richcardMessage?.message?.generalPurposeCard;\n if (card?.content.title) {\n return card.content.title;\n }\n\n // Carousel\n const carousel = rcsMessage.richcardMessage?.message?.generalPurposeCardCarousel;\n if (carousel?.content[0]?.title) {\n return carousel.content[0].title;\n }\n\n return \"New message\";\n}\n\n","/**\n * useConversation Hook\n *\n * Manages conversation flow state, navigation between message nodes,\n * and chat history.\n */\n\nimport { useReducer, useCallback, useEffect, useRef } from \"react\";\nimport type {\n ConversationState,\n ConversationAction,\n UserReplyPayload,\n} from \"../types/emulator.types\";\nimport type { RbmConversationFlow, RbmSuggestion } from \"../types/rbm.types\";\nimport { isSuggestedReply, isSuggestedAction } from \"../types/rbm.types\";\nimport {\n findFirstMessage,\n getMessageById,\n findNextMessageId,\n parseMessageParts,\n createUserReplyMessage,\n} from \"../utils/messageParser\";\n\nconst initialState: ConversationState = {\n currentMessageId: null,\n chatHistory: [],\n isTyping: false,\n error: null,\n};\n\nfunction conversationReducer(\n state: ConversationState,\n action: ConversationAction\n): ConversationState {\n switch (action.type) {\n case \"INIT\":\n return {\n ...state,\n currentMessageId: action.messageId,\n error: null,\n };\n\n case \"ADD_BUSINESS_MESSAGE\":\n return {\n ...state,\n chatHistory: [...state.chatHistory, action.message],\n isTyping: false,\n };\n\n case \"ADD_USER_REPLY\": {\n const userMessage = createUserReplyMessage(action.text);\n // Remove suggestions from previous business message\n const updatedHistory = state.chatHistory.map((msg, idx) =>\n idx === state.chatHistory.length - 1\n ? { ...msg, suggestions: undefined }\n : msg\n );\n return {\n ...state,\n chatHistory: [...updatedHistory, userMessage],\n };\n }\n\n case \"SET_TYPING\":\n return {\n ...state,\n isTyping: action.isTyping,\n };\n\n case \"NAVIGATE_TO\":\n return {\n ...state,\n currentMessageId: action.messageId,\n };\n\n case \"SET_ERROR\":\n return {\n ...state,\n error: action.error,\n isTyping: false,\n };\n\n case \"RESET\":\n return initialState;\n\n default:\n return state;\n }\n}\n\ninterface UseConversationOptions {\n flow: RbmConversationFlow;\n onUserReply: (payload: UserReplyPayload) => void;\n typingDelay?: number;\n}\n\nexport function useConversation({\n flow,\n onUserReply,\n typingDelay = 800,\n}: UseConversationOptions) {\n const [state, dispatch] = useReducer(conversationReducer, initialState);\n const messageIndexRef = useRef(0);\n const initializedRef = useRef(false);\n\n // Initialize conversation with first message\n useEffect(() => {\n if (initializedRef.current) return;\n initializedRef.current = true;\n\n const firstMessage = findFirstMessage(flow);\n if (!firstMessage) {\n dispatch({\n type: \"SET_ERROR\",\n error: \"No first message found in conversation flow\",\n });\n return;\n }\n\n dispatch({ type: \"INIT\", messageId: firstMessage.id });\n\n // Add first message to chat history\n const chatMessage = parseMessageParts(\n firstMessage,\n messageIndexRef.current++\n );\n dispatch({ type: \"ADD_BUSINESS_MESSAGE\", message: chatMessage });\n }, [flow]);\n\n // Handle user selecting a suggested reply\n const handleReply = useCallback(\n (suggestion: RbmSuggestion) => {\n if (!isSuggestedReply(suggestion)) return;\n\n const { displayText, postback } = suggestion.reply;\n const postbackData = postback.data;\n\n // Add user reply to chat\n dispatch({ type: \"ADD_USER_REPLY\", text: displayText, postbackData });\n\n // Emit callback\n const payload: UserReplyPayload = {\n type: \"reply\",\n postbackData,\n displayText,\n timestamp: Date.now(),\n };\n onUserReply(payload);\n\n // Find current message and next message\n const currentMessage = state.currentMessageId\n ? getMessageById(flow, state.currentMessageId)\n : null;\n\n if (!currentMessage) {\n dispatch({ type: \"SET_ERROR\", error: \"Current message not found\" });\n return;\n }\n\n const nextMessageId = findNextMessageId(currentMessage, postbackData);\n if (!nextMessageId) {\n // End of conversation or no matching response\n return;\n }\n\n const nextMessage = getMessageById(flow, nextMessageId);\n if (!nextMessage) {\n dispatch({\n type: \"SET_ERROR\",\n error: `Next message \"${nextMessageId}\" not found`,\n });\n return;\n }\n\n // Show typing indicator then add next message\n dispatch({ type: \"SET_TYPING\", isTyping: true });\n dispatch({ type: \"NAVIGATE_TO\", messageId: nextMessageId });\n\n setTimeout(() => {\n const chatMessage = parseMessageParts(\n nextMessage,\n messageIndexRef.current++\n );\n dispatch({ type: \"ADD_BUSINESS_MESSAGE\", message: chatMessage });\n }, typingDelay);\n },\n [flow, state.currentMessageId, onUserReply, typingDelay]\n );\n\n // Handle user clicking a suggested action\n const handleAction = useCallback(\n (suggestion: RbmSuggestion) => {\n if (!isSuggestedAction(suggestion)) return;\n\n const {\n displayText,\n postback,\n openUrlAction,\n dialAction,\n dialerAction,\n mapAction,\n viewLocationAction,\n } = suggestion.action;\n const postbackData = postback.data;\n\n // Get phone number from either format\n const phoneNumber =\n dialAction?.phoneNumber || dialerAction?.dialPhoneNumber?.phoneNumber;\n\n // Get location from either format\n const location =\n mapAction?.showLocation?.location || viewLocationAction?.latLong;\n\n // Build action data\n let actionData: UserReplyPayload[\"actionData\"];\n if (openUrlAction) {\n actionData = { type: \"openUrl\", url: openUrlAction.url };\n } else if (phoneNumber) {\n actionData = { type: \"dial\", phoneNumber };\n } else if (location) {\n actionData = {\n type: \"viewLocation\",\n latitude: location.latitude,\n longitude: location.longitude,\n query: viewLocationAction?.query,\n };\n }\n\n // Emit callback with action data\n const payload: UserReplyPayload = {\n type: \"action\",\n postbackData,\n displayText,\n timestamp: Date.now(),\n actionData,\n };\n onUserReply(payload);\n\n // Execute action\n if (openUrlAction) {\n window.open(openUrlAction.url, \"_blank\", \"noopener,noreferrer\");\n } else if (phoneNumber) {\n window.location.href = `tel:${phoneNumber}`;\n } else if (location) {\n // Open Google Maps with location\n const label =\n mapAction?.showLocation?.location?.label ||\n viewLocationAction?.label ||\n \"\";\n const mapsUrl = `https://www.google.com/maps/search/?api=1&query=${\n location.latitude\n },${location.longitude}${\n label ? `&query_place_id=${encodeURIComponent(label)}` : \"\"\n }`;\n window.open(mapsUrl, \"_blank\", \"noopener,noreferrer\");\n }\n\n // For actions, also try to navigate if there's a next message\n const currentMessage = state.currentMessageId\n ? getMessageById(flow, state.currentMessageId)\n : null;\n\n if (currentMessage) {\n const nextMessageId = findNextMessageId(currentMessage, postbackData);\n if (nextMessageId) {\n const nextMessage = getMessageById(flow, nextMessageId);\n if (nextMessage) {\n dispatch({\n type: \"ADD_USER_REPLY\",\n text: displayText,\n postbackData,\n });\n dispatch({ type: \"SET_TYPING\", isTyping: true });\n dispatch({ type: \"NAVIGATE_TO\", messageId: nextMessageId });\n\n setTimeout(() => {\n const chatMessage = parseMessageParts(\n nextMessage,\n messageIndexRef.current++\n );\n dispatch({ type: \"ADD_BUSINESS_MESSAGE\", message: chatMessage });\n }, typingDelay);\n }\n }\n }\n },\n [flow, state.currentMessageId, onUserReply, typingDelay]\n );\n\n // Reset conversation\n const reset = useCallback(() => {\n initializedRef.current = false;\n messageIndexRef.current = 0;\n dispatch({ type: \"RESET\" });\n }, []);\n\n return {\n state,\n handleReply,\n handleAction,\n reset,\n };\n}\n","/**\n * useJsonFetch Hook\n *\n * Fetches RBM conversation flow JSON from a URL.\n */\n\nimport { useState, useEffect, useCallback } from \"react\";\nimport type { RbmConversationFlow } from \"../types/rbm.types\";\n\nexport interface UseJsonFetchResult {\n /** Fetched data */\n data: RbmConversationFlow | null;\n /** Loading state */\n isLoading: boolean;\n /** Error message if fetch failed */\n error: string | null;\n /** Refetch function */\n refetch: () => void;\n}\n\nexport function useJsonFetch(url: string | undefined): UseJsonFetchResult {\n const [data, setData] = useState<RbmConversationFlow | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const fetchJson = useCallback(async () => {\n if (!url) {\n setData(null);\n setError(null);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const response = await fetch(url, {\n method: \"GET\",\n headers: {\n Accept: \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const json = await response.json();\n\n // Validate basic structure\n if (!json || typeof json !== \"object\") {\n throw new Error(\"Invalid JSON: Expected an object\");\n }\n\n if (!json.messages || typeof json.messages !== \"object\") {\n throw new Error(\"Invalid RBM JSON: Missing 'messages' object\");\n }\n\n setData(json as RbmConversationFlow);\n } catch (err) {\n const message =\n err instanceof Error ? err.message : \"Failed to fetch JSON\";\n setError(message);\n setData(null);\n } finally {\n setIsLoading(false);\n }\n }, [url]);\n\n useEffect(() => {\n fetchJson();\n }, [fetchJson]);\n\n return {\n data,\n isLoading,\n error,\n refetch: fetchJson,\n };\n}\n\n\n","/**\n * useAutoScroll Hook\n * \n * Automatically scrolls to bottom when new messages are added,\n * mimicking real chat app behavior.\n */\n\nimport { useEffect, useRef, type RefObject } from 'react';\n\nexport function useAutoScroll<T extends HTMLElement>(\n dependency: unknown\n): RefObject<T | null> {\n const scrollRef = useRef<T>(null);\n\n useEffect(() => {\n if (scrollRef.current) {\n scrollRef.current.scrollTo({\n top: scrollRef.current.scrollHeight,\n behavior: 'smooth',\n });\n }\n }, [dependency]);\n\n return scrollRef;\n}\n\n","/**\n * BusinessHeader Component\n *\n * Displays business branding at the top of the chat window.\n * Styled to match Google Messages RCS appearance.\n */\n\nimport { memo } from \"react\";\nimport { useEmulator } from \"../../context/EmulatorContext\";\n\nexport const BusinessHeader = memo(function BusinessHeader() {\n const { theme, businessInfo, toggleProfile } = useEmulator();\n\n const isDark = theme === \"dark\";\n const brandColor = businessInfo.brandColor || \"#0084ff\";\n\n return (\n <header\n className={`\n flex items-center gap-3 px-3 py-2.5 border-b\n ${isDark ? \"bg-zinc-900 border-zinc-800\" : \"bg-white border-gray-100\"}\n `}\n role=\"banner\"\n aria-label={`Chat with ${businessInfo.name}`}\n >\n {/* Back button */}\n <button\n type=\"button\"\n className={`\n p-1.5 -ml-1 rounded-full transition-colors\n ${isDark ? \"hover:bg-zinc-800 text-white\" : \"hover:bg-gray-100 text-gray-700\"}\n `}\n aria-label=\"Go back\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n\n {/* Clickable Business Info Section */}\n <button\n onClick={toggleProfile}\n className=\"flex items-center gap-2.5 flex-1 min-w-0 text-left\"\n aria-label=\"View business info\"\n >\n {/* Logo */}\n <div\n className={`\n relative w-9 h-9 rounded-full overflow-hidden flex-shrink-0\n ${isDark ? \"bg-zinc-800\" : \"bg-gray-100\"}\n `}\n style={{\n backgroundColor: businessInfo.logo ? undefined : brandColor,\n }}\n >\n {businessInfo.logo ? (\n <img\n src={businessInfo.logo}\n alt={`${businessInfo.name} logo`}\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <div className=\"w-full h-full flex items-center justify-center text-sm font-bold text-white\">\n {businessInfo.name.charAt(0).toUpperCase()}\n </div>\n )}\n </div>\n\n {/* Business Name */}\n <h1\n className={`\n text-base font-medium truncate\n ${isDark ? \"text-white\" : \"text-gray-900\"}\n `}\n >\n {businessInfo.name}\n </h1>\n </button>\n\n {/* Action Buttons */}\n <div className=\"flex items-center gap-0.5\">\n {/* Verified badge button */}\n {businessInfo.verified && (\n <button\n type=\"button\"\n className={`\n p-2 rounded-full transition-colors\n ${isDark ? \"hover:bg-zinc-800\" : \"hover:bg-gray-100\"}\n `}\n aria-label=\"Verified business\"\n >\n <svg className=\"w-5 h-5\" viewBox=\"0 0 24 24\" fill=\"none\">\n {/* Shield outline */}\n <path\n d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\"\n stroke={isDark ? \"#9ca3af\" : \"#6b7280\"}\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n {/* Checkmark */}\n <path\n d=\"M9 12l2 2 4-4\"\n stroke=\"#3b82f6\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n\n {/* More options */}\n <button\n type=\"button\"\n className={`\n p-2 rounded-full transition-colors\n ${isDark ? \"hover:bg-zinc-800 text-zinc-400\" : \"hover:bg-gray-100 text-gray-500\"}\n `}\n aria-label=\"More options\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 5v.01M12 12v.01M12 19v.01M12 6a1 1 0 110-2 1 1 0 010 2zm0 7a1 1 0 110-2 1 1 0 010 2zm0 7a1 1 0 110-2 1 1 0 010 2z\" />\n </svg>\n </button>\n </div>\n </header>\n );\n});\n","/**\n * BrandedHero Component\n *\n * Displays the business branding at the top of the chat (logo, name, tagline).\n * This is the branded intro section shown before messages.\n */\n\nimport { memo } from \"react\";\nimport { useEmulator } from \"../../context/EmulatorContext\";\n\nexport const BrandedHero = memo(function BrandedHero() {\n const { theme, businessInfo } = useEmulator();\n\n const isDark = theme === \"dark\";\n const brandColor = businessInfo.brandColor || \"#0084ff\";\n\n return (\n <div className=\"flex flex-col items-center py-4 px-4\">\n {/* Logo with verified badge */}\n <div className=\"relative mb-3\">\n <div\n className={`\n w-16 h-16 rounded-full overflow-hidden\n ${isDark ? \"bg-zinc-800\" : \"bg-gray-100\"}\n shadow-lg\n `}\n style={{\n backgroundColor: businessInfo.logo ? undefined : brandColor,\n }}\n >\n {businessInfo.logo ? (\n <img\n src={businessInfo.logo}\n alt={`${businessInfo.name} logo`}\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <div className=\"w-full h-full flex items-center justify-center text-2xl font-bold text-white\">\n {businessInfo.name.charAt(0).toUpperCase()}\n </div>\n )}\n </div>\n \n {/* Verified badge */}\n {businessInfo.verified && (\n <div\n className=\"absolute -bottom-0.5 -right-0.5 w-5 h-5 rounded-full bg-blue-500 flex items-center justify-center border-2 border-white shadow-sm\"\n >\n <svg\n className=\"w-3 h-3 text-white\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n >\n <path d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41L9 16.17z\" />\n </svg>\n </div>\n )}\n </div>\n\n {/* Business name */}\n <h1\n className={`\n text-lg font-semibold text-center\n ${isDark ? \"text-white\" : \"text-gray-900\"}\n `}\n >\n {businessInfo.name}\n </h1>\n\n {/* Tagline/description */}\n {businessInfo.description && (\n <p\n className={`\n text-sm text-center mt-0.5\n ${isDark ? \"text-zinc-400\" : \"text-gray-500\"}\n `}\n >\n {businessInfo.description}\n </p>\n )}\n </div>\n );\n});\n\nexport default BrandedHero;\n\n","/**\n * TextMessage Component\n *\n * Renders a simple text message bubble.\n * Styled to match Google Messages RCS appearance.\n */\n\nimport { memo } from \"react\";\nimport { useEmulator } from \"../../context/EmulatorContext\";\n\ninterface TextMessageProps {\n text: string;\n sender: \"business\" | \"user\";\n timestamp: number;\n}\n\nexport const TextMessage = memo(function TextMessage({\n text,\n sender,\n timestamp,\n}: TextMessageProps) {\n const { theme, businessInfo } = useEmulator();\n\n const isDark = theme === \"dark\";\n const isBusiness = sender === \"business\";\n const brandColor = businessInfo.brandColor || \"#0084ff\";\n\n const formattedTime = new Date(timestamp).toLocaleTimeString([], {\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n\n if (isBusiness) {\n return (\n <div className=\"max-w-[90%]\">\n <div\n className={`\n px-4 py-3 rounded-2xl text-sm leading-relaxed\n ${isDark ? \"bg-zinc-800 text-white\" : \"bg-gray-100 text-gray-900\"}\n `}\n >\n {text}\n </div>\n <span className=\"sr-only\">{formattedTime}</span>\n </div>\n );\n }\n\n // User message with checkmark\n return (\n <div className=\"flex items-end gap-1.5 max-w-[85%] ml-auto\">\n <div\n className=\"px-4 py-2.5 rounded-full text-white text-sm leading-relaxed\"\n style={{ backgroundColor: brandColor }}\n >\n {text}\n </div>\n <div\n className=\"w-5 h-5 rounded-full flex items-center justify-center flex-shrink-0\"\n style={{ backgroundColor: brandColor }}\n >\n <svg\n className=\"w-3 h-3 text-white\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={3}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 13l4 4L19 7\" />\n </svg>\n </div>\n <span className=\"sr-only\">{formattedTime}</span>\n </div>\n );\n});\n","/**\n * UserReply Component\n *\n * Renders a user's reply message bubble with delivery status.\n * Styled to match Google Messages RCS appearance.\n */\n\nimport { memo } from \"react\";\nimport { useEmulator } from \"../../context/EmulatorContext\";\n\ninterface UserReplyProps {\n text: string;\n timestamp: number;\n}\n\nexport const UserReply = memo(function UserReply({\n text,\n timestamp,\n}: UserReplyProps) {\n const { businessInfo } = useEmulator();\n const brandColor = businessInfo.brandColor || \"#0084ff\";\n\n const formattedTime = new Date(timestamp).toLocaleTimeString([], {\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n\n return (\n <div className=\"flex items-end gap-1.5 max-w-[85%] ml-auto\">\n {/* Message bubble */}\n <div\n className=\"px-4 py-2.5 rounded-full text-white text-sm leading-relaxed shadow-sm\"\n style={{ backgroundColor: brandColor }}\n >\n {text}\n </div>\n\n {/* Delivery status checkmark */}\n <div\n className=\"w-5 h-5 rounded-full flex items-center justify-center flex-shrink-0\"\n style={{ backgroundColor: brandColor }}\n >\n <svg\n className=\"w-3 h-3 text-white\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={3}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n </div>\n\n {/* Timestamp - screen reader only */}\n <span className=\"sr-only\">{formattedTime}</span>\n </div>\n );\n});\n","/**\n * RichCard Component\n *\n * Renders a rich card with media, title, description, and suggestions.\n * Styled to match Google Messages RCS appearance.\n */\n\nimport { memo } from \"react\";\nimport { useEmulator } from \"../../context/EmulatorContext\";\nimport type { RichCardData } from \"../../types/emulator.types\";\nimport type { RbmSuggestion } from \"../../types/rbm.types\";\nimport { isSuggestedAction } from \"../../types/rbm.types\";\n\ninterface RichCardProps {\n card: RichCardData;\n timestamp: number;\n}\n\n/**\n * RichCard always shows its card-level suggestions.\n * Card suggestions are tied to the card content and persist.\n * (Unlike message-level chips which disappear after selection)\n */\nexport const RichCard = memo(function RichCard({\n card,\n timestamp,\n}: RichCardProps) {\n const { theme, handleReply, handleAction } = useEmulator();\n\n const isDark = theme === \"dark\";\n\n const formattedTime = new Date(timestamp).toLocaleTimeString([], {\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n\n const handleSuggestionClick = (suggestion: RbmSuggestion) => {\n if (\"reply\" in suggestion) {\n handleReply(suggestion);\n } else {\n handleAction(suggestion);\n }\n };\n\n // Height mappings for media\n const heightMap = {\n short: \"h-36\",\n medium: \"h-44\",\n tall: \"h-56\",\n };\n\n // Generate a lighter tint of brand color for card background\n const cardBgColor = isDark ? \"bg-zinc-800\" : `bg-[#e8f5e9]`; // Mint/teal like Google Messages\n\n return (\n <div className=\"w-full\">\n <div\n className={`\n overflow-hidden rounded-2xl w-full shadow-sm\n ${cardBgColor}\n `}\n >\n {/* Media - Full width with rounded top corners */}\n {card.media && (\n <div\n className={`\n w-full overflow-hidden\n ${heightMap[card.media.height]}\n `}\n >\n <img\n src={card.media.url}\n alt={card.title || \"Rich card media\"}\n className=\"w-full h-full object-cover\"\n loading=\"lazy\"\n />\n </div>\n )}\n\n {/* Content */}\n <div className=\"p-4\">\n {card.title && (\n <h3\n className={`\n text-base font-semibold leading-snug\n ${isDark ? \"text-white\" : \"text-gray-900\"}\n `}\n >\n {card.title}\n </h3>\n )}\n\n {card.description && (\n <p\n className={`\n text-sm leading-relaxed mt-1.5\n ${isDark ? \"text-zinc-300\" : \"text-gray-700\"}\n `}\n >\n {card.description}\n </p>\n )}\n\n {/* Card-level suggestions - Grouped list style */}\n {card.suggestions && card.suggestions.length > 0 && (\n <div\n className={`\n mt-4 rounded-xl overflow-hidden divide-y\n ${isDark ? \"divide-zinc-700 bg-zinc-800\" : \"divide-gray-100 bg-white\"}\n `}\n >\n {card.suggestions.map((suggestion, idx) => (\n <RichCardSuggestionItem\n key={idx}\n suggestion={suggestion}\n onClick={() => handleSuggestionClick(suggestion)}\n isDark={isDark}\n />\n ))}\n </div>\n )}\n </div>\n </div>\n\n {/* Timestamp - hidden for cleaner look, can be shown if needed */}\n <span className=\"sr-only\">{formattedTime}</span>\n </div>\n );\n});\n\n// Suggestion item for rich card (flat list style)\ninterface RichCardSuggestionItemProps {\n suggestion: RbmSuggestion;\n onClick: () => void;\n isDark: boolean;\n}\n\n// Icon color for all action types (gray/muted)\nconst ICON_CLASS = \"w-5 h-5 text-gray-400\";\n\n// Globe icon for URL actions\nconst GlobeIcon = () => (\n <svg className={ICON_CLASS} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9\" />\n </svg>\n);\n\n// Phone icon for dial actions\nconst PhoneIcon = () => (\n <svg className={ICON_CLASS} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3 5a2 2 0 012-2h3.28a1 1 0 01.948.684l1.498 4.493a1 1 0 01-.502 1.21l-2.257 1.13a11.042 11.042 0 005.516 5.516l1.13-2.257a1 1 0 011.21-.502l4.493 1.498a1 1 0 01.684.949V19a2 2 0 01-2 2h-1C9.716 21 3 14.284 3 6V5z\" />\n </svg>\n);\n\n// Map marker icon for location actions\nconst MapMarkerIcon = () => (\n <svg className={ICON_CLASS} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15 11a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n);\n\n// Calendar icon\nconst CalendarIcon = () => (\n <svg className={ICON_CLASS} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n);\n\n// Reply/chat icon for suggested replies\nconst ReplyIcon = () => (\n <svg className={ICON_CLASS} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z\" />\n </svg>\n);\n\nconst RichCardSuggestionItem = memo(function RichCardSuggestionItem({\n suggestion,\n onClick,\n isDark,\n}: RichCardSuggestionItemProps) {\n const isAction = isSuggestedAction(suggestion);\n const displayText = isAction\n ? suggestion.action.displayText\n : suggestion.reply.displayText;\n\n // Get icon for action type (all gray)\n const getActionIcon = () => {\n if (!isAction) return <ReplyIcon />;\n\n const { action } = suggestion;\n\n if (action.urlAction || action.openUrlAction) return <GlobeIcon />;\n if (action.dialerAction || action.dialAction) return <PhoneIcon />;\n if (action.mapAction || action.viewLocationAction) return <MapMarkerIcon />;\n if (action.calendarAction || action.createCalendarEventAction) return <CalendarIcon />;\n\n return <ReplyIcon />;\n };\n\n return (\n <button\n onClick={onClick}\n className={`\n w-full flex items-center gap-3 px-4 py-3 text-left transition-colors\n ${isDark ? \"hover:bg-zinc-700\" : \"hover:bg-gray-50\"}\n `}\n >\n <span className=\"flex-shrink-0\">{getActionIcon()}</span>\n <span className={`text-sm ${isDark ? \"text-white\" : \"text-gray-900\"}`}>\n {displayText}\n </span>\n </button>\n );\n});\n","/**\n * Carousel Component\n *\n * Renders a horizontally scrollable carousel of rich cards.\n * Styled to match Google Messages RCS appearance.\n */\n\nimport { memo, useRef, useState, useCallback } from \"react\";\nimport { useEmulator } from \"../../context/EmulatorContext\";\nimport type { RichCardData } from \"../../types/emulator.types\";\nimport type { RbmSuggestion } from \"../../types/rbm.types\";\nimport { isSuggestedAction } from \"../../types/rbm.types\";\n\ninterface CarouselProps {\n cards: RichCardData[];\n timestamp: number;\n}\n\nexport const Carousel = memo(function Carousel({ cards, timestamp }: CarouselProps) {\n const { theme, handleReply, handleAction } = useEmulator();\n const scrollRef = useRef<HTMLDivElement>(null);\n const [canScrollLeft, setCanScrollLeft] = useState(false);\n const [canScrollRight, setCanScrollRight] = useState(cards.length > 1);\n\n const isDark = theme === \"dark\";\n\n const formattedTime = new Date(timestamp).toLocaleTimeString([], {\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n\n const handleSuggestionClick = (suggestion: RbmSuggestion) => {\n if (\"reply\" in suggestion) {\n handleReply(suggestion);\n } else {\n handleAction(suggestion);\n }\n };\n\n const updateScrollButtons = useCallback(() => {\n if (scrollRef.current) {\n const { scrollLeft, scrollWidth, clientWidth } = scrollRef.current;\n setCanScrollLeft(scrollLeft > 0);\n setCanScrollRight(scrollLeft < scrollWidth - clientWidth - 10);\n }\n }, []);\n\n const scroll = (direction: \"left\" | \"right\") => {\n if (scrollRef.current) {\n const scrollAmount = 200;\n scrollRef.current.scrollBy({\n left: direction === \"left\" ? -scrollAmount : scrollAmount,\n behavior: \"smooth\",\n });\n }\n };\n\n return (\n <div className=\"w-full -mx-3\">\n {/* Carousel Container */}\n <div className=\"relative\">\n {/* Left Arrow */}\n {canScrollLeft && (\n <button\n onClick={() => scroll(\"left\")}\n className={`\n absolute left-2 top-1/2 -translate-y-1/2 z-10\n w-8 h-8 rounded-full flex items-center justify-center\n shadow-lg transition-opacity\n ${isDark ? \"bg-zinc-700 text-white\" : \"bg-white text-gray-700\"}\n `}\n aria-label=\"Scroll left\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n )}\n\n {/* Cards Container */}\n <div\n ref={scrollRef}\n onScroll={updateScrollButtons}\n className=\"flex gap-2.5 overflow-x-auto py-1 px-3 snap-x snap-mandatory\"\n style={{ scrollbarWidth: \"none\", msOverflowStyle: \"none\" }}\n >\n {cards.map((card, idx) => (\n <CarouselCard\n key={idx}\n card={card}\n isDark={isDark}\n onSuggestionClick={handleSuggestionClick}\n />\n ))}\n </div>\n\n {/* Right Arrow */}\n {canScrollRight && (\n <button\n onClick={() => scroll(\"right\")}\n className={`\n absolute right-2 top-1/2 -translate-y-1/2 z-10\n w-8 h-8 rounded-full flex items-center justify-center\n shadow-lg transition-opacity\n ${isDark ? \"bg-zinc-700 text-white\" : \"bg-white text-gray-700\"}\n `}\n aria-label=\"Scroll right\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n )}\n </div>\n\n {/* Timestamp - screen reader only */}\n <span className=\"sr-only\">{formattedTime}</span>\n </div>\n );\n});\n\n// Individual carousel card\ninterface CarouselCardProps {\n card: RichCardData;\n isDark: boolean;\n onSuggestionClick: (suggestion: RbmSuggestion) => void;\n}\n\n// Gray icon class for carousel actions\nconst CAROUSEL_ICON_CLASS = \"w-4 h-4 text-gray-400\";\n\n// Get icon for carousel card action (all gray)\nconst getCarouselActionIcon = (suggestion: RbmSuggestion) => {\n if (!isSuggestedAction(suggestion)) {\n return (\n <svg className={CAROUSEL_ICON_CLASS} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z\" />\n </svg>\n );\n }\n\n const { action } = suggestion;\n\n // URL actions\n if (action.urlAction || action.openUrlAction) {\n return (\n <svg className={CAROUSEL_ICON_CLASS} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9\" />\n </svg>\n );\n }\n\n // Phone actions\n if (action.dialerAction || action.dialAction) {\n return (\n <svg className={CAROUSEL_ICON_CLASS} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3 5a2 2 0 012-2h3.28a1 1 0 01.948.684l1.498 4.493a1 1 0 01-.502 1.21l-2.257 1.13a11.042 11.042 0 005.516 5.516l1.13-2.257a1 1 0 011.21-.502l4.493 1.498a1 1 0 01.684.949V19a2 2 0 01-2 2h-1C9.716 21 3 14.284 3 6V5z\" />\n </svg>\n );\n }\n\n // Map actions\n if (action.mapAction || action.viewLocationAction) {\n return (\n <svg className={CAROUSEL_ICON_CLASS} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15 11a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n );\n }\n\n // Calendar\n if (action.calendarAction || action.createCalendarEventAction) {\n return (\n <svg className={CAROUSEL_ICON_CLASS} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n );\n }\n\n return (\n <svg className={CAROUSEL_ICON_CLASS} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z\" />\n </svg>\n );\n};\n\nconst CarouselCard = memo(function CarouselCard({\n card,\n isDark,\n onSuggestionClick,\n}: CarouselCardProps) {\n const widthClass = card.layout.width === \"small\" ? \"w-44\" : \"w-52\";\n\n return (\n <div\n className={`\n flex-shrink-0 snap-start rounded-2xl overflow-hidden shadow-sm\n ${widthClass}\n ${isDark ? \"bg-zinc-800\" : \"bg-[#e8f5e9]\"}\n `}\n >\n {/* Media */}\n {card.media && (\n <div className=\"w-full h-32 bg-gray-200 overflow-hidden\">\n <img\n src={card.media.url}\n alt={card.title || \"Carousel card media\"}\n className=\"w-full h-full object-cover\"\n loading=\"lazy\"\n />\n </div>\n )}\n\n {/* Content */}\n <div className=\"p-3\">\n {card.title && (\n <h4\n className={`\n text-sm font-semibold leading-tight mb-1 line-clamp-2\n ${isDark ? \"text-white\" : \"text-gray-900\"}\n `}\n >\n {card.title}\n </h4>\n )}\n\n {card.description && (\n <p\n className={`\n text-xs leading-relaxed line-clamp-3\n ${isDark ? \"text-zinc-400\" : \"text-gray-700\"}\n `}\n >\n {card.description}\n </p>\n )}\n\n {/* Suggestions - flat list style */}\n {card.suggestions && card.suggestions.length > 0 && (\n <div\n className={`\n mt-3 rounded-lg overflow-hidden divide-y\n ${isDark ? \"divide-zinc-600 bg-zinc-700\" : \"divide-gray-100 bg-white\"}\n `}\n >\n {card.suggestions.map((suggestion, idx) => {\n const isAction = isSuggestedAction(suggestion);\n const displayText = isAction\n ? suggestion.action.displayText\n : suggestion.reply.displayText;\n\n return (\n <button\n key={idx}\n onClick={() => onSuggestionClick(suggestion)}\n className={`\n w-full flex items-center gap-2 px-3 py-2.5\n text-xs transition-colors text-left\n ${isDark ? \"hover:bg-zinc-600 text-white\" : \"hover:bg-gray-50 text-gray-900\"}\n `}\n >\n <span className=\"flex-shrink-0\">{getCarouselActionIcon(suggestion)}</span>\n <span className=\"truncate\">{displayText}</span>\n </button>\n );\n })}\n </div>\n )}\n </div>\n </div>\n );\n});\n","/**\n * MessageRenderer Component\n * \n * Factory component that renders the appropriate message type\n * based on content using a registry pattern.\n */\n\nimport { memo, type ComponentType } from 'react';\nimport type { ChatMessage, MessageContent } from '../../types/emulator.types';\nimport { TextMessage } from './TextMessage';\nimport { UserReply } from './UserReply';\nimport { RichCard } from './RichCard';\nimport { Carousel } from './Carousel';\n\ninterface MessageRendererProps {\n message: ChatMessage;\n isLast: boolean;\n}\n\n// Type for renderer component props\ntype RendererProps = {\n content: MessageContent;\n sender: 'business' | 'user';\n timestamp: number;\n showSuggestions: boolean;\n};\n\n// Registry of content type to renderer\nconst renderers: Record<\n MessageContent['type'],\n ComponentType<RendererProps>\n> = {\n text: ({ content, sender, timestamp }) => {\n if (content.type !== 'text') return null;\n return <TextMessage text={content.text} sender={sender} timestamp={timestamp} />;\n },\n userReply: ({ content, timestamp }) => {\n if (content.type !== 'userReply') return null;\n return <UserReply text={content.text} timestamp={timestamp} />;\n },\n richcard: ({ content, timestamp }) => {\n if (content.type !== 'richcard') return null;\n // Card-level suggestions always show on the card itself\n return <RichCard card={content.card} timestamp={timestamp} />;\n },\n carousel: ({ content, timestamp }) => {\n if (content.type !== 'carousel') return null;\n return <Carousel cards={content.cards} timestamp={timestamp} />;\n },\n};\n\nexport const MessageRenderer = memo(function MessageRenderer({\n message,\n isLast,\n}: MessageRendererProps) {\n const { content, sender, timestamp } = message;\n \n const Renderer = renderers[content.type];\n \n if (!Renderer) {\n // Fallback for unknown message types\n console.warn(`Unknown message type: ${content.type}`);\n return (\n <div className=\"px-4 py-2 text-gray-500 text-sm italic\">\n [Unsupported message type]\n </div>\n );\n }\n\n return (\n <Renderer\n content={content}\n sender={sender}\n timestamp={timestamp}\n showSuggestions={isLast && sender === 'business'}\n />\n );\n});\n\n// Export individual renderers for testing\nexport { TextMessage, UserReply, RichCard, Carousel };\n\n","/**\n * TypingIndicator Component\n * \n * Shows animated dots to indicate the business is typing.\n */\n\nimport { memo } from 'react';\nimport { useEmulator } from '../../context/EmulatorContext';\n\nexport const TypingIndicator = memo(function TypingIndicator() {\n const { theme } = useEmulator();\n\n const isDark = theme === 'dark';\n\n return (\n <div\n className=\"flex items-start gap-2 px-4 py-2\"\n role=\"status\"\n aria-label=\"Business is typing\"\n >\n <div\n className={`\n inline-flex items-center gap-1 px-4 py-3 rounded-2xl rounded-bl-sm\n ${isDark ? 'bg-zinc-800' : 'bg-gray-100'}\n `}\n >\n <span\n className={`\n rcs-typing-dot w-2 h-2 rounded-full\n ${isDark ? 'bg-zinc-500' : 'bg-gray-400'}\n `}\n />\n <span\n className={`\n rcs-typing-dot w-2 h-2 rounded-full\n ${isDark ? 'bg-zinc-500' : 'bg-gray-400'}\n `}\n />\n <span\n className={`\n rcs-typing-dot w-2 h-2 rounded-full\n ${isDark ? 'bg-zinc-500' : 'bg-gray-400'}\n `}\n />\n </div>\n </div>\n );\n});\n\n","/**\n * MessageList Component\n *\n * Renders the list of chat messages with date dividers.\n * Styled to match Google Messages RCS appearance.\n */\n\nimport { memo } from \"react\";\nimport { useEmulator } from \"../../context/EmulatorContext\";\nimport { MessageRenderer } from \"../Message\";\nimport { TypingIndicator } from \"../TypingIndicator\";\n\nexport const MessageList = memo(function MessageList() {\n const { theme, state } = useEmulator();\n const { chatHistory, isTyping } = state;\n\n const isDark = theme === \"dark\";\n\n return (\n <div\n className=\"px-3 pb-3 space-y-3\"\n role=\"log\"\n aria-label=\"Chat messages\"\n aria-live=\"polite\"\n >\n {/* Date divider - always show \"Today\" for demo */}\n {chatHistory.length > 0 && (\n <div className=\"flex justify-center py-2\">\n <span\n className={`\n text-xs font-medium px-3 py-1\n ${isDark ? \"text-zinc-500\" : \"text-gray-500\"}\n `}\n >\n Today\n </span>\n </div>\n )}\n\n {/* Messages Container - Chat bubble style */}\n <div\n className={`\n rounded-3xl overflow-hidden\n ${isDark ? \"bg-zinc-900\" : \"bg-gray-50\"}\n `}\n >\n {/* Empty state */}\n {chatHistory.length === 0 && !isTyping && (\n <div className=\"flex items-center justify-center py-12\">\n <p className={`text-sm ${isDark ? \"text-zinc-500\" : \"text-gray-400\"}`}>\n No messages yet\n </p>\n </div>\n )}\n\n {/* Messages */}\n <div className=\"p-3 space-y-3\">\n {chatHistory.map((message, idx) => (\n <div\n key={message.id}\n className={`\n ${message.sender === \"user\" ? \"flex justify-end\" : \"flex justify-start\"}\n `}\n >\n <MessageRenderer\n message={message}\n isLast={idx === chatHistory.length - 1 && !isTyping}\n />\n </div>\n ))}\n\n {/* Typing indicator */}\n {isTyping && <TypingIndicator />}\n </div>\n </div>\n </div>\n );\n});\n","/**\n * SuggestionChip Component\n *\n * Renders a single suggestion chip (reply or action).\n * Styled to match Google Messages RCS appearance.\n */\n\nimport { memo } from \"react\";\nimport { useEmulator } from \"../../context/EmulatorContext\";\nimport type { RbmSuggestion } from \"../../types/rbm.types\";\nimport { isSuggestedAction } from \"../../types/rbm.types\";\n\ninterface SuggestionChipProps {\n suggestion: RbmSuggestion;\n onClick: () => void;\n variant?: \"bar\" | \"card\" | \"carousel\";\n}\n\nexport const SuggestionChip = memo(function SuggestionChip({\n suggestion,\n onClick,\n variant = \"bar\",\n}: SuggestionChipProps) {\n const { theme, businessInfo } = useEmulator();\n\n const isDark = theme === \"dark\";\n const isAction = isSuggestedAction(suggestion);\n\n const displayText = isAction\n ? suggestion.action.displayText\n : suggestion.reply.displayText;\n\n // Get action icon\n const ActionIcon = isAction ? getActionIcon(suggestion) : null;\n const brandColor = businessInfo.brandColor || \"#0084ff\";\n\n // Bar variant - pill shaped chips at bottom\n if (variant === \"bar\") {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={`\n inline-flex items-center gap-2 px-4 py-2 rounded-full text-sm font-medium\n whitespace-nowrap transition-colors flex-shrink-0\n border\n ${isDark\n ? \"bg-zinc-800 border-zinc-700 hover:bg-zinc-700 text-white\"\n : \"bg-white border-gray-300 hover:bg-gray-50 text-gray-900\"\n }\n `}\n aria-label={isAction ? `${getActionLabel(suggestion)}: ${displayText}` : displayText}\n >\n {ActionIcon && (\n <span style={{ color: brandColor }}>\n <ActionIcon className=\"w-4 h-4\" />\n </span>\n )}\n <span>{displayText}</span>\n </button>\n );\n }\n\n // Card variant - used inside rich cards (not used anymore, keeping for compatibility)\n if (variant === \"card\") {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={`\n w-full flex items-center gap-3 px-3 py-2.5 text-left transition-colors rounded-lg\n ${isDark ? \"hover:bg-zinc-700\" : \"hover:bg-gray-100\"}\n `}\n >\n {ActionIcon && (\n <div\n className=\"w-8 h-8 rounded-full flex items-center justify-center flex-shrink-0\"\n style={{ backgroundColor: `${brandColor}15` }}\n >\n <ActionIcon className=\"w-4 h-4\" style={{ color: brandColor }} />\n </div>\n )}\n <span\n className={`text-sm font-medium ${isDark ? \"text-white\" : \"text-gray-900\"}`}\n >\n {displayText}\n </span>\n </button>\n );\n }\n\n // Carousel variant - compact for carousel cards\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={`\n w-full px-3 py-2 rounded-lg text-xs font-medium text-center\n border transition-colors\n ${isDark\n ? \"border-zinc-600 hover:bg-zinc-700 text-white\"\n : \"border-gray-300 hover:bg-gray-50 text-gray-900\"\n }\n `}\n >\n {displayText}\n </button>\n );\n});\n\n// Icon component type\ntype IconComponent = React.FC<{ className?: string; style?: React.CSSProperties }>;\n\n// Get icon component based on action type\nfunction getActionIcon(suggestion: RbmSuggestion): IconComponent | null {\n if (!isSuggestedAction(suggestion)) return null;\n\n const { action } = suggestion;\n\n if (action.openUrlAction) {\n return ({ className, style }) => (\n <svg className={className} style={style} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9\" />\n </svg>\n );\n }\n\n if (action.dialAction) {\n return ({ className, style }) => (\n <svg className={className} style={style} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3 5a2 2 0 012-2h3.28a1 1 0 01.948.684l1.498 4.493a1 1 0 01-.502 1.21l-2.257 1.13a11.042 11.042 0 005.516 5.516l1.13-2.257a1 1 0 011.21-.502l4.493 1.498a1 1 0 01.684.949V19a2 2 0 01-2 2h-1C9.716 21 3 14.284 3 6V5z\" />\n </svg>\n );\n }\n\n if (action.shareLocationAction) {\n return ({ className, style }) => (\n <svg className={className} style={style} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15 11a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n );\n }\n\n if (action.viewLocationAction) {\n return ({ className, style }) => (\n <svg className={className} style={style} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15 11a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n );\n }\n\n if (action.createCalendarEventAction) {\n return ({ className, style }) => (\n <svg className={className} style={style} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n );\n }\n\n return null;\n}\n\n// Get accessibility label for action type\nfunction getActionLabel(suggestion: RbmSuggestion): string {\n if (!isSuggestedAction(suggestion)) return \"Reply\";\n\n const { action } = suggestion;\n\n if (action.openUrlAction) return \"Open link\";\n if (action.dialAction) return \"Call\";\n if (action.shareLocationAction) return \"Share location\";\n if (action.viewLocationAction) return \"View location\";\n if (action.createCalendarEventAction) return \"Add to calendar\";\n\n return \"Action\";\n}\n","/**\n * SuggestionsBar Component\n *\n * Renders a horizontal scrollable list of suggestion chips.\n * Styled to match Google Messages RCS appearance.\n */\n\nimport { memo } from \"react\";\nimport { useEmulator } from \"../../context/EmulatorContext\";\nimport type { RbmSuggestion } from \"../../types/rbm.types\";\nimport { isSuggestedReply, isSuggestedAction } from \"../../types/rbm.types\";\nimport { SuggestionChip } from \"./SuggestionChip\";\n\ninterface SuggestionsBarProps {\n suggestions: RbmSuggestion[];\n}\n\nexport const SuggestionsBar = memo(function SuggestionsBar({\n suggestions,\n}: SuggestionsBarProps) {\n const { theme, handleReply, handleAction } = useEmulator();\n\n const isDark = theme === \"dark\";\n\n if (!suggestions || suggestions.length === 0) {\n return null;\n }\n\n const handleClick = (suggestion: RbmSuggestion) => {\n if (isSuggestedReply(suggestion)) {\n handleReply(suggestion);\n } else if (isSuggestedAction(suggestion)) {\n handleAction(suggestion);\n }\n };\n\n return (\n <div\n className={`\n px-3 py-2\n ${isDark ? \"bg-zinc-900\" : \"bg-white\"}\n `}\n role=\"group\"\n aria-label=\"Quick replies\"\n >\n <div\n className=\"flex gap-2 overflow-x-auto pb-1 -mx-1 px-1\"\n style={{ scrollbarWidth: \"none\", msOverflowStyle: \"none\" }}\n >\n {suggestions.map((suggestion, idx) => (\n <SuggestionChip\n key={idx}\n suggestion={suggestion}\n onClick={() => handleClick(suggestion)}\n variant=\"bar\"\n />\n ))}\n </div>\n </div>\n );\n});\n","/**\n * ChatWindow Component\n *\n * Main container for the chat UI, combining header, messages, and suggestions.\n * Styled to match Google Messages RCS appearance.\n */\n\nimport { memo } from \"react\";\nimport { useEmulator } from \"../../context/EmulatorContext\";\nimport { useAutoScroll } from \"../../hooks/useAutoScroll\";\nimport { BusinessHeader } from \"../BusinessHeader\";\nimport { BrandedHero } from \"../BrandedHero\";\nimport { MessageList } from \"../MessageList\";\nimport { SuggestionsBar } from \"../Suggestions\";\n\nexport const ChatWindow = memo(function ChatWindow() {\n const { theme, state, showSuggestions } = useEmulator();\n const { chatHistory, isTyping, error } = state;\n\n // Auto-scroll when messages change or typing indicator appears\n const scrollRef = useAutoScroll<HTMLDivElement>([\n chatHistory.length,\n isTyping,\n ]);\n\n const isDark = theme === \"dark\";\n\n // Get suggestions from the last business message (only if showSuggestions is enabled)\n const lastMessage = chatHistory[chatHistory.length - 1];\n const suggestions =\n showSuggestions && lastMessage?.sender === \"business\" && !isTyping\n ? lastMessage.suggestions\n : undefined;\n\n return (\n <div\n className={`\n flex flex-col h-full w-full overflow-hidden\n ${isDark ? \"bg-zinc-950\" : \"bg-white\"}\n `}\n >\n {/* Header */}\n <BusinessHeader />\n\n {/* Error State */}\n {error && (\n <div\n className=\"px-4 py-2 bg-red-500/10 border-b border-red-500/20\"\n role=\"alert\"\n >\n <p className=\"text-sm text-red-500\">{error}</p>\n </div>\n )}\n\n {/* Scrollable Content Area */}\n <div ref={scrollRef} className=\"flex-1 overflow-y-auto rcs-scrollbar\">\n {/* Branded Hero Section */}\n <BrandedHero />\n\n {/* Message List */}\n <MessageList />\n </div>\n\n {/* Suggestions Bar */}\n {suggestions && suggestions.length > 0 && (\n <SuggestionsBar suggestions={suggestions} />\n )}\n\n {/* RCS Input Area - Google Messages style */}\n <div\n className={`\n px-3 py-2 flex items-center gap-2\n ${isDark ? \"bg-zinc-900\" : \"bg-white\"}\n `}\n >\n {/* Add/Plus button */}\n <button\n type=\"button\"\n className={`\n w-9 h-9 flex items-center justify-center rounded-full flex-shrink-0\n border transition-colors\n ${\n isDark\n ? \"border-zinc-700 text-zinc-400 hover:bg-zinc-800\"\n : \"border-gray-300 text-gray-500 hover:bg-gray-100\"\n }\n `}\n aria-label=\"Add attachment\"\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 4v16m8-8H4\"\n />\n </svg>\n </button>\n\n {/* Message input container */}\n <div\n className={`\n flex-1 flex items-center gap-2 px-4 py-2 rounded-full\n ${isDark ? \"bg-zinc-800\" : \"bg-gray-100\"}\n `}\n >\n <span\n className={`flex-1 text-sm ${\n isDark ? \"text-zinc-500\" : \"text-gray-400\"\n }`}\n >\n RCS message\n </span>\n\n {/* Emoji button */}\n <button\n type=\"button\"\n className={`p-1 ${isDark ? \"text-zinc-500\" : \"text-gray-400\"}`}\n aria-label=\"Emoji\"\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M14.828 14.828a4 4 0 01-5.656 0M9 10h.01M15 10h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n </button>\n\n {/* Image/Gallery button */}\n <button\n type=\"button\"\n className={`p-1 ${isDark ? \"text-zinc-500\" : \"text-gray-400\"}`}\n aria-label=\"Attach image\"\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\"\n />\n </svg>\n </button>\n </div>\n\n {/* Voice/Record button */}\n <button\n type=\"button\"\n className=\"w-10 h-10 flex items-center justify-center rounded-full bg-green-100 text-green-600 flex-shrink-0\"\n aria-label=\"Voice message\"\n >\n <svg className=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M12 14c1.66 0 3-1.34 3-3V5c0-1.66-1.34-3-3-3S9 3.34 9 5v6c0 1.66 1.34 3 3 3zm-1 1.93c-3.94-.49-7-3.85-7-7.93h2c0 3.31 2.69 6 6 6s6-2.69 6-6h2c0 4.08-3.06 7.44-7 7.93V20h4v2H8v-2h4v-4.07z\" />\n </svg>\n </button>\n </div>\n </div>\n );\n});\n","/**\n * BusinessProfile Component\n *\n * Full-screen overlay showing business information, branding, and contact details.\n * Based on RCS Business Messaging agent profile UI.\n */\n\nimport { memo, useState } from \"react\";\nimport { useEmulator } from \"../../context/EmulatorContext\";\n\ntype TabType = \"info\" | \"options\";\n\nexport const BusinessProfile = memo(function BusinessProfile() {\n const { theme, businessInfo, toggleProfile } = useEmulator();\n const [activeTab, setActiveTab] = useState<TabType>(\"info\");\n\n const isDark = theme === \"dark\";\n\n // Default banner if none provided\n const bannerUrl =\n businessInfo.bannerImage ||\n \"https://images.unsplash.com/photo-1436491865332-7a61a109cc05?w=800&q=80\";\n\n const brandColor = businessInfo.brandColor || \"#0084ff\";\n\n return (\n <div\n className={`\n absolute inset-0 z-50 flex flex-col\n ${isDark ? \"bg-zinc-950\" : \"bg-white\"}\n `}\n >\n {/* Header */}\n <header\n className={`\n flex items-center gap-3 px-4 py-3 border-b\n ${isDark ? \"bg-zinc-900 border-zinc-800\" : \"bg-white border-gray-200\"}\n `}\n >\n <button\n onClick={toggleProfile}\n className={`\n p-1.5 -ml-1.5 rounded-full transition-colors\n ${isDark ? \"hover:bg-zinc-800 text-white\" : \"hover:bg-gray-100 text-gray-900\"}\n `}\n aria-label=\"Go back\"\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 19l-7-7 7-7\"\n />\n </svg>\n </button>\n <span\n className={`text-base font-medium ${isDark ? \"text-white\" : \"text-gray-900\"}`}\n >\n Info & options\n </span>\n </header>\n\n {/* Scrollable Content */}\n <div className=\"flex-1 overflow-y-auto\">\n {/* Banner Image */}\n <div className=\"relative h-40 bg-gray-200\">\n <img\n src={bannerUrl}\n alt=\"Business banner\"\n className=\"w-full h-full object-cover\"\n />\n </div>\n\n {/* Logo - overlapping banner */}\n <div className=\"relative px-4\">\n <div\n className={`\n absolute -top-10 left-1/2 -translate-x-1/2\n w-20 h-20 rounded-full overflow-hidden border-4\n ${isDark ? \"border-zinc-950 bg-zinc-800\" : \"border-white bg-gray-100\"}\n shadow-lg\n `}\n >\n {businessInfo.logo ? (\n <img\n src={businessInfo.logo}\n alt={`${businessInfo.name} logo`}\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <div\n className=\"w-full h-full flex items-center justify-center text-2xl font-bold text-white\"\n style={{ backgroundColor: brandColor }}\n >\n {businessInfo.name.charAt(0).toUpperCase()}\n </div>\n )}\n </div>\n </div>\n\n {/* Business Name & Description */}\n <div className=\"pt-12 pb-4 px-4 text-center\">\n <h1\n className={`text-xl font-semibold ${isDark ? \"text-white\" : \"text-gray-900\"}`}\n >\n {businessInfo.name}\n </h1>\n {businessInfo.description && (\n <p className={`text-sm mt-1 ${isDark ? \"text-zinc-400\" : \"text-gray-500\"}`}>\n {businessInfo.description}\n </p>\n )}\n </div>\n\n {/* Quick Actions */}\n <div className=\"flex justify-center gap-4 px-4 pb-4\">\n {businessInfo.phoneNumbers && businessInfo.phoneNumbers.length > 0 && (\n <QuickActionButton\n icon=\"phone\"\n label=\"Call\"\n isDark={isDark}\n brandColor={brandColor}\n onClick={() => {\n const phone = businessInfo.phoneNumbers?.[0]?.number;\n if (phone) window.location.href = `tel:${phone}`;\n }}\n />\n )}\n {businessInfo.websites && businessInfo.websites.length > 0 && (\n <QuickActionButton\n icon=\"globe\"\n label=\"Website\"\n isDark={isDark}\n brandColor={brandColor}\n onClick={() => {\n const url = businessInfo.websites?.[0]?.url;\n if (url) window.open(url, \"_blank\", \"noopener,noreferrer\");\n }}\n />\n )}\n {businessInfo.emails && businessInfo.emails.length > 0 && (\n <QuickActionButton\n icon=\"mail\"\n label=\"Contact\"\n isDark={isDark}\n brandColor={brandColor}\n onClick={() => {\n const email = businessInfo.emails?.[0]?.email;\n if (email) window.location.href = `mailto:${email}`;\n }}\n />\n )}\n </div>\n\n {/* Tabs */}\n <div\n className={`\n flex mx-4 rounded-lg overflow-hidden border\n ${isDark ? \"border-zinc-700 bg-zinc-800\" : \"border-gray-200 bg-gray-100\"}\n `}\n >\n <TabButton\n active={activeTab === \"info\"}\n onClick={() => setActiveTab(\"info\")}\n isDark={isDark}\n brandColor={brandColor}\n >\n Info\n </TabButton>\n <TabButton\n active={activeTab === \"options\"}\n onClick={() => setActiveTab(\"options\")}\n isDark={isDark}\n brandColor={brandColor}\n >\n Options\n </TabButton>\n </div>\n\n {/* Tab Content */}\n <div className=\"p-4\">\n {activeTab === \"info\" ? (\n <InfoTab isDark={isDark} brandColor={brandColor} />\n ) : (\n <OptionsTab isDark={isDark} />\n )}\n </div>\n </div>\n </div>\n );\n});\n\n// Quick Action Button Component\ninterface QuickActionButtonProps {\n icon: \"phone\" | \"globe\" | \"mail\";\n label: string;\n isDark: boolean;\n brandColor: string;\n onClick: () => void;\n}\n\nconst QuickActionButton = memo(function QuickActionButton({\n icon,\n label,\n isDark,\n brandColor,\n onClick,\n}: QuickActionButtonProps) {\n const icons = {\n phone: (\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M3 5a2 2 0 012-2h3.28a1 1 0 01.948.684l1.498 4.493a1 1 0 01-.502 1.21l-2.257 1.13a11.042 11.042 0 005.516 5.516l1.13-2.257a1 1 0 011.21-.502l4.493 1.498a1 1 0 01.684.949V19a2 2 0 01-2 2h-1C9.716 21 3 14.284 3 6V5z\"\n />\n ),\n globe: (\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9\"\n />\n ),\n mail: (\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z\"\n />\n ),\n };\n\n return (\n <button\n onClick={onClick}\n className={`\n flex flex-col items-center gap-2 px-6 py-3 rounded-xl border transition-colors\n ${isDark\n ? \"bg-zinc-800 border-zinc-700 hover:bg-zinc-700\"\n : \"bg-white border-gray-200 hover:bg-gray-50\"\n }\n `}\n >\n <svg\n className=\"w-6 h-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke={brandColor}\n >\n {icons[icon]}\n </svg>\n <span\n className={`text-xs font-medium ${isDark ? \"text-zinc-300\" : \"text-gray-600\"}`}\n >\n {label}\n </span>\n </button>\n );\n});\n\n// Tab Button Component\ninterface TabButtonProps {\n active: boolean;\n onClick: () => void;\n isDark: boolean;\n brandColor: string;\n children: React.ReactNode;\n}\n\nconst TabButton = memo(function TabButton({\n active,\n onClick,\n isDark,\n brandColor,\n children,\n}: TabButtonProps) {\n return (\n <button\n onClick={onClick}\n className={`\n flex-1 py-2.5 text-sm font-medium transition-colors rounded-lg\n ${active\n ? \"text-white\"\n : isDark\n ? \"text-zinc-400 hover:text-zinc-200\"\n : \"text-gray-500 hover:text-gray-700\"\n }\n `}\n style={active ? { backgroundColor: brandColor } : undefined}\n >\n {children}\n </button>\n );\n});\n\n// Info Tab Component\ninterface InfoTabProps {\n isDark: boolean;\n brandColor: string;\n}\n\nconst InfoTab = memo(function InfoTab({ isDark, brandColor }: InfoTabProps) {\n const { businessInfo } = useEmulator();\n\n const hasContactInfo =\n (businessInfo.phoneNumbers && businessInfo.phoneNumbers.length > 0) ||\n (businessInfo.websites && businessInfo.websites.length > 0) ||\n (businessInfo.emails && businessInfo.emails.length > 0);\n\n if (!hasContactInfo) {\n return (\n <div\n className={`text-center py-8 ${isDark ? \"text-zinc-500\" : \"text-gray-400\"}`}\n >\n No contact information available\n </div>\n );\n }\n\n return (\n <div\n className={`\n rounded-xl overflow-hidden border divide-y\n ${isDark\n ? \"bg-zinc-900 border-zinc-800 divide-zinc-800\"\n : \"bg-gray-50 border-gray-200 divide-gray-200\"\n }\n `}\n >\n {/* Phone Numbers */}\n {businessInfo.phoneNumbers?.map((phone, idx) => (\n <ContactItem\n key={`phone-${idx}`}\n icon=\"phone\"\n primary={phone.number}\n secondary={phone.label}\n isDark={isDark}\n brandColor={brandColor}\n onClick={() => (window.location.href = `tel:${phone.number}`)}\n />\n ))}\n\n {/* Websites */}\n {businessInfo.websites?.map((website, idx) => (\n <ContactItem\n key={`web-${idx}`}\n icon=\"globe\"\n primary={website.url.replace(/^https?:\\/\\//, \"\")}\n secondary={website.label || \"Website\"}\n isDark={isDark}\n brandColor={brandColor}\n onClick={() => window.open(website.url, \"_blank\", \"noopener,noreferrer\")}\n />\n ))}\n\n {/* Emails */}\n {businessInfo.emails?.map((email, idx) => (\n <ContactItem\n key={`email-${idx}`}\n icon=\"mail\"\n primary={email.email}\n secondary={email.label || \"Email\"}\n isDark={isDark}\n brandColor={brandColor}\n onClick={() => (window.location.href = `mailto:${email.email}`)}\n />\n ))}\n </div>\n );\n});\n\n// Contact Item Component\ninterface ContactItemProps {\n icon: \"phone\" | \"globe\" | \"mail\";\n primary: string;\n secondary?: string;\n isDark: boolean;\n brandColor: string;\n onClick: () => void;\n}\n\nconst ContactItem = memo(function ContactItem({\n icon,\n primary,\n secondary,\n isDark,\n onClick,\n}: ContactItemProps) {\n const iconPaths = {\n phone: \"M3 5a2 2 0 012-2h3.28a1 1 0 01.948.684l1.498 4.493a1 1 0 01-.502 1.21l-2.257 1.13a11.042 11.042 0 005.516 5.516l1.13-2.257a1 1 0 011.21-.502l4.493 1.498a1 1 0 01.684.949V19a2 2 0 01-2 2h-1C9.716 21 3 14.284 3 6V5z\",\n globe: \"M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9\",\n mail: \"M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z\",\n };\n\n return (\n <button\n onClick={onClick}\n className={`\n w-full flex items-center gap-4 px-4 py-3.5 text-left transition-colors\n ${isDark ? \"hover:bg-zinc-800\" : \"hover:bg-gray-100\"}\n `}\n >\n <svg\n className={`w-5 h-5 flex-shrink-0 ${isDark ? \"text-zinc-500\" : \"text-gray-400\"}`}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d={iconPaths[icon]}\n />\n </svg>\n <div className=\"flex-1 min-w-0\">\n <p\n className={`text-sm font-medium truncate ${isDark ? \"text-white\" : \"text-gray-900\"}`}\n >\n {primary}\n </p>\n {secondary && (\n <p\n className={`text-xs truncate ${isDark ? \"text-zinc-500\" : \"text-gray-500\"}`}\n >\n {secondary}\n </p>\n )}\n </div>\n </button>\n );\n});\n\n// Options Tab Component\ninterface OptionsTabProps {\n isDark: boolean;\n}\n\nconst OptionsTab = memo(function OptionsTab({ isDark }: OptionsTabProps) {\n return (\n <div\n className={`\n rounded-xl overflow-hidden border divide-y\n ${isDark\n ? \"bg-zinc-900 border-zinc-800 divide-zinc-800\"\n : \"bg-gray-50 border-gray-200 divide-gray-200\"\n }\n `}\n >\n <OptionItem\n icon=\"bell\"\n label=\"Notifications\"\n isDark={isDark}\n />\n <OptionItem\n icon=\"block\"\n label=\"Block & report spam\"\n isDark={isDark}\n />\n <OptionItem\n icon=\"info\"\n label=\"About RCS\"\n isDark={isDark}\n />\n </div>\n );\n});\n\n// Option Item Component\ninterface OptionItemProps {\n icon: \"bell\" | \"block\" | \"info\";\n label: string;\n isDark: boolean;\n}\n\nconst OptionItem = memo(function OptionItem({\n icon,\n label,\n isDark,\n}: OptionItemProps) {\n const iconPaths = {\n bell: \"M15 17h5l-1.405-1.405A2.032 2.032 0 0118 14.158V11a6.002 6.002 0 00-4-5.659V5a2 2 0 10-4 0v.341C7.67 6.165 6 8.388 6 11v3.159c0 .538-.214 1.055-.595 1.436L4 17h5m6 0v1a3 3 0 11-6 0v-1m6 0H9\",\n block: \"M18.364 18.364A9 9 0 005.636 5.636m12.728 12.728A9 9 0 015.636 5.636m12.728 12.728L5.636 5.636\",\n info: \"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\",\n };\n\n return (\n <button\n className={`\n w-full flex items-center gap-4 px-4 py-3.5 text-left transition-colors\n ${isDark ? \"hover:bg-zinc-800\" : \"hover:bg-gray-100\"}\n `}\n >\n <svg\n className={`w-5 h-5 flex-shrink-0 ${isDark ? \"text-zinc-500\" : \"text-gray-400\"}`}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d={iconPaths[icon]}\n />\n </svg>\n <span\n className={`text-sm font-medium ${isDark ? \"text-white\" : \"text-gray-900\"}`}\n >\n {label}\n </span>\n </button>\n );\n});\n\nexport default BusinessProfile;\n\n","/**\n * WebViewRenderer Component\n *\n * Renders an embedded WebView that mimics real mobile RCS client behavior.\n * Supports three view modes:\n * - FULL: Covers entire device screen (100%)\n * - TALL: Bottom sheet covering 80% of screen\n * - HALF: Bottom sheet covering 50% of screen\n */\n\nimport { memo, useState, useCallback, useEffect } from \"react\";\nimport { useEmulator } from \"../../context/EmulatorContext\";\nimport type { RbmWebViewMode } from \"../../types/rbm.types\";\n\n// Height configuration for each view mode\nconst VIEW_MODE_HEIGHTS: Record<RbmWebViewMode, string> = {\n FULL: \"h-full\",\n TALL: \"h-[80%]\",\n HALF: \"h-[50%]\",\n};\n\nexport const WebViewRenderer = memo(function WebViewRenderer() {\n const { theme, businessInfo, webView, closeWebView } = useEmulator();\n const [isLoading, setIsLoading] = useState(true);\n const [loadError, setLoadError] = useState(false);\n\n const isDark = theme === \"dark\";\n const brandColor = businessInfo.brandColor || \"#0084ff\";\n\n // Reset loading state when URL changes\n useEffect(() => {\n if (webView?.url) {\n setIsLoading(true);\n setLoadError(false);\n }\n }, [webView?.url]);\n\n const handleIframeLoad = useCallback(() => {\n setIsLoading(false);\n }, []);\n\n const handleIframeError = useCallback(() => {\n setIsLoading(false);\n setLoadError(true);\n }, []);\n\n // Extract domain for title fallback\n const getDomainFromUrl = (url: string): string => {\n try {\n const urlObj = new URL(url);\n return urlObj.hostname;\n } catch {\n return \"Web Page\";\n }\n };\n\n if (!webView || !webView.isOpen) return null;\n\n const { url, viewMode, title, postbackData } = webView;\n const displayTitle = title || getDomainFromUrl(url);\n const isFull = viewMode === \"FULL\";\n const isBottomSheet = viewMode === \"TALL\" || viewMode === \"HALF\";\n const heightClass = VIEW_MODE_HEIGHTS[viewMode] || VIEW_MODE_HEIGHTS.TALL;\n\n return (\n <div\n className={`\n rcs-webview-overlay absolute inset-0 z-50 flex flex-col\n ${isFull ? \"\" : \"justify-end\"}\n ${isDark ? \"bg-black/60\" : \"bg-black/40\"}\n `}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={`WebView: ${displayTitle}`}\n data-postback={postbackData}\n data-view-mode={viewMode}\n >\n {/* Backdrop for bottom sheet modes - clicking closes WebView */}\n {isBottomSheet && (\n <button\n type=\"button\"\n className=\"absolute inset-0 w-full h-full cursor-default\"\n onClick={closeWebView}\n aria-label=\"Close WebView\"\n />\n )}\n\n {/* WebView Container */}\n <div\n className={`\n rcs-webview-container relative flex flex-col overflow-hidden\n ${isDark ? \"bg-zinc-900\" : \"bg-white\"}\n ${heightClass} w-full\n ${isBottomSheet ? \"rounded-t-2xl shadow-2xl\" : \"\"}\n `}\n style={{\n // Ensure container is above backdrop\n position: \"relative\",\n zIndex: 1,\n }}\n >\n {/* Header - Mobile style */}\n <header\n className={`\n rcs-webview-header flex items-center gap-3 px-2 py-2 flex-shrink-0\n border-b\n ${isDark ? \"bg-zinc-900 border-zinc-800\" : \"bg-white border-gray-200\"}\n `}\n >\n {/* Back/Close Button */}\n <button\n type=\"button\"\n onClick={closeWebView}\n className={`\n rcs-webview-close w-10 h-10 rounded-full flex items-center justify-center\n transition-colors\n ${isDark\n ? \"text-white hover:bg-zinc-800\"\n : \"text-gray-700 hover:bg-gray-100\"\n }\n `}\n aria-label=\"Close WebView\"\n >\n <svg\n className=\"w-6 h-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M15 19l-7-7 7-7\"\n />\n </svg>\n </button>\n\n {/* Title */}\n <div className=\"flex-1 min-w-0\">\n <h2\n className={`\n rcs-webview-title text-base font-medium truncate\n ${isDark ? \"text-white\" : \"text-gray-900\"}\n `}\n >\n {displayTitle}\n </h2>\n <p\n className={`\n rcs-webview-url text-xs truncate\n ${isDark ? \"text-zinc-400\" : \"text-gray-500\"}\n `}\n >\n {getDomainFromUrl(url)}\n </p>\n </div>\n\n {/* Menu Button (decorative) */}\n <button\n type=\"button\"\n className={`\n w-10 h-10 rounded-full flex items-center justify-center\n ${isDark\n ? \"text-zinc-400 hover:bg-zinc-800\"\n : \"text-gray-500 hover:bg-gray-100\"\n }\n `}\n aria-label=\"More options\"\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <circle cx=\"12\" cy=\"5\" r=\"2\" />\n <circle cx=\"12\" cy=\"12\" r=\"2\" />\n <circle cx=\"12\" cy=\"19\" r=\"2\" />\n </svg>\n </button>\n </header>\n\n {/* Loading indicator */}\n {isLoading && (\n <div\n className=\"rcs-webview-loading absolute top-14 left-0 right-0 h-1 overflow-hidden\"\n style={{ backgroundColor: `${brandColor}20` }}\n >\n <div\n className=\"h-full animate-pulse\"\n style={{\n backgroundColor: brandColor,\n animation: \"webview-loading 1.5s ease-in-out infinite\",\n width: \"30%\",\n }}\n />\n </div>\n )}\n\n {/* Error State */}\n {loadError && (\n <div\n className={`\n rcs-webview-error flex-1 flex flex-col items-center justify-center p-6 text-center\n ${isDark ? \"text-zinc-400\" : \"text-gray-500\"}\n `}\n >\n <svg\n className=\"w-16 h-16 mb-4 opacity-50\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"\n />\n </svg>\n <p className=\"text-sm font-medium mb-2\">Unable to load page</p>\n <p className=\"text-xs opacity-75 mb-4\">\n This content cannot be displayed in the emulator\n </p>\n <button\n type=\"button\"\n onClick={closeWebView}\n className={`\n px-4 py-2 rounded-full text-sm font-medium\n ${isDark\n ? \"bg-zinc-800 text-white hover:bg-zinc-700\"\n : \"bg-gray-100 text-gray-700 hover:bg-gray-200\"\n }\n `}\n >\n Go Back\n </button>\n </div>\n )}\n\n {/* Iframe */}\n {!loadError && (\n <div className=\"rcs-webview-iframe-container flex-1 overflow-hidden\">\n <iframe\n src={url}\n title={displayTitle}\n className=\"w-full h-full border-0\"\n onLoad={handleIframeLoad}\n onError={handleIframeError}\n sandbox=\"allow-scripts allow-same-origin allow-forms allow-popups\"\n referrerPolicy=\"no-referrer-when-downgrade\"\n loading=\"lazy\"\n />\n </div>\n )}\n\n {/* Bottom Safe Area (for bottom sheet modes) */}\n {isBottomSheet && (\n <div\n className={`\n rcs-webview-safe-area h-2 flex-shrink-0\n ${isDark ? \"bg-zinc-900\" : \"bg-white\"}\n `}\n />\n )}\n </div>\n\n {/* CSS Animation for loading bar */}\n <style>{`\n @keyframes webview-loading {\n 0% { transform: translateX(-100%); }\n 50% { transform: translateX(200%); }\n 100% { transform: translateX(-100%); }\n }\n `}</style>\n </div>\n );\n});\n\n","/**\n * LockScreen Component\n *\n * Displays a mobile lock screen with time, date, and notification preview.\n * Clicking the notification opens the chat.\n */\n\nimport { memo, useState, useEffect } from \"react\";\nimport { useEmulator } from \"../../context/EmulatorContext\";\n\ninterface LockScreenProps {\n onUnlock: () => void;\n messagePreview?: string;\n}\n\nexport const LockScreen = memo(function LockScreen({\n onUnlock,\n messagePreview = \"New message\",\n}: LockScreenProps) {\n const { theme, businessInfo } = useEmulator();\n const [currentTime, setCurrentTime] = useState(new Date());\n\n const isDark = theme === \"dark\";\n\n // Update time every second\n useEffect(() => {\n const timer = setInterval(() => {\n setCurrentTime(new Date());\n }, 1000);\n\n return () => clearInterval(timer);\n }, []);\n\n // Format time (e.g., \"6:06 PM\")\n const formattedTime = currentTime.toLocaleTimeString([], {\n hour: \"numeric\",\n minute: \"2-digit\",\n hour12: true,\n });\n\n // Format date (e.g., \"Tue, January 6\")\n const formattedDate = currentTime.toLocaleDateString([], {\n weekday: \"short\",\n month: \"long\",\n day: \"numeric\",\n });\n\n // Get weather icon and temp (mock data - could be made dynamic)\n const weatherTemp = \"19°C\";\n\n return (\n <div\n className={`\n lock-screen flex flex-col h-full w-full select-none\n ${isDark ? \"bg-zinc-900\" : \"bg-zinc-800\"}\n `}\n >\n {/* Status Bar Area */}\n <div className=\"h-6\" />\n\n {/* Lock Icon */}\n <div className=\"flex justify-center mt-4\">\n <div className=\"w-8 h-8 rounded-full bg-zinc-700 flex items-center justify-center\">\n <svg\n className=\"w-4 h-4 text-zinc-400\"\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M5 9V7a5 5 0 0110 0v2a2 2 0 012 2v5a2 2 0 01-2 2H5a2 2 0 01-2-2v-5a2 2 0 012-2zm8-2v2H7V7a3 3 0 016 0z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </div>\n </div>\n\n {/* Time */}\n <div className=\"mt-6 text-center\">\n <h1 className=\"text-5xl font-light text-white tracking-tight\">\n {formattedTime}\n </h1>\n </div>\n\n {/* Date & Weather */}\n <div className=\"mt-2 text-center\">\n <p className=\"text-zinc-400 text-sm\">{formattedDate}</p>\n <div className=\"flex items-center justify-center gap-1 mt-1 text-zinc-500 text-xs\">\n <svg className=\"w-3.5 h-3.5\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path d=\"M5.5 16a3.5 3.5 0 01-.369-6.98 4 4 0 117.753-1.977A4.5 4.5 0 1113.5 16h-8z\" />\n </svg>\n <span>{weatherTemp}</span>\n </div>\n </div>\n\n {/* Spacer */}\n <div className=\"h-24\" />\n\n {/* Notification Card */}\n <div className=\"px-4 pb-8\">\n <button\n onClick={onUnlock}\n className=\"w-full bg-white rounded-2xl p-3 flex items-center gap-3 shadow-lg \n transition-transform active:scale-[0.98] hover:shadow-xl\"\n >\n {/* App Icon */}\n <div className=\"w-12 h-12 rounded-xl bg-zinc-900 flex items-center justify-center flex-shrink-0 overflow-hidden\">\n {businessInfo.logo ? (\n <img\n src={businessInfo.logo}\n alt={businessInfo.name}\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <div className=\"text-white\">\n {/* Default RCS icon pattern */}\n <svg\n className=\"w-7 h-7\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"1.5\" />\n <circle cx=\"12\" cy=\"6\" r=\"1\" />\n <circle cx=\"12\" cy=\"18\" r=\"1\" />\n <circle cx=\"6\" cy=\"12\" r=\"1\" />\n <circle cx=\"18\" cy=\"12\" r=\"1\" />\n <circle cx=\"8\" cy=\"8\" r=\"0.8\" />\n <circle cx=\"16\" cy=\"8\" r=\"0.8\" />\n <circle cx=\"8\" cy=\"16\" r=\"0.8\" />\n <circle cx=\"16\" cy=\"16\" r=\"0.8\" />\n <circle cx=\"6\" cy=\"6\" r=\"0.5\" />\n <circle cx=\"18\" cy=\"6\" r=\"0.5\" />\n <circle cx=\"6\" cy=\"18\" r=\"0.5\" />\n <circle cx=\"18\" cy=\"18\" r=\"0.5\" />\n </svg>\n </div>\n )}\n </div>\n\n {/* Message Info */}\n <div className=\"flex-1 text-left min-w-0\">\n <p className=\"text-sm font-semibold text-gray-900 truncate\">\n {businessInfo.name}\n </p>\n <p className=\"text-sm text-gray-500 truncate\">{messagePreview}</p>\n </div>\n\n {/* Timestamp */}\n <span className=\"text-xs text-gray-400 flex-shrink-0\">now</span>\n </button>\n </div>\n\n <div className=\"flex-1\" />\n {/* Home Indicator */}\n <div className=\"flex justify-center pb-2\">\n <div className=\"w-32 h-1 rounded-full bg-zinc-600\" />\n </div>\n </div>\n );\n});\n\n","/**\n * RcsEmulator Component\n *\n * Main entry point for the RCS Business Messaging Emulator.\n * This is the public API component that wraps all internal components.\n *\n * Supports two input modes:\n * - messages: Direct RBM JSON object\n * - jsonUrl: URL to fetch RBM JSON from\n */\n\nimport { memo, useMemo, useState, useCallback } from \"react\";\nimport type {\n RcsEmulatorProps,\n BusinessInfo,\n WebViewState,\n} from \"./types/emulator.types\";\nimport type { RbmSuggestion, RbmConversationFlow } from \"./types/rbm.types\";\nimport { isSuggestedAction, getWebViewConfig } from \"./types/rbm.types\";\nimport { EmulatorProvider } from \"./context/EmulatorContext\";\nimport { useConversation } from \"./hooks/useConversation\";\nimport { useJsonFetch } from \"./hooks/useJsonFetch\";\nimport { ChatWindow } from \"./components/ChatWindow\";\nimport { BusinessProfile } from \"./components/BusinessProfile\";\nimport { WebViewRenderer } from \"./components/WebView\";\nimport { LockScreen } from \"./components/LockScreen\";\nimport {\n validateConversationFlow,\n getFirstMessagePreview,\n} from \"./utils/messageParser\";\n\nconst defaultBusinessInfo: BusinessInfo = {\n name: \"Business\",\n verified: false,\n};\n\n/**\n * Internal component that renders the emulator with validated data\n */\nconst RcsEmulatorInner = memo(function RcsEmulatorInner({\n flow,\n onUserReply,\n theme,\n device,\n businessInfo,\n showSuggestions,\n}: {\n flow: RbmConversationFlow;\n onUserReply: RcsEmulatorProps[\"onUserReply\"];\n theme: NonNullable<RcsEmulatorProps[\"theme\"]>;\n device: NonNullable<RcsEmulatorProps[\"device\"]>;\n businessInfo: BusinessInfo;\n showSuggestions: boolean;\n}) {\n // Initialize conversation engine\n const {\n state,\n handleReply,\n handleAction: baseHandleAction,\n } = useConversation({\n flow,\n onUserReply,\n typingDelay: 800,\n });\n\n // Business profile state\n const [isProfileOpen, setIsProfileOpen] = useState(false);\n const toggleProfile = useCallback(() => {\n setIsProfileOpen((prev) => !prev);\n }, []);\n\n // WebView state\n const [webView, setWebView] = useState<WebViewState | null>(null);\n\n const openWebView = useCallback((config: Omit<WebViewState, \"isOpen\">) => {\n setWebView({\n ...config,\n isOpen: true,\n });\n }, []);\n\n const closeWebView = useCallback(() => {\n setWebView(null);\n }, []);\n\n // Enhanced action handler that intercepts WebView actions\n const handleAction = useCallback(\n (suggestion: RbmSuggestion) => {\n if (!isSuggestedAction(suggestion)) return;\n\n // Check for WebView action\n const webViewConfig = getWebViewConfig(suggestion);\n if (webViewConfig) {\n // Open WebView instead of browser\n openWebView({\n url: webViewConfig.url,\n viewMode: webViewConfig.webviewViewMode || \"TALL\",\n title: webViewConfig.description || \"\",\n postbackData: suggestion.action.postback.data,\n });\n\n // Emit callback with webview action data\n onUserReply({\n type: \"action\",\n postbackData: suggestion.action.postback.data,\n displayText: suggestion.action.displayText,\n timestamp: Date.now(),\n actionData: {\n type: \"webview\",\n url: webViewConfig.url,\n viewMode: webViewConfig.webviewViewMode || \"TALL\",\n description: webViewConfig.description,\n },\n });\n\n return;\n }\n\n // Default action handling (opens browser for regular URLs)\n baseHandleAction(suggestion);\n },\n [baseHandleAction, openWebView, onUserReply]\n );\n\n return (\n <EmulatorProvider\n theme={theme}\n device={device}\n businessInfo={businessInfo}\n state={state}\n showSuggestions={showSuggestions}\n isProfileOpen={isProfileOpen}\n toggleProfile={toggleProfile}\n onReply={handleReply}\n onAction={handleAction}\n webView={webView}\n openWebView={openWebView}\n closeWebView={closeWebView}\n >\n <ChatWindow />\n {isProfileOpen && <BusinessProfile />}\n <WebViewRenderer />\n </EmulatorProvider>\n );\n});\n\nexport const RcsEmulator = memo(function RcsEmulator({\n messages,\n jsonUrl,\n onUserReply,\n theme = \"light\",\n device = \"android\",\n businessInfo,\n className = \"\",\n width = 375,\n height = 667,\n showSuggestions = true,\n showLockScreen = false,\n}: RcsEmulatorProps) {\n // Lock screen state\n const [isLocked, setIsLocked] = useState(showLockScreen);\n\n const handleUnlock = useCallback(() => {\n setIsLocked(false);\n }, []);\n\n // Fetch JSON from URL if provided\n const {\n data: fetchedData,\n isLoading,\n error: fetchError,\n } = useJsonFetch(jsonUrl);\n\n // Use fetched data or direct messages prop\n const flowData = jsonUrl ? fetchedData : messages;\n\n // Validate JSON structure\n const isValidFlow = useMemo(\n () => (flowData ? validateConversationFlow(flowData) : false),\n [flowData]\n );\n\n // Merge business info with defaults\n const mergedBusinessInfo = useMemo(\n () => ({\n ...defaultBusinessInfo,\n ...businessInfo,\n // Extract name from flow if not provided\n name: businessInfo?.name || flowData?.name || defaultBusinessInfo.name,\n }),\n [businessInfo, flowData?.name]\n );\n\n // Get first message preview for lock screen notification\n const messagePreview = useMemo(\n () =>\n flowData && isValidFlow\n ? getFirstMessagePreview(flowData)\n : \"New message\",\n [flowData, isValidFlow]\n );\n\n const isDark = theme === \"dark\";\n\n // Container wrapper component\n const EmulatorContainer = ({ children }: { children: React.ReactNode }) => (\n <div\n className={`\n rcs-emulator relative overflow-hidden\n rounded-2xl shadow-2xl\n ${isDark ? \"bg-zinc-950\" : \"bg-white\"}\n ${className}\n `}\n style={{ width, height }}\n role=\"application\"\n aria-label=\"RCS Message Emulator\"\n data-theme={theme}\n data-device={device}\n >\n {children}\n </div>\n );\n\n // Loading state (when fetching from URL)\n if (jsonUrl && isLoading) {\n return (\n <EmulatorContainer>\n <div className=\"flex flex-col items-center justify-center h-full p-6\">\n <div\n className={`\n w-10 h-10 border-3 border-t-transparent rounded-full animate-spin mb-4\n ${isDark ? \"border-zinc-600\" : \"border-gray-300\"}\n `}\n style={{ borderTopColor: \"transparent\" }}\n />\n <p\n className={`text-sm ${isDark ? \"text-zinc-400\" : \"text-gray-500\"}`}\n >\n Loading conversation...\n </p>\n </div>\n </EmulatorContainer>\n );\n }\n\n // Fetch error state\n if (jsonUrl && fetchError) {\n return (\n <EmulatorContainer>\n <div className=\"flex flex-col items-center justify-center h-full p-6 text-center\">\n <svg\n className=\"w-12 h-12 mx-auto mb-4 text-red-500\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <h3\n className={`text-lg font-medium mb-2 ${\n isDark ? \"text-white\" : \"text-gray-900\"\n }`}\n >\n Failed to Load\n </h3>\n <p\n className={`text-sm ${isDark ? \"text-zinc-400\" : \"text-gray-500\"}`}\n >\n {fetchError}\n </p>\n <p\n className={`text-xs mt-2 break-all max-w-full ${\n isDark ? \"text-zinc-500\" : \"text-gray-400\"\n }`}\n >\n {jsonUrl}\n </p>\n </div>\n </EmulatorContainer>\n );\n }\n\n // No data provided\n if (!flowData) {\n return (\n <EmulatorContainer>\n <div className=\"flex flex-col items-center justify-center h-full p-6 text-center\">\n <svg\n className={`w-12 h-12 mx-auto mb-4 ${\n isDark ? \"text-zinc-600\" : \"text-gray-300\"\n }`}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z\"\n />\n </svg>\n <h3\n className={`text-lg font-medium mb-2 ${\n isDark ? \"text-white\" : \"text-gray-900\"\n }`}\n >\n No Conversation Data\n </h3>\n <p\n className={`text-sm ${isDark ? \"text-zinc-400\" : \"text-gray-500\"}`}\n >\n Provide either{\" \"}\n <code className=\"px-1 py-0.5 rounded bg-gray-100 dark:bg-zinc-800\">\n messages\n </code>{\" \"}\n or{\" \"}\n <code className=\"px-1 py-0.5 rounded bg-gray-100 dark:bg-zinc-800\">\n jsonUrl\n </code>{\" \"}\n prop\n </p>\n </div>\n </EmulatorContainer>\n );\n }\n\n // Invalid JSON structure\n if (!isValidFlow) {\n return (\n <EmulatorContainer>\n <div className=\"flex flex-col items-center justify-center h-full p-6 text-center\">\n <svg\n className=\"w-12 h-12 mx-auto mb-4 text-amber-500\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"\n />\n </svg>\n <h3\n className={`text-lg font-medium mb-2 ${\n isDark ? \"text-white\" : \"text-gray-900\"\n }`}\n >\n Invalid RBM JSON\n </h3>\n <p\n className={`text-sm ${isDark ? \"text-zinc-400\" : \"text-gray-500\"}`}\n >\n The conversation flow structure is not valid\n </p>\n </div>\n </EmulatorContainer>\n );\n }\n\n // Valid flow - render lock screen or emulator\n return (\n <EmulatorContainer>\n {isLocked ? (\n <EmulatorProvider\n theme={theme}\n device={device}\n businessInfo={mergedBusinessInfo}\n state={{\n currentMessageId: null,\n chatHistory: [],\n isTyping: false,\n error: null,\n }}\n showSuggestions={false}\n isProfileOpen={false}\n toggleProfile={() => {}}\n onReply={() => {}}\n onAction={() => {}}\n webView={null}\n openWebView={() => {}}\n closeWebView={() => {}}\n >\n <LockScreen onUnlock={handleUnlock} messagePreview={messagePreview} />\n </EmulatorProvider>\n ) : (\n <RcsEmulatorInner\n flow={flowData}\n onUserReply={onUserReply}\n theme={theme}\n device={device}\n businessInfo={mergedBusinessInfo}\n showSuggestions={showSuggestions}\n />\n )}\n </EmulatorContainer>\n );\n});\n\n// Default export for convenience\nexport default RcsEmulator;\n"],"names":["isSuggestedReply","suggestion","isSuggestedAction","isWebViewAction","urlAction","getWebViewConfig","defaultBusinessInfo","defaultState","EmulatorContext","createContext","EmulatorProvider","children","theme","device","businessInfo","state","showSuggestions","isProfileOpen","toggleProfile","onReply","onAction","webView","openWebView","closeWebView","value","jsx","useEmulator","context","useContext","findFirstMessage","flow","messages","msg","getMessageById","messageId","findNextMessageId","message","postbackData","choices","parseMessageParts","messageIndex","parts","content","parseContent","suggestions","extractMessageLevelSuggestions","part","rcsMessage","card","parseCardContent","carousel","cardContent","layout","getMediaUrl","getThumbnailUrl","mediaUrl","mapHeight","height","createUserReplyMessage","text","validateConversationFlow","f","m","getFirstMessagePreview","firstMessage","initialState","conversationReducer","action","userMessage","updatedHistory","idx","useConversation","onUserReply","typingDelay","dispatch","useReducer","messageIndexRef","useRef","initializedRef","useEffect","chatMessage","handleReply","useCallback","displayText","postback","payload","currentMessage","nextMessageId","nextMessage","handleAction","openUrlAction","dialAction","dialerAction","mapAction","viewLocationAction","phoneNumber","location","actionData","label","mapsUrl","reset","useJsonFetch","url","data","setData","useState","isLoading","setIsLoading","error","setError","fetchJson","response","json","err","useAutoScroll","dependency","scrollRef","BusinessHeader","memo","isDark","brandColor","jsxs","BrandedHero","TextMessage","sender","timestamp","isBusiness","formattedTime","UserReply","RichCard","handleSuggestionClick","heightMap","cardBgColor","RichCardSuggestionItem","ICON_CLASS","GlobeIcon","PhoneIcon","MapMarkerIcon","CalendarIcon","ReplyIcon","onClick","isAction","getActionIcon","Carousel","cards","canScrollLeft","setCanScrollLeft","canScrollRight","setCanScrollRight","updateScrollButtons","scrollLeft","scrollWidth","clientWidth","scroll","direction","CarouselCard","CAROUSEL_ICON_CLASS","getCarouselActionIcon","onSuggestionClick","widthClass","renderers","MessageRenderer","isLast","Renderer","TypingIndicator","MessageList","chatHistory","isTyping","SuggestionChip","variant","ActionIcon","getActionLabel","className","style","SuggestionsBar","handleClick","ChatWindow","lastMessage","BusinessProfile","activeTab","setActiveTab","bannerUrl","QuickActionButton","phone","email","TabButton","InfoTab","OptionsTab","icon","icons","active","ContactItem","website","primary","secondary","iconPaths","OptionItem","VIEW_MODE_HEIGHTS","WebViewRenderer","loadError","setLoadError","handleIframeLoad","handleIframeError","getDomainFromUrl","viewMode","title","displayTitle","isFull","isBottomSheet","heightClass","LockScreen","onUnlock","messagePreview","currentTime","setCurrentTime","timer","formattedDate","RcsEmulatorInner","baseHandleAction","setIsProfileOpen","prev","setWebView","config","webViewConfig","RcsEmulator","jsonUrl","width","showLockScreen","isLocked","setIsLocked","handleUnlock","fetchedData","fetchError","flowData","isValidFlow","useMemo","mergedBusinessInfo","EmulatorContainer"],"mappings":"oKAsQO,SAASA,EACdC,EACiC,CACjC,MAAO,UAAWA,CACpB,CAEO,SAASC,EACdD,EACkC,CAClC,MAAO,WAAYA,CACrB,CAeO,SAASE,GAAgBF,EAAoC,CAClE,GAAI,CAACC,EAAkBD,CAAU,EAAG,MAAO,GAC3C,KAAM,CAAE,UAAAG,GAAcH,EAAW,OACjC,OAAOG,GAAW,SAAS,cAAgB,SAC7C,CAGO,SAASC,EACdJ,EACmB,CACnB,KAAM,CAAE,UAAAG,GAAcH,EAAW,OACjC,OAAIG,GAAW,SAAS,cAAgB,UAC/BA,EAAU,QAEZ,IACT,CC7RA,MAAME,GAAoC,CACxC,KAAM,WACN,SAAU,EACZ,EAEMC,GAAkC,CACtC,iBAAkB,KAClB,YAAa,CAAA,EACb,SAAU,GACV,MAAO,IACT,EAEMC,EAAkBC,EAAAA,cAA2C,IAAI,EAkBhE,SAASC,EAAiB,CAC/B,SAAAC,EACA,MAAAC,EACA,OAAAC,EACA,aAAAC,EACA,MAAAC,EACA,gBAAAC,EACA,cAAAC,EACA,cAAAC,EACA,QAAAC,EACA,SAAAC,EACA,QAAAC,EACA,YAAAC,EACA,aAAAC,CACF,EAA0B,CACxB,MAAMC,EAA8B,CAClC,MAAAZ,EACA,OAAAC,EACA,aAAc,CAAE,GAAGP,GAAqB,GAAGQ,CAAA,EAC3C,MAAO,CAAE,GAAGP,GAAc,GAAGQ,CAAA,EAC7B,gBAAAC,EACA,cAAAC,EACA,cAAAC,EACA,YAAaC,EACb,aAAcC,EACd,QAAAC,EACA,YAAAC,EACA,aAAAC,CAAA,EAGF,OACEE,EAAAA,IAACjB,EAAgB,SAAhB,CAAyB,MAAAgB,EACvB,SAAAb,CAAA,CACH,CAEJ,CAEO,SAASe,GAAoC,CAClD,MAAMC,EAAUC,EAAAA,WAAWpB,CAAe,EAC1C,GAAI,CAACmB,EACH,MAAM,IAAI,MAAM,qDAAqD,EAEvE,OAAOA,CACT,CCxEO,SAASE,EAAiBC,EAA8C,CAC7E,MAAMC,EAAW,OAAO,OAAOD,EAAK,QAAQ,EAC5C,OAAOC,EAAS,KAAMC,GAAQA,EAAI,QAAQ,GAAKD,EAAS,CAAC,GAAK,IAChE,CAKO,SAASE,EACdH,EACAI,EACmB,CACnB,OAAOJ,EAAK,SAASI,CAAS,GAAK,IACrC,CAKO,SAASC,EACdC,EACAC,EACe,CACf,MAAMC,EAAUF,EAAQ,WAAW,SAAS,kBAAkB,QAC9D,OAAKE,GAEUA,EAAQD,CAAY,GACpB,cAAgB,IACjC,CAKO,SAASE,EACdH,EACAI,EACa,CACb,MAAMC,EAAQL,EAAQ,MAChBM,EAAUC,GAAaF,CAAK,EAE5BG,EAAcC,GAA+BJ,CAAK,EAExD,MAAO,CACL,GAAI,GAAGL,EAAQ,EAAE,IAAII,CAAY,IAAI,KAAK,IAAA,CAAK,GAC/C,OAAQ,WACR,QAAAE,EACA,UAAW,KAAK,IAAA,EAChB,YAAAE,CAAA,CAEJ,CAKA,SAASD,GAAaF,EAAyC,CAC7D,UAAWK,KAAQL,EAAO,CACxB,MAAMM,EAAaD,EAAK,WAGxB,GAAIC,EAAW,YACb,MAAO,CACL,KAAM,OACN,KAAMA,EAAW,WAAA,EAKrB,MAAMC,EAAOD,EAAW,iBAAiB,SAAS,mBAClD,GAAIC,EACF,MAAO,CACL,KAAM,WACN,KAAMC,EAAiBD,EAAK,QAASA,EAAK,MAAM,CAAA,EAKpD,MAAME,EAAWH,EAAW,iBAAiB,SAAS,2BACtD,GAAIG,EACF,MAAO,CACL,KAAM,WACN,MAAOA,EAAS,QAAQ,IAAKC,GAC3BF,EAAiBE,EAAa,CAC5B,gBAAiB,WACjB,UAAWD,EAAS,OAAO,SAAA,CAC5B,CAAA,CACH,CAGN,CAGA,MAAO,CACL,KAAM,OACN,KAAM,4BAAA,CAEV,CAQA,SAASD,EACPP,EACAU,EACc,CAEd,MAAMC,EAAc,IAA0B,CAC5C,GAAKX,EAAQ,MAEb,IAAIA,EAAQ,MAAM,SAAU,OAAOA,EAAQ,MAAM,SAEjD,GAAIA,EAAQ,MAAM,aAAa,QAAS,OAAOA,EAAQ,MAAM,YAAY,QAE3E,EAEMY,EAAkB,IAA0B,CAChD,GAAKZ,EAAQ,MAEb,IAAIA,EAAQ,MAAM,aAAc,OAAOA,EAAQ,MAAM,aACrD,GAAIA,EAAQ,MAAM,aAAa,aAAc,OAAOA,EAAQ,MAAM,YAAY,aAEhF,EAEMa,EAAWF,EAAA,EAEjB,MAAO,CACL,MAAOX,EAAQ,MACf,YAAaA,EAAQ,YACrB,MAAOa,EACH,CACE,IAAKA,EACL,OAAQC,GAAUd,EAAQ,OAAO,QAAU,eAAe,EAC1D,aAAcY,EAAA,CAAgB,EAEhC,OACJ,YAAaZ,EAAQ,YACrB,OAAQ,CACN,YAAaU,EAAO,kBAAoB,aAAe,aAAe,WACtE,MAAOA,EAAO,YAAc,cAAgB,QAAU,SACtD,eAAgBA,EAAO,iBAAmB,QAAU,QAAU,MAAA,CAChE,CAEJ,CAKA,SAASI,GAAUC,EAA6C,CAC9D,OAAQA,EAAA,CACN,IAAK,eACH,MAAO,QACT,IAAK,cACH,MAAO,OACT,QACE,MAAO,QAAA,CAEb,CAQA,SAASZ,GAA+BJ,EAA0C,CAChF,MAAMG,EAA+B,CAAA,EAErC,UAAWE,KAAQL,EAAO,CACxB,MAAMM,EAAaD,EAAK,WAGpBC,EAAW,mBAAmB,aAChCH,EAAY,KAAK,GAAGG,EAAW,kBAAkB,WAAW,CAEhE,CAEA,OAAOH,CACT,CAwCO,SAASc,GAAuBC,EAA2B,CAChE,MAAO,CACL,GAAI,QAAQ,KAAK,IAAA,CAAK,GACtB,OAAQ,OACR,QAAS,CACP,KAAM,YACN,KAAAA,CAAA,EAEF,UAAW,KAAK,IAAA,CAAI,CAExB,CAKO,SAASC,EAAyB9B,EAA4C,CACnF,GAAI,CAACA,GAAQ,OAAOA,GAAS,SAAU,MAAO,GAE9C,MAAM+B,EAAI/B,EAGV,GADI,OAAO+B,EAAE,MAAS,UAClB,CAACA,EAAE,UAAY,OAAOA,EAAE,UAAa,SAAU,MAAO,GAG1D,MAAM9B,EAAW,OAAO,OAAO8B,EAAE,QAAmC,EACpE,GAAI9B,EAAS,SAAW,EAAG,MAAO,GAGlC,UAAWC,KAAOD,EAAU,CAC1B,GAAI,CAACC,GAAO,OAAOA,GAAQ,SAAU,MAAO,GAC5C,MAAM8B,EAAI9B,EAEV,GADI,OAAO8B,EAAE,IAAO,UAChB,CAAC,MAAM,QAAQA,EAAE,KAAK,EAAG,MAAO,EACtC,CAEA,MAAO,EACT,CAKO,SAASC,EAAuBjC,EAAmC,CACxE,MAAMkC,EAAenC,EAAiBC,CAAI,EAC1C,GAAI,CAACkC,GAAgB,CAACA,EAAa,MAAM,OAAQ,MAAO,cAGxD,MAAMjB,EADOiB,EAAa,MAAM,CAAC,EACT,WAGxB,GAAIjB,EAAW,YACb,OAAOA,EAAW,YAAY,MAAM,EAAG,EAAE,GAAKA,EAAW,YAAY,OAAS,GAAK,MAAQ,IAI7F,MAAMC,EAAOD,EAAW,iBAAiB,SAAS,mBAClD,GAAIC,GAAM,QAAQ,MAChB,OAAOA,EAAK,QAAQ,MAItB,MAAME,EAAWH,EAAW,iBAAiB,SAAS,2BACtD,OAAIG,GAAU,QAAQ,CAAC,GAAG,MACjBA,EAAS,QAAQ,CAAC,EAAE,MAGtB,aACT,CCvRA,MAAMe,EAAkC,CACtC,iBAAkB,KAClB,YAAa,CAAA,EACb,SAAU,GACV,MAAO,IACT,EAEA,SAASC,GACPnD,EACAoD,EACmB,CACnB,OAAQA,EAAO,KAAA,CACb,IAAK,OACH,MAAO,CACL,GAAGpD,EACH,iBAAkBoD,EAAO,UACzB,MAAO,IAAA,EAGX,IAAK,uBACH,MAAO,CACL,GAAGpD,EACH,YAAa,CAAC,GAAGA,EAAM,YAAaoD,EAAO,OAAO,EAClD,SAAU,EAAA,EAGd,IAAK,iBAAkB,CACrB,MAAMC,EAAcV,GAAuBS,EAAO,IAAI,EAEhDE,EAAiBtD,EAAM,YAAY,IAAI,CAACiB,EAAKsC,IACjDA,IAAQvD,EAAM,YAAY,OAAS,EAC/B,CAAE,GAAGiB,EAAK,YAAa,QACvBA,CAAA,EAEN,MAAO,CACL,GAAGjB,EACH,YAAa,CAAC,GAAGsD,EAAgBD,CAAW,CAAA,CAEhD,CAEA,IAAK,aACH,MAAO,CACL,GAAGrD,EACH,SAAUoD,EAAO,QAAA,EAGrB,IAAK,cACH,MAAO,CACL,GAAGpD,EACH,iBAAkBoD,EAAO,SAAA,EAG7B,IAAK,YACH,MAAO,CACL,GAAGpD,EACH,MAAOoD,EAAO,MACd,SAAU,EAAA,EAGd,IAAK,QACH,OAAOF,EAET,QACE,OAAOlD,CAAA,CAEb,CAQO,SAASwD,GAAgB,CAC9B,KAAAzC,EACA,YAAA0C,EACA,YAAAC,EAAc,GAChB,EAA2B,CACzB,KAAM,CAAC1D,EAAO2D,CAAQ,EAAIC,EAAAA,WAAWT,GAAqBD,CAAY,EAChEW,EAAkBC,EAAAA,OAAO,CAAC,EAC1BC,EAAiBD,EAAAA,OAAO,EAAK,EAGnCE,EAAAA,UAAU,IAAM,CACd,GAAID,EAAe,QAAS,OAC5BA,EAAe,QAAU,GAEzB,MAAMd,EAAenC,EAAiBC,CAAI,EAC1C,GAAI,CAACkC,EAAc,CACjBU,EAAS,CACP,KAAM,YACN,MAAO,6CAAA,CACR,EACD,MACF,CAEAA,EAAS,CAAE,KAAM,OAAQ,UAAWV,EAAa,GAAI,EAGrD,MAAMgB,EAAczC,EAClByB,EACAY,EAAgB,SAAA,EAElBF,EAAS,CAAE,KAAM,uBAAwB,QAASM,EAAa,CACjE,EAAG,CAAClD,CAAI,CAAC,EAGT,MAAMmD,EAAcC,EAAAA,YACjBjF,GAA8B,CAC7B,GAAI,CAACD,EAAiBC,CAAU,EAAG,OAEnC,KAAM,CAAE,YAAAkF,EAAa,SAAAC,CAAA,EAAanF,EAAW,MACvCoC,EAAe+C,EAAS,KAG9BV,EAAS,CAAE,KAAM,iBAAkB,KAAMS,EAAa,aAAA9C,EAAc,EAGpE,MAAMgD,EAA4B,CAChC,KAAM,QACN,aAAAhD,EACA,YAAA8C,EACA,UAAW,KAAK,IAAA,CAAI,EAEtBX,EAAYa,CAAO,EAGnB,MAAMC,EAAiBvE,EAAM,iBACzBkB,EAAeH,EAAMf,EAAM,gBAAgB,EAC3C,KAEJ,GAAI,CAACuE,EAAgB,CACnBZ,EAAS,CAAE,KAAM,YAAa,MAAO,4BAA6B,EAClE,MACF,CAEA,MAAMa,EAAgBpD,EAAkBmD,EAAgBjD,CAAY,EACpE,GAAI,CAACkD,EAEH,OAGF,MAAMC,EAAcvD,EAAeH,EAAMyD,CAAa,EACtD,GAAI,CAACC,EAAa,CAChBd,EAAS,CACP,KAAM,YACN,MAAO,iBAAiBa,CAAa,aAAA,CACtC,EACD,MACF,CAGAb,EAAS,CAAE,KAAM,aAAc,SAAU,GAAM,EAC/CA,EAAS,CAAE,KAAM,cAAe,UAAWa,EAAe,EAE1D,WAAW,IAAM,CACf,MAAMP,EAAczC,EAClBiD,EACAZ,EAAgB,SAAA,EAElBF,EAAS,CAAE,KAAM,uBAAwB,QAASM,EAAa,CACjE,EAAGP,CAAW,CAChB,EACA,CAAC3C,EAAMf,EAAM,iBAAkByD,EAAaC,CAAW,CAAA,EAInDgB,EAAeP,EAAAA,YAClBjF,GAA8B,CAC7B,GAAI,CAACC,EAAkBD,CAAU,EAAG,OAEpC,KAAM,CACJ,YAAAkF,EACA,SAAAC,EACA,cAAAM,EACA,WAAAC,EACA,aAAAC,EACA,UAAAC,EACA,mBAAAC,CAAA,EACE7F,EAAW,OACToC,EAAe+C,EAAS,KAGxBW,EACJJ,GAAY,aAAeC,GAAc,iBAAiB,YAGtDI,EACJH,GAAW,cAAc,UAAYC,GAAoB,QAG3D,IAAIG,EACAP,EACFO,EAAa,CAAE,KAAM,UAAW,IAAKP,EAAc,GAAA,EAC1CK,EACTE,EAAa,CAAE,KAAM,OAAQ,YAAAF,CAAA,EACpBC,IACTC,EAAa,CACX,KAAM,eACN,SAAUD,EAAS,SACnB,UAAWA,EAAS,UACpB,MAAOF,GAAoB,KAAA,GAK/B,MAAMT,EAA4B,CAChC,KAAM,SACN,aAAAhD,EACA,YAAA8C,EACA,UAAW,KAAK,IAAA,EAChB,WAAAc,CAAA,EAKF,GAHAzB,EAAYa,CAAO,EAGfK,EACF,OAAO,KAAKA,EAAc,IAAK,SAAU,qBAAqB,UACrDK,EACT,OAAO,SAAS,KAAO,OAAOA,CAAW,WAChCC,EAAU,CAEnB,MAAME,EACJL,GAAW,cAAc,UAAU,OACnCC,GAAoB,OACpB,GACIK,EAAU,mDACdH,EAAS,QACX,IAAIA,EAAS,SAAS,GACpBE,EAAQ,mBAAmB,mBAAmBA,CAAK,CAAC,GAAK,EAC3D,GACA,OAAO,KAAKC,EAAS,SAAU,qBAAqB,CACtD,CAGA,MAAMb,EAAiBvE,EAAM,iBACzBkB,EAAeH,EAAMf,EAAM,gBAAgB,EAC3C,KAEJ,GAAIuE,EAAgB,CAClB,MAAMC,EAAgBpD,EAAkBmD,EAAgBjD,CAAY,EACpE,GAAIkD,EAAe,CACjB,MAAMC,EAAcvD,EAAeH,EAAMyD,CAAa,EAClDC,IACFd,EAAS,CACP,KAAM,iBACN,KAAMS,EACN,aAAA9C,CAAA,CACD,EACDqC,EAAS,CAAE,KAAM,aAAc,SAAU,GAAM,EAC/CA,EAAS,CAAE,KAAM,cAAe,UAAWa,EAAe,EAE1D,WAAW,IAAM,CACf,MAAMP,GAAczC,EAClBiD,EACAZ,EAAgB,SAAA,EAElBF,EAAS,CAAE,KAAM,uBAAwB,QAASM,GAAa,CACjE,EAAGP,CAAW,EAElB,CACF,CACF,EACA,CAAC3C,EAAMf,EAAM,iBAAkByD,EAAaC,CAAW,CAAA,EAInD2B,EAAQlB,EAAAA,YAAY,IAAM,CAC9BJ,EAAe,QAAU,GACzBF,EAAgB,QAAU,EAC1BF,EAAS,CAAE,KAAM,QAAS,CAC5B,EAAG,CAAA,CAAE,EAEL,MAAO,CACL,MAAA3D,EACA,YAAAkE,EACA,aAAAQ,EACA,MAAAW,CAAA,CAEJ,CC1RO,SAASC,EAAaC,EAA6C,CACxE,KAAM,CAACC,EAAMC,CAAO,EAAIC,EAAAA,SAAqC,IAAI,EAC3D,CAACC,EAAWC,CAAY,EAAIF,EAAAA,SAAS,EAAK,EAC1C,CAACG,EAAOC,CAAQ,EAAIJ,EAAAA,SAAwB,IAAI,EAEhDK,EAAY5B,EAAAA,YAAY,SAAY,CACxC,GAAI,CAACoB,EAAK,CACRE,EAAQ,IAAI,EACZK,EAAS,IAAI,EACb,MACF,CAEAF,EAAa,EAAI,EACjBE,EAAS,IAAI,EAEb,GAAI,CACF,MAAME,EAAW,MAAM,MAAMT,EAAK,CAChC,OAAQ,MACR,QAAS,CACP,OAAQ,kBAAA,CACV,CACD,EAED,GAAI,CAACS,EAAS,GACZ,MAAM,IAAI,MAAM,QAAQA,EAAS,MAAM,KAAKA,EAAS,UAAU,EAAE,EAGnE,MAAMC,EAAO,MAAMD,EAAS,KAAA,EAG5B,GAAI,CAACC,GAAQ,OAAOA,GAAS,SAC3B,MAAM,IAAI,MAAM,kCAAkC,EAGpD,GAAI,CAACA,EAAK,UAAY,OAAOA,EAAK,UAAa,SAC7C,MAAM,IAAI,MAAM,6CAA6C,EAG/DR,EAAQQ,CAA2B,CACrC,OAASC,EAAK,CACZ,MAAM7E,EACJ6E,aAAe,MAAQA,EAAI,QAAU,uBACvCJ,EAASzE,CAAO,EAChBoE,EAAQ,IAAI,CACd,QAAA,CACEG,EAAa,EAAK,CACpB,CACF,EAAG,CAACL,CAAG,CAAC,EAERvB,OAAAA,EAAAA,UAAU,IAAM,CACd+B,EAAA,CACF,EAAG,CAACA,CAAS,CAAC,EAEP,CACL,KAAAP,EACA,UAAAG,EACA,MAAAE,EACA,QAASE,CAAA,CAEb,CCtEO,SAASI,GACdC,EACqB,CACrB,MAAMC,EAAYvC,EAAAA,OAAU,IAAI,EAEhCE,OAAAA,EAAAA,UAAU,IAAM,CACVqC,EAAU,SACZA,EAAU,QAAQ,SAAS,CACzB,IAAKA,EAAU,QAAQ,aACvB,SAAU,QAAA,CACX,CAEL,EAAG,CAACD,CAAU,CAAC,EAERC,CACT,CCdO,MAAMC,GAAiBC,EAAAA,KAAK,UAA0B,CAC3D,KAAM,CAAE,MAAA1G,EAAO,aAAAE,EAAc,cAAAI,CAAA,EAAkBQ,EAAA,EAEzC6F,EAAS3G,IAAU,OACnB4G,EAAa1G,EAAa,YAAc,UAE9C,OACE2G,EAAAA,KAAC,SAAA,CACC,UAAW;AAAA;AAAA,UAEPF,EAAS,8BAAgC,0BAA0B;AAAA,QAEvE,KAAK,SACL,aAAY,aAAazG,EAAa,IAAI,GAG1C,SAAA,CAAAW,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,UAAW;AAAA;AAAA,YAEP8F,EAAS,+BAAiC,iCAAiC;AAAA,UAE/E,aAAW,UAEX,SAAA9F,EAAAA,IAAC,OAAI,UAAU,UAAU,KAAK,OAAO,QAAQ,YAAY,OAAO,eAC9D,eAAC,OAAA,CAAK,cAAc,QAAQ,eAAe,QAAQ,YAAa,EAAG,EAAE,kBAAkB,CAAA,CACzF,CAAA,CAAA,EAIFgG,EAAAA,KAAC,SAAA,CACC,QAASvG,EACT,UAAU,qDACV,aAAW,qBAGX,SAAA,CAAAO,EAAAA,IAAC,MAAA,CACC,UAAW;AAAA;AAAA,cAEP8F,EAAS,cAAgB,aAAa;AAAA,YAE1C,MAAO,CACL,gBAAiBzG,EAAa,KAAO,OAAY0G,CAAA,EAGlD,WAAa,KACZ/F,EAAAA,IAAC,MAAA,CACC,IAAKX,EAAa,KAClB,IAAK,GAAGA,EAAa,IAAI,QACzB,UAAU,4BAAA,CAAA,EAGZW,MAAC,MAAA,CAAI,UAAU,8EACZ,SAAAX,EAAa,KAAK,OAAO,CAAC,EAAE,YAAA,CAAY,CAC3C,CAAA,CAAA,EAKJW,EAAAA,IAAC,KAAA,CACC,UAAW;AAAA;AAAA,cAEP8F,EAAS,aAAe,eAAe;AAAA,YAG1C,SAAAzG,EAAa,IAAA,CAAA,CAChB,CAAA,CAAA,EAIF2G,EAAAA,KAAC,MAAA,CAAI,UAAU,4BAEZ,SAAA,CAAA3G,EAAa,UACZW,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,UAAW;AAAA;AAAA,gBAEP8F,EAAS,oBAAsB,mBAAmB;AAAA,cAEtD,aAAW,oBAEX,gBAAC,MAAA,CAAI,UAAU,UAAU,QAAQ,YAAY,KAAK,OAEhD,SAAA,CAAA9F,EAAAA,IAAC,OAAA,CACC,EAAE,8CACF,OAAQ8F,EAAS,UAAY,UAC7B,YAAa,EACb,cAAc,QACd,eAAe,OAAA,CAAA,EAGjB9F,EAAAA,IAAC,OAAA,CACC,EAAE,gBACF,OAAO,UACP,YAAa,EACb,cAAc,QACd,eAAe,OAAA,CAAA,CACjB,CAAA,CACF,CAAA,CAAA,EAKJA,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,UAAW;AAAA;AAAA,cAEP8F,EAAS,kCAAoC,iCAAiC;AAAA,YAElF,aAAW,eAEX,SAAA9F,EAAAA,IAAC,OAAI,UAAU,UAAU,KAAK,OAAO,QAAQ,YAAY,OAAO,eAC9D,eAAC,OAAA,CAAK,cAAc,QAAQ,eAAe,QAAQ,YAAa,EAAG,EAAE,wHAAwH,CAAA,CAC/L,CAAA,CAAA,CACF,CAAA,CACF,CAAA,CAAA,CAAA,CAGN,CAAC,ECtHYiG,GAAcJ,EAAAA,KAAK,UAAuB,CACrD,KAAM,CAAE,MAAA1G,EAAO,aAAAE,CAAA,EAAiBY,EAAA,EAE1B6F,EAAS3G,IAAU,OACnB4G,EAAa1G,EAAa,YAAc,UAE9C,OACE2G,EAAAA,KAAC,MAAA,CAAI,UAAU,uCAEb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,gBACb,SAAA,CAAAhG,EAAAA,IAAC,MAAA,CACC,UAAW;AAAA;AAAA,cAEP8F,EAAS,cAAgB,aAAa;AAAA;AAAA,YAG1C,MAAO,CACL,gBAAiBzG,EAAa,KAAO,OAAY0G,CAAA,EAGlD,WAAa,KACZ/F,EAAAA,IAAC,MAAA,CACC,IAAKX,EAAa,KAClB,IAAK,GAAGA,EAAa,IAAI,QACzB,UAAU,4BAAA,CAAA,EAGZW,MAAC,MAAA,CAAI,UAAU,+EACZ,SAAAX,EAAa,KAAK,OAAO,CAAC,EAAE,YAAA,CAAY,CAC3C,CAAA,CAAA,EAKHA,EAAa,UACZW,EAAAA,IAAC,MAAA,CACC,UAAU,oIAEV,SAAAA,EAAAA,IAAC,MAAA,CACC,UAAU,qBACV,QAAQ,YACR,KAAK,eAEL,SAAAA,EAAAA,IAAC,OAAA,CAAK,EAAE,2DAAA,CAA4D,CAAA,CAAA,CACtE,CAAA,CACF,EAEJ,EAGAA,EAAAA,IAAC,KAAA,CACC,UAAW;AAAA;AAAA,YAEP8F,EAAS,aAAe,eAAe;AAAA,UAG1C,SAAAzG,EAAa,IAAA,CAAA,EAIfA,EAAa,aACZW,EAAAA,IAAC,IAAA,CACC,UAAW;AAAA;AAAA,cAEP8F,EAAS,gBAAkB,eAAe;AAAA,YAG7C,SAAAzG,EAAa,WAAA,CAAA,CAChB,EAEJ,CAEJ,CAAC,EClEY6G,GAAcL,EAAAA,KAAK,SAAqB,CACnD,KAAA3D,EACA,OAAAiE,EACA,UAAAC,CACF,EAAqB,CACnB,KAAM,CAAE,MAAAjH,EAAO,aAAAE,CAAA,EAAiBY,EAAA,EAE1B6F,EAAS3G,IAAU,OACnBkH,EAAaF,IAAW,WACxBJ,EAAa1G,EAAa,YAAc,UAExCiH,EAAgB,IAAI,KAAKF,CAAS,EAAE,mBAAmB,CAAA,EAAI,CAC/D,KAAM,UACN,OAAQ,SAAA,CACT,EAED,OAAIC,EAEAL,EAAAA,KAAC,MAAA,CAAI,UAAU,cACb,SAAA,CAAAhG,EAAAA,IAAC,MAAA,CACC,UAAW;AAAA;AAAA,cAEP8F,EAAS,yBAA2B,2BAA2B;AAAA,YAGlE,SAAA5D,CAAA,CAAA,EAEHlC,EAAAA,IAAC,OAAA,CAAK,UAAU,UAAW,SAAAsG,CAAA,CAAc,CAAA,EAC3C,EAMFN,EAAAA,KAAC,MAAA,CAAI,UAAU,6CACb,SAAA,CAAAhG,EAAAA,IAAC,MAAA,CACC,UAAU,8DACV,MAAO,CAAE,gBAAiB+F,CAAA,EAEzB,SAAA7D,CAAA,CAAA,EAEHlC,EAAAA,IAAC,MAAA,CACC,UAAU,sEACV,MAAO,CAAE,gBAAiB+F,CAAA,EAE1B,SAAA/F,EAAAA,IAAC,MAAA,CACC,UAAU,qBACV,QAAQ,YACR,KAAK,OACL,OAAO,eACP,YAAa,EAEb,eAAC,OAAA,CAAK,cAAc,QAAQ,eAAe,QAAQ,EAAE,gBAAA,CAAiB,CAAA,CAAA,CACxE,CAAA,EAEFA,EAAAA,IAAC,OAAA,CAAK,UAAU,UAAW,SAAAsG,CAAA,CAAc,CAAA,EAC3C,CAEJ,CAAC,EC3DYC,GAAYV,EAAAA,KAAK,SAAmB,CAC/C,KAAA3D,EACA,UAAAkE,CACF,EAAmB,CACjB,KAAM,CAAE,aAAA/G,CAAA,EAAiBY,EAAA,EACnB8F,EAAa1G,EAAa,YAAc,UAExCiH,EAAgB,IAAI,KAAKF,CAAS,EAAE,mBAAmB,CAAA,EAAI,CAC/D,KAAM,UACN,OAAQ,SAAA,CACT,EAED,OACEJ,EAAAA,KAAC,MAAA,CAAI,UAAU,6CAEb,SAAA,CAAAhG,EAAAA,IAAC,MAAA,CACC,UAAU,wEACV,MAAO,CAAE,gBAAiB+F,CAAA,EAEzB,SAAA7D,CAAA,CAAA,EAIHlC,EAAAA,IAAC,MAAA,CACC,UAAU,sEACV,MAAO,CAAE,gBAAiB+F,CAAA,EAE1B,SAAA/F,EAAAA,IAAC,MAAA,CACC,UAAU,qBACV,QAAQ,YACR,KAAK,OACL,OAAO,eACP,YAAa,EAEb,SAAAA,EAAAA,IAAC,OAAA,CACC,cAAc,QACd,eAAe,QACf,EAAE,gBAAA,CAAA,CACJ,CAAA,CACF,CAAA,EAIFA,EAAAA,IAAC,OAAA,CAAK,UAAU,UAAW,SAAAsG,CAAA,CAAc,CAAA,EAC3C,CAEJ,CAAC,ECtCYE,GAAWX,EAAAA,KAAK,SAAkB,CAC7C,KAAAtE,EACA,UAAA6E,CACF,EAAkB,CAChB,KAAM,CAAE,MAAAjH,EAAO,YAAAqE,EAAa,aAAAQ,CAAA,EAAiB/D,EAAA,EAEvC6F,EAAS3G,IAAU,OAEnBmH,EAAgB,IAAI,KAAKF,CAAS,EAAE,mBAAmB,CAAA,EAAI,CAC/D,KAAM,UACN,OAAQ,SAAA,CACT,EAEKK,EAAyBjI,GAA8B,CACvD,UAAWA,EACbgF,EAAYhF,CAAU,EAEtBwF,EAAaxF,CAAU,CAE3B,EAGMkI,EAAY,CAChB,MAAO,OACP,OAAQ,OACR,KAAM,MAAA,EAIFC,EAAcb,EAAS,cAAgB,eAE7C,OACEE,EAAAA,KAAC,MAAA,CAAI,UAAU,SACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CACC,UAAW;AAAA;AAAA,YAEPW,CAAW;AAAA,UAId,SAAA,CAAApF,EAAK,OACJvB,EAAAA,IAAC,MAAA,CACC,UAAW;AAAA;AAAA,gBAEP0G,EAAUnF,EAAK,MAAM,MAAM,CAAC;AAAA,cAGhC,SAAAvB,EAAAA,IAAC,MAAA,CACC,IAAKuB,EAAK,MAAM,IAChB,IAAKA,EAAK,OAAS,kBACnB,UAAU,6BACV,QAAQ,MAAA,CAAA,CACV,CAAA,EAKJyE,EAAAA,KAAC,MAAA,CAAI,UAAU,MACZ,SAAA,CAAAzE,EAAK,OACJvB,EAAAA,IAAC,KAAA,CACC,UAAW;AAAA;AAAA,kBAEP8F,EAAS,aAAe,eAAe;AAAA,gBAG1C,SAAAvE,EAAK,KAAA,CAAA,EAITA,EAAK,aACJvB,EAAAA,IAAC,IAAA,CACC,UAAW;AAAA;AAAA,kBAEP8F,EAAS,gBAAkB,eAAe;AAAA,gBAG7C,SAAAvE,EAAK,WAAA,CAAA,EAKTA,EAAK,aAAeA,EAAK,YAAY,OAAS,GAC7CvB,EAAAA,IAAC,MAAA,CACC,UAAW;AAAA;AAAA,kBAEP8F,EAAS,8BAAgC,0BAA0B;AAAA,gBAGtE,SAAAvE,EAAK,YAAY,IAAI,CAAC/C,EAAYqE,IACjC7C,EAAAA,IAAC4G,GAAA,CAEC,WAAApI,EACA,QAAS,IAAMiI,EAAsBjI,CAAU,EAC/C,OAAAsH,CAAA,EAHKjD,CAAA,CAKR,CAAA,CAAA,CACH,CAAA,CAEJ,CAAA,CAAA,CAAA,EAIF7C,EAAAA,IAAC,OAAA,CAAK,UAAU,UAAW,SAAAsG,CAAA,CAAc,CAAA,EAC3C,CAEJ,CAAC,EAUKO,EAAa,wBAGbC,GAAY,IAChB9G,EAAAA,IAAC,MAAA,CAAI,UAAW6G,EAAY,KAAK,OAAO,QAAQ,YAAY,OAAO,eAAe,YAAa,IAC7F,eAAC,OAAA,CAAK,cAAc,QAAQ,eAAe,QAAQ,EAAE,uJAAA,CAAwJ,CAAA,CAC/M,EAIIE,GAAY,IAChB/G,EAAAA,IAAC,MAAA,CAAI,UAAW6G,EAAY,KAAK,OAAO,QAAQ,YAAY,OAAO,eAAe,YAAa,IAC7F,eAAC,OAAA,CAAK,cAAc,QAAQ,eAAe,QAAQ,EAAE,uNAAA,CAAwN,CAAA,CAC/Q,EAIIG,GAAgB,IACpBhB,EAAAA,KAAC,MAAA,CAAI,UAAWa,EAAY,KAAK,OAAO,QAAQ,YAAY,OAAO,eAAe,YAAa,IAC7F,SAAA,CAAA7G,MAAC,QAAK,cAAc,QAAQ,eAAe,QAAQ,EAAE,qFAAqF,QACzI,OAAA,CAAK,cAAc,QAAQ,eAAe,QAAQ,EAAE,kCAAA,CAAmC,CAAA,EAC1F,EAIIiH,GAAe,IACnBjH,EAAAA,IAAC,MAAA,CAAI,UAAW6G,EAAY,KAAK,OAAO,QAAQ,YAAY,OAAO,eAAe,YAAa,IAC7F,eAAC,OAAA,CAAK,cAAc,QAAQ,eAAe,QAAQ,EAAE,wFAAA,CAAyF,CAAA,CAChJ,EAIIK,EAAY,IAChBlH,EAAAA,IAAC,MAAA,CAAI,UAAW6G,EAAY,KAAK,OAAO,QAAQ,YAAY,OAAO,eAAe,YAAa,IAC7F,eAAC,OAAA,CAAK,cAAc,QAAQ,eAAe,QAAQ,EAAE,+JAAA,CAAgK,CAAA,CACvN,EAGID,GAAyBf,EAAAA,KAAK,SAAgC,CAClE,WAAArH,EACA,QAAA2I,EACA,OAAArB,CACF,EAAgC,CAC9B,MAAMsB,EAAW3I,EAAkBD,CAAU,EACvCkF,EAAc0D,EAChB5I,EAAW,OAAO,YAClBA,EAAW,MAAM,YAGf6I,EAAgB,IAAM,CAC1B,GAAI,CAACD,EAAU,OAAOpH,MAACkH,EAAA,CAAA,CAAU,EAEjC,KAAM,CAAE,OAAAxE,GAAWlE,EAEnB,OAAIkE,EAAO,WAAaA,EAAO,oBAAuBoE,GAAA,EAAU,EAC5DpE,EAAO,cAAgBA,EAAO,iBAAoBqE,GAAA,EAAU,EAC5DrE,EAAO,WAAaA,EAAO,yBAA4BsE,GAAA,EAAc,EACrEtE,EAAO,gBAAkBA,EAAO,gCAAmCuE,GAAA,EAAa,QAE5EC,EAAA,EAAU,CACpB,EAEA,OACElB,EAAAA,KAAC,SAAA,CACC,QAAAmB,EACA,UAAW;AAAA;AAAA,UAEPrB,EAAS,oBAAsB,kBAAkB;AAAA,QAGrD,SAAA,CAAA9F,EAAAA,IAAC,OAAA,CAAK,UAAU,gBAAiB,SAAAqH,EAAA,EAAgB,EACjDrH,EAAAA,IAAC,QAAK,UAAW,WAAW8F,EAAS,aAAe,eAAe,GAChE,SAAApC,CAAA,CACH,CAAA,CAAA,CAAA,CAGN,CAAC,ECpMY4D,GAAWzB,EAAAA,KAAK,SAAkB,CAAE,MAAA0B,EAAO,UAAAnB,GAA4B,CAClF,KAAM,CAAE,MAAAjH,EAAO,YAAAqE,EAAa,aAAAQ,CAAA,EAAiB/D,EAAA,EACvC0F,EAAYvC,EAAAA,OAAuB,IAAI,EACvC,CAACoE,EAAeC,CAAgB,EAAIzC,EAAAA,SAAS,EAAK,EAClD,CAAC0C,EAAgBC,CAAiB,EAAI3C,EAAAA,SAASuC,EAAM,OAAS,CAAC,EAE/DzB,EAAS3G,IAAU,OAEnBmH,EAAgB,IAAI,KAAKF,CAAS,EAAE,mBAAmB,CAAA,EAAI,CAC/D,KAAM,UACN,OAAQ,SAAA,CACT,EAEKK,EAAyBjI,GAA8B,CACvD,UAAWA,EACbgF,EAAYhF,CAAU,EAEtBwF,EAAaxF,CAAU,CAE3B,EAEMoJ,EAAsBnE,EAAAA,YAAY,IAAM,CAC5C,GAAIkC,EAAU,QAAS,CACrB,KAAM,CAAE,WAAAkC,EAAY,YAAAC,EAAa,YAAAC,CAAA,EAAgBpC,EAAU,QAC3D8B,EAAiBI,EAAa,CAAC,EAC/BF,EAAkBE,EAAaC,EAAcC,EAAc,EAAE,CAC/D,CACF,EAAG,CAAA,CAAE,EAECC,EAAUC,GAAgC,CAC1CtC,EAAU,SAEZA,EAAU,QAAQ,SAAS,CACzB,KAAMsC,IAAc,OAAS,KAAgB,IAC7C,SAAU,QAAA,CACX,CAEL,EAEA,OACEjC,EAAAA,KAAC,MAAA,CAAI,UAAU,eAEb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,WAEZ,SAAA,CAAAwB,GACCxH,EAAAA,IAAC,SAAA,CACC,QAAS,IAAMgI,EAAO,MAAM,EAC5B,UAAW;AAAA;AAAA;AAAA;AAAA,gBAIPlC,EAAS,yBAA2B,wBAAwB;AAAA,cAEhE,aAAW,cAEX,SAAA9F,EAAAA,IAAC,OAAI,UAAU,UAAU,KAAK,OAAO,QAAQ,YAAY,OAAO,eAC9D,eAAC,OAAA,CAAK,cAAc,QAAQ,eAAe,QAAQ,YAAa,EAAG,EAAE,kBAAkB,CAAA,CACzF,CAAA,CAAA,EAKJA,EAAAA,IAAC,MAAA,CACC,IAAK2F,EACL,SAAUiC,EACV,UAAU,+DACV,MAAO,CAAE,eAAgB,OAAQ,gBAAiB,MAAA,EAEjD,SAAAL,EAAM,IAAI,CAAChG,EAAMsB,IAChB7C,EAAAA,IAACkI,GAAA,CAEC,KAAA3G,EACA,OAAAuE,EACA,kBAAmBW,CAAA,EAHd5D,CAAA,CAKR,CAAA,CAAA,EAIF6E,GACC1H,EAAAA,IAAC,SAAA,CACC,QAAS,IAAMgI,EAAO,OAAO,EAC7B,UAAW;AAAA;AAAA;AAAA;AAAA,gBAIPlC,EAAS,yBAA2B,wBAAwB;AAAA,cAEhE,aAAW,eAEX,SAAA9F,EAAAA,IAAC,OAAI,UAAU,UAAU,KAAK,OAAO,QAAQ,YAAY,OAAO,eAC9D,eAAC,OAAA,CAAK,cAAc,QAAQ,eAAe,QAAQ,YAAa,EAAG,EAAE,eAAe,CAAA,CACtF,CAAA,CAAA,CACF,EAEJ,EAGAA,EAAAA,IAAC,OAAA,CAAK,UAAU,UAAW,SAAAsG,CAAA,CAAc,CAAA,EAC3C,CAEJ,CAAC,EAUK6B,EAAsB,wBAGtBC,GAAyB5J,GAA8B,CAC3D,GAAI,CAACC,EAAkBD,CAAU,EAC/B,OACEwB,MAAC,OAAI,UAAWmI,EAAqB,KAAK,OAAO,QAAQ,YAAY,OAAO,eAAe,YAAa,IACtG,SAAAnI,EAAAA,IAAC,QAAK,cAAc,QAAQ,eAAe,QAAQ,EAAE,gKAAgK,CAAA,CACvN,EAIJ,KAAM,CAAE,OAAA0C,GAAWlE,EAGnB,OAAIkE,EAAO,WAAaA,EAAO,cAE3B1C,MAAC,OAAI,UAAWmI,EAAqB,KAAK,OAAO,QAAQ,YAAY,OAAO,eAAe,YAAa,IACtG,SAAAnI,EAAAA,IAAC,QAAK,cAAc,QAAQ,eAAe,QAAQ,EAAE,wJAAwJ,CAAA,CAC/M,EAKA0C,EAAO,cAAgBA,EAAO,WAE9B1C,MAAC,OAAI,UAAWmI,EAAqB,KAAK,OAAO,QAAQ,YAAY,OAAO,eAAe,YAAa,IACtG,SAAAnI,EAAAA,IAAC,QAAK,cAAc,QAAQ,eAAe,QAAQ,EAAE,wNAAwN,CAAA,CAC/Q,EAKA0C,EAAO,WAAaA,EAAO,mBAE3BsD,EAAAA,KAAC,MAAA,CAAI,UAAWmC,EAAqB,KAAK,OAAO,QAAQ,YAAY,OAAO,eAAe,YAAa,IACtG,SAAA,CAAAnI,MAAC,QAAK,cAAc,QAAQ,eAAe,QAAQ,EAAE,qFAAqF,QACzI,OAAA,CAAK,cAAc,QAAQ,eAAe,QAAQ,EAAE,kCAAA,CAAmC,CAAA,EAC1F,EAKA0C,EAAO,gBAAkBA,EAAO,0BAEhC1C,MAAC,OAAI,UAAWmI,EAAqB,KAAK,OAAO,QAAQ,YAAY,OAAO,eAAe,YAAa,IACtG,SAAAnI,EAAAA,IAAC,QAAK,cAAc,QAAQ,eAAe,QAAQ,EAAE,yFAAyF,CAAA,CAChJ,EAKFA,MAAC,OAAI,UAAWmI,EAAqB,KAAK,OAAO,QAAQ,YAAY,OAAO,eAAe,YAAa,IACtG,SAAAnI,EAAAA,IAAC,QAAK,cAAc,QAAQ,eAAe,QAAQ,EAAE,gKAAgK,CAAA,CACvN,CAEJ,EAEMkI,GAAerC,EAAAA,KAAK,SAAsB,CAC9C,KAAAtE,EACA,OAAAuE,EACA,kBAAAuC,CACF,EAAsB,CACpB,MAAMC,EAAa/G,EAAK,OAAO,QAAU,QAAU,OAAS,OAE5D,OACEyE,EAAAA,KAAC,MAAA,CACC,UAAW;AAAA;AAAA,UAEPsC,CAAU;AAAA,UACVxC,EAAS,cAAgB,cAAc;AAAA,QAI1C,SAAA,CAAAvE,EAAK,OACJvB,MAAC,MAAA,CAAI,UAAU,0CACb,SAAAA,EAAAA,IAAC,MAAA,CACC,IAAKuB,EAAK,MAAM,IAChB,IAAKA,EAAK,OAAS,sBACnB,UAAU,6BACV,QAAQ,MAAA,CAAA,EAEZ,EAIFyE,EAAAA,KAAC,MAAA,CAAI,UAAU,MACZ,SAAA,CAAAzE,EAAK,OACJvB,EAAAA,IAAC,KAAA,CACC,UAAW;AAAA;AAAA,gBAEP8F,EAAS,aAAe,eAAe;AAAA,cAG1C,SAAAvE,EAAK,KAAA,CAAA,EAITA,EAAK,aACJvB,EAAAA,IAAC,IAAA,CACC,UAAW;AAAA;AAAA,gBAEP8F,EAAS,gBAAkB,eAAe;AAAA,cAG7C,SAAAvE,EAAK,WAAA,CAAA,EAKTA,EAAK,aAAeA,EAAK,YAAY,OAAS,GAC7CvB,EAAAA,IAAC,MAAA,CACC,UAAW;AAAA;AAAA,gBAEP8F,EAAS,8BAAgC,0BAA0B;AAAA,cAGtE,SAAAvE,EAAK,YAAY,IAAI,CAAC/C,EAAYqE,IAAQ,CAEzC,MAAMa,EADWjF,EAAkBD,CAAU,EAEzCA,EAAW,OAAO,YAClBA,EAAW,MAAM,YAErB,OACEwH,EAAAA,KAAC,SAAA,CAEC,QAAS,IAAMqC,EAAkB7J,CAAU,EAC3C,UAAW;AAAA;AAAA;AAAA,sBAGPsH,EAAS,+BAAiC,gCAAgC;AAAA,oBAG9E,SAAA,CAAA9F,MAAC,OAAA,CAAK,UAAU,gBAAiB,SAAAoI,GAAsB5J,CAAU,EAAE,EACnEwB,EAAAA,IAAC,OAAA,CAAK,UAAU,WAAY,SAAA0D,CAAA,CAAY,CAAA,CAAA,EATnCb,CAAA,CAYX,CAAC,CAAA,CAAA,CACH,CAAA,CAEJ,CAAA,CAAA,CAAA,CAGN,CAAC,ECpPK0F,GAGF,CACF,KAAM,CAAC,CAAE,QAAAtH,EAAS,OAAAkF,EAAQ,UAAAC,KACpBnF,EAAQ,OAAS,OAAe,WAC5BiF,GAAA,CAAY,KAAMjF,EAAQ,KAAM,OAAAkF,EAAgB,UAAAC,EAAsB,EAEhF,UAAW,CAAC,CAAE,QAAAnF,EAAS,UAAAmF,KACjBnF,EAAQ,OAAS,YAAoB,KAClCjB,EAAAA,IAACuG,GAAA,CAAU,KAAMtF,EAAQ,KAAM,UAAAmF,EAAsB,EAE9D,SAAU,CAAC,CAAE,QAAAnF,EAAS,UAAAmF,KAChBnF,EAAQ,OAAS,WAAmB,KAEjCjB,EAAAA,IAACwG,GAAA,CAAS,KAAMvF,EAAQ,KAAM,UAAAmF,EAAsB,EAE7D,SAAU,CAAC,CAAE,QAAAnF,EAAS,UAAAmF,KAChBnF,EAAQ,OAAS,WAAmB,KACjCjB,EAAAA,IAACsH,GAAA,CAAS,MAAOrG,EAAQ,MAAO,UAAAmF,EAAsB,CAEjE,EAEaoC,GAAkB3C,EAAAA,KAAK,SAAyB,CAC3D,QAAAlF,EACA,OAAA8H,CACF,EAAyB,CACvB,KAAM,CAAE,QAAAxH,EAAS,OAAAkF,EAAQ,UAAAC,CAAA,EAAczF,EAEjC+H,EAAWH,GAAUtH,EAAQ,IAAI,EAEvC,OAAKyH,EAWH1I,EAAAA,IAAC0I,EAAA,CACC,QAAAzH,EACA,OAAAkF,EACA,UAAAC,EACA,gBAAiBqC,GAAUtC,IAAW,UAAA,CAAA,GAbxC,QAAQ,KAAK,yBAAyBlF,EAAQ,IAAI,EAAE,EAElDjB,EAAAA,IAAC,MAAA,CAAI,UAAU,yCAAyC,SAAA,6BAExD,EAYN,CAAC,ECpEY2I,GAAkB9C,EAAAA,KAAK,UAA2B,CAC7D,KAAM,CAAE,MAAA1G,CAAA,EAAUc,EAAA,EAEZ6F,EAAS3G,IAAU,OAEzB,OACEa,EAAAA,IAAC,MAAA,CACC,UAAU,mCACV,KAAK,SACL,aAAW,qBAEX,SAAAgG,EAAAA,KAAC,MAAA,CACC,UAAW;AAAA;AAAA,YAEPF,EAAS,cAAgB,aAAa;AAAA,UAG1C,SAAA,CAAA9F,EAAAA,IAAC,OAAA,CACC,UAAW;AAAA;AAAA,cAEP8F,EAAS,cAAgB,aAAa;AAAA,WAAA,CAAA,EAG5C9F,EAAAA,IAAC,OAAA,CACC,UAAW;AAAA;AAAA,cAEP8F,EAAS,cAAgB,aAAa;AAAA,WAAA,CAAA,EAG5C9F,EAAAA,IAAC,OAAA,CACC,UAAW;AAAA;AAAA,cAEP8F,EAAS,cAAgB,aAAa;AAAA,WAAA,CAAA,CAE5C,CAAA,CAAA,CACF,CAAA,CAGN,CAAC,ECnCY8C,GAAc/C,EAAAA,KAAK,UAAuB,CACrD,KAAM,CAAE,MAAA1G,EAAO,MAAAG,CAAA,EAAUW,EAAA,EACnB,CAAE,YAAA4I,EAAa,SAAAC,CAAA,EAAaxJ,EAE5BwG,EAAS3G,IAAU,OAEzB,OACE6G,EAAAA,KAAC,MAAA,CACC,UAAU,sBACV,KAAK,MACL,aAAW,gBACX,YAAU,SAGT,SAAA,CAAA6C,EAAY,OAAS,GACpB7I,EAAAA,IAAC,MAAA,CAAI,UAAU,2BACb,SAAAA,EAAAA,IAAC,OAAA,CACC,UAAW;AAAA;AAAA,gBAEP8F,EAAS,gBAAkB,eAAe;AAAA,cAE/C,SAAA,OAAA,CAAA,EAGH,EAIFE,EAAAA,KAAC,MAAA,CACC,UAAW;AAAA;AAAA,YAEPF,EAAS,cAAgB,YAAY;AAAA,UAIxC,SAAA,CAAA+C,EAAY,SAAW,GAAK,CAACC,GAC5B9I,EAAAA,IAAC,OAAI,UAAU,yCACb,SAAAA,EAAAA,IAAC,IAAA,CAAE,UAAW,WAAW8F,EAAS,gBAAkB,eAAe,GAAI,2BAEvE,EACF,EAIFE,EAAAA,KAAC,MAAA,CAAI,UAAU,gBACZ,SAAA,CAAA6C,EAAY,IAAI,CAAClI,EAASkC,IACzB7C,EAAAA,IAAC,MAAA,CAEC,UAAW;AAAA,kBACPW,EAAQ,SAAW,OAAS,mBAAqB,oBAAoB;AAAA,gBAGzE,SAAAX,EAAAA,IAACwI,GAAA,CACC,QAAA7H,EACA,OAAQkC,IAAQgG,EAAY,OAAS,GAAK,CAACC,CAAA,CAAA,CAC7C,EARKnI,EAAQ,EAAA,CAUhB,EAGAmI,SAAaH,GAAA,CAAA,CAAgB,CAAA,CAAA,CAChC,CAAA,CAAA,CAAA,CACF,CAAA,CAAA,CAGN,CAAC,EC3DYI,GAAiBlD,EAAAA,KAAK,SAAwB,CACzD,WAAArH,EACA,QAAA2I,EACA,QAAA6B,EAAU,KACZ,EAAwB,CACtB,KAAM,CAAE,MAAA7J,EAAO,aAAAE,CAAA,EAAiBY,EAAA,EAE1B6F,EAAS3G,IAAU,OACnBiI,EAAW3I,EAAkBD,CAAU,EAEvCkF,EAAc0D,EAChB5I,EAAW,OAAO,YAClBA,EAAW,MAAM,YAGfyK,EAAa7B,EAAWC,GAAc7I,CAAU,EAAI,KACpDuH,EAAa1G,EAAa,YAAc,UAG9C,OAAI2J,IAAY,MAEZhD,EAAAA,KAAC,SAAA,CACC,KAAK,SACL,QAAAmB,EACA,UAAW;AAAA;AAAA;AAAA;AAAA,YAIPrB,EACE,2DACA,yDACJ;AAAA,UAEF,aAAYsB,EAAW,GAAG8B,GAAe1K,CAAU,CAAC,KAAKkF,CAAW,GAAKA,EAExE,SAAA,CAAAuF,GACCjJ,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,MAAO+F,CAAA,EACpB,SAAA/F,EAAAA,IAACiJ,EAAA,CAAW,UAAU,SAAA,CAAU,CAAA,CAClC,EAEFjJ,EAAAA,IAAC,QAAM,SAAA0D,CAAA,CAAY,CAAA,CAAA,CAAA,EAMrBsF,IAAY,OAEZhD,EAAAA,KAAC,SAAA,CACC,KAAK,SACL,QAAAmB,EACA,UAAW;AAAA;AAAA,YAEPrB,EAAS,oBAAsB,mBAAmB;AAAA,UAGrD,SAAA,CAAAmD,GACCjJ,EAAAA,IAAC,MAAA,CACC,UAAU,sEACV,MAAO,CAAE,gBAAiB,GAAG+F,CAAU,IAAA,EAEvC,SAAA/F,EAAAA,IAACiJ,GAAW,UAAU,UAAU,MAAO,CAAE,MAAOlD,EAAW,CAAG,CAAA,CAAA,EAGlE/F,EAAAA,IAAC,OAAA,CACC,UAAW,uBAAuB8F,EAAS,aAAe,eAAe,GAExE,SAAApC,CAAA,CAAA,CACH,CAAA,CAAA,EAOJ1D,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,QAAAmH,EACA,UAAW;AAAA;AAAA;AAAA,UAGPrB,EACE,+CACA,gDACJ;AAAA,QAGD,SAAApC,CAAA,CAAA,CAGP,CAAC,EAMD,SAAS2D,GAAc7I,EAAiD,CACtE,GAAI,CAACC,EAAkBD,CAAU,EAAG,OAAO,KAE3C,KAAM,CAAE,OAAAkE,GAAWlE,EAEnB,OAAIkE,EAAO,cACF,CAAC,CAAE,UAAAyG,EAAW,MAAAC,CAAA,UAClB,MAAA,CAAI,UAAAD,EAAsB,MAAAC,EAAc,KAAK,OAAO,QAAQ,YAAY,OAAO,eAAe,YAAa,EAC1G,SAAApJ,EAAAA,IAAC,OAAA,CAAK,cAAc,QAAQ,eAAe,QAAQ,EAAE,uJAAA,CAAwJ,CAAA,CAC/M,EAIA0C,EAAO,WACF,CAAC,CAAE,UAAAyG,EAAW,MAAAC,CAAA,UAClB,MAAA,CAAI,UAAAD,EAAsB,MAAAC,EAAc,KAAK,OAAO,QAAQ,YAAY,OAAO,eAAe,YAAa,EAC1G,SAAApJ,EAAAA,IAAC,OAAA,CAAK,cAAc,QAAQ,eAAe,QAAQ,EAAE,uNAAA,CAAwN,CAAA,CAC/Q,EAIA0C,EAAO,oBACF,CAAC,CAAE,UAAAyG,EAAW,MAAAC,CAAA,WAClB,MAAA,CAAI,UAAAD,EAAsB,MAAAC,EAAc,KAAK,OAAO,QAAQ,YAAY,OAAO,eAAe,YAAa,EAC1G,SAAA,CAAApJ,MAAC,QAAK,cAAc,QAAQ,eAAe,QAAQ,EAAE,qFAAqF,QACzI,OAAA,CAAK,cAAc,QAAQ,eAAe,QAAQ,EAAE,kCAAA,CAAmC,CAAA,EAC1F,EAIA0C,EAAO,mBACF,CAAC,CAAE,UAAAyG,EAAW,MAAAC,CAAA,WAClB,MAAA,CAAI,UAAAD,EAAsB,MAAAC,EAAc,KAAK,OAAO,QAAQ,YAAY,OAAO,eAAe,YAAa,EAC1G,SAAA,CAAApJ,MAAC,QAAK,cAAc,QAAQ,eAAe,QAAQ,EAAE,qFAAqF,QACzI,OAAA,CAAK,cAAc,QAAQ,eAAe,QAAQ,EAAE,kCAAA,CAAmC,CAAA,EAC1F,EAIA0C,EAAO,0BACF,CAAC,CAAE,UAAAyG,EAAW,MAAAC,CAAA,UAClB,MAAA,CAAI,UAAAD,EAAsB,MAAAC,EAAc,KAAK,OAAO,QAAQ,YAAY,OAAO,eAAe,YAAa,EAC1G,SAAApJ,EAAAA,IAAC,OAAA,CAAK,cAAc,QAAQ,eAAe,QAAQ,EAAE,wFAAA,CAAyF,CAAA,CAChJ,EAIG,IACT,CAGA,SAASkJ,GAAe1K,EAAmC,CACzD,GAAI,CAACC,EAAkBD,CAAU,EAAG,MAAO,QAE3C,KAAM,CAAE,OAAAkE,GAAWlE,EAEnB,OAAIkE,EAAO,cAAsB,YAC7BA,EAAO,WAAmB,OAC1BA,EAAO,oBAA4B,iBACnCA,EAAO,mBAA2B,gBAClCA,EAAO,0BAAkC,kBAEtC,QACT,CChKO,MAAM2G,GAAiBxD,EAAAA,KAAK,SAAwB,CACzD,YAAA1E,CACF,EAAwB,CACtB,KAAM,CAAE,MAAAhC,EAAO,YAAAqE,EAAa,aAAAQ,CAAA,EAAiB/D,EAAA,EAEvC6F,EAAS3G,IAAU,OAEzB,GAAI,CAACgC,GAAeA,EAAY,SAAW,EACzC,OAAO,KAGT,MAAMmI,EAAe9K,GAA8B,CAC7CD,EAAiBC,CAAU,EAC7BgF,EAAYhF,CAAU,EACbC,EAAkBD,CAAU,GACrCwF,EAAaxF,CAAU,CAE3B,EAEA,OACEwB,EAAAA,IAAC,MAAA,CACC,UAAW;AAAA;AAAA,UAEP8F,EAAS,cAAgB,UAAU;AAAA,QAEvC,KAAK,QACL,aAAW,gBAEX,SAAA9F,EAAAA,IAAC,MAAA,CACC,UAAU,6CACV,MAAO,CAAE,eAAgB,OAAQ,gBAAiB,MAAA,EAEjD,SAAAmB,EAAY,IAAI,CAAC3C,EAAYqE,IAC5B7C,EAAAA,IAAC+I,GAAA,CAEC,WAAAvK,EACA,QAAS,IAAM8K,EAAY9K,CAAU,EACrC,QAAQ,KAAA,EAHHqE,CAAA,CAKR,CAAA,CAAA,CACH,CAAA,CAGN,CAAC,EC7CY0G,GAAa1D,EAAAA,KAAK,UAAsB,CACnD,KAAM,CAAE,MAAA1G,EAAO,MAAAG,EAAO,gBAAAC,CAAA,EAAoBU,EAAA,EACpC,CAAE,YAAA4I,EAAa,SAAAC,EAAU,MAAA3D,CAAA,EAAU7F,EAGnCqG,EAAYF,GAA8B,CAC9CoD,EAAY,OACZC,CAAA,CACD,EAEKhD,EAAS3G,IAAU,OAGnBqK,EAAcX,EAAYA,EAAY,OAAS,CAAC,EAChD1H,EACJ5B,GAAmBiK,GAAa,SAAW,YAAc,CAACV,EACtDU,EAAY,YACZ,OAEN,OACExD,EAAAA,KAAC,MAAA,CACC,UAAW;AAAA;AAAA,UAEPF,EAAS,cAAgB,UAAU;AAAA,QAIvC,SAAA,CAAA9F,EAAAA,IAAC4F,GAAA,EAAe,EAGfT,GACCnF,EAAAA,IAAC,MAAA,CACC,UAAU,qDACV,KAAK,QAEL,SAAAA,EAAAA,IAAC,IAAA,CAAE,UAAU,uBAAwB,SAAAmF,CAAA,CAAM,CAAA,CAAA,EAK/Ca,EAAAA,KAAC,MAAA,CAAI,IAAKL,EAAW,UAAU,uCAE7B,SAAA,CAAA3F,EAAAA,IAACiG,GAAA,EAAY,QAGZ2C,GAAA,CAAA,CAAY,CAAA,EACf,EAGCzH,GAAeA,EAAY,OAAS,GACnCnB,EAAAA,IAACqJ,IAAe,YAAAlI,EAA0B,EAI5C6E,EAAAA,KAAC,MAAA,CACC,UAAW;AAAA;AAAA,YAEPF,EAAS,cAAgB,UAAU;AAAA,UAIvC,SAAA,CAAA9F,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,UAAW;AAAA;AAAA;AAAA,cAIP8F,EACI,kDACA,iDACN;AAAA,YAEF,aAAW,iBAEX,SAAA9F,EAAAA,IAAC,MAAA,CACC,UAAU,UACV,KAAK,OACL,QAAQ,YACR,OAAO,eAEP,SAAAA,EAAAA,IAAC,OAAA,CACC,cAAc,QACd,eAAe,QACf,YAAa,EACb,EAAE,gBAAA,CAAA,CACJ,CAAA,CACF,CAAA,EAIFgG,EAAAA,KAAC,MAAA,CACC,UAAW;AAAA;AAAA,cAEPF,EAAS,cAAgB,aAAa;AAAA,YAG1C,SAAA,CAAA9F,EAAAA,IAAC,OAAA,CACC,UAAW,kBACT8F,EAAS,gBAAkB,eAC7B,GACD,SAAA,aAAA,CAAA,EAKD9F,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,UAAW,OAAO8F,EAAS,gBAAkB,eAAe,GAC5D,aAAW,QAEX,SAAA9F,EAAAA,IAAC,MAAA,CACC,UAAU,UACV,KAAK,OACL,QAAQ,YACR,OAAO,eAEP,SAAAA,EAAAA,IAAC,OAAA,CACC,cAAc,QACd,eAAe,QACf,YAAa,EACb,EAAE,sFAAA,CAAA,CACJ,CAAA,CACF,CAAA,EAIFA,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,UAAW,OAAO8F,EAAS,gBAAkB,eAAe,GAC5D,aAAW,eAEX,SAAA9F,EAAAA,IAAC,MAAA,CACC,UAAU,UACV,KAAK,OACL,QAAQ,YACR,OAAO,eAEP,SAAAA,EAAAA,IAAC,OAAA,CACC,cAAc,QACd,eAAe,QACf,YAAa,EACb,EAAE,2JAAA,CAAA,CACJ,CAAA,CACF,CAAA,CACF,CAAA,CAAA,EAIFA,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,UAAU,oGACV,aAAW,gBAEX,SAAAA,EAAAA,IAAC,MAAA,CAAI,UAAU,UAAU,KAAK,eAAe,QAAQ,YACnD,SAAAA,MAAC,OAAA,CAAK,EAAE,4LAAA,CAA6L,CAAA,CACvM,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CAGN,CAAC,ECnKYyJ,GAAkB5D,EAAAA,KAAK,UAA2B,CAC7D,KAAM,CAAE,MAAA1G,EAAO,aAAAE,EAAc,cAAAI,CAAA,EAAkBQ,EAAA,EACzC,CAACyJ,EAAWC,CAAY,EAAI3E,EAAAA,SAAkB,MAAM,EAEpDc,EAAS3G,IAAU,OAGnByK,EACJvK,EAAa,aACb,0EAEI0G,EAAa1G,EAAa,YAAc,UAE9C,OACE2G,EAAAA,KAAC,MAAA,CACC,UAAW;AAAA;AAAA,UAEPF,EAAS,cAAgB,UAAU;AAAA,QAIvC,SAAA,CAAAE,EAAAA,KAAC,SAAA,CACC,UAAW;AAAA;AAAA,YAEPF,EAAS,8BAAgC,0BAA0B;AAAA,UAGvE,SAAA,CAAA9F,EAAAA,IAAC,SAAA,CACC,QAASP,EACT,UAAW;AAAA;AAAA,cAEPqG,EAAS,+BAAiC,iCAAiC;AAAA,YAE/E,aAAW,UAEX,SAAA9F,EAAAA,IAAC,MAAA,CACC,UAAU,UACV,KAAK,OACL,QAAQ,YACR,OAAO,eAEP,SAAAA,EAAAA,IAAC,OAAA,CACC,cAAc,QACd,eAAe,QACf,YAAa,EACb,EAAE,iBAAA,CAAA,CACJ,CAAA,CACF,CAAA,EAEFA,EAAAA,IAAC,OAAA,CACC,UAAW,yBAAyB8F,EAAS,aAAe,eAAe,GAC5E,SAAA,gBAAA,CAAA,CAED,CAAA,CAAA,EAIFE,EAAAA,KAAC,MAAA,CAAI,UAAU,yBAEb,SAAA,CAAAhG,EAAAA,IAAC,MAAA,CAAI,UAAU,4BACb,SAAAA,EAAAA,IAAC,MAAA,CACC,IAAK4J,EACL,IAAI,kBACJ,UAAU,4BAAA,CAAA,EAEd,EAGA5J,EAAAA,IAAC,MAAA,CAAI,UAAU,gBACb,SAAAA,EAAAA,IAAC,MAAA,CACC,UAAW;AAAA;AAAA;AAAA,gBAGP8F,EAAS,8BAAgC,0BAA0B;AAAA;AAAA,cAItE,WAAa,KACZ9F,EAAAA,IAAC,MAAA,CACC,IAAKX,EAAa,KAClB,IAAK,GAAGA,EAAa,IAAI,QACzB,UAAU,4BAAA,CAAA,EAGZW,EAAAA,IAAC,MAAA,CACC,UAAU,+EACV,MAAO,CAAE,gBAAiB+F,CAAA,EAEzB,SAAA1G,EAAa,KAAK,OAAO,CAAC,EAAE,YAAA,CAAY,CAAA,CAC3C,CAAA,EAGN,EAGA2G,EAAAA,KAAC,MAAA,CAAI,UAAU,8BACb,SAAA,CAAAhG,EAAAA,IAAC,KAAA,CACC,UAAW,yBAAyB8F,EAAS,aAAe,eAAe,GAE1E,SAAAzG,EAAa,IAAA,CAAA,EAEfA,EAAa,aACZW,EAAAA,IAAC,IAAA,CAAE,UAAW,gBAAgB8F,EAAS,gBAAkB,eAAe,GACrE,SAAAzG,EAAa,WAAA,CAChB,CAAA,EAEJ,EAGA2G,EAAAA,KAAC,MAAA,CAAI,UAAU,sCACZ,SAAA,CAAA3G,EAAa,cAAgBA,EAAa,aAAa,OAAS,GAC/DW,EAAAA,IAAC6J,EAAA,CACC,KAAK,QACL,MAAM,OACN,OAAA/D,EACA,WAAAC,EACA,QAAS,IAAM,CACb,MAAM+D,EAAQzK,EAAa,eAAe,CAAC,GAAG,OAC1CyK,IAAO,OAAO,SAAS,KAAO,OAAOA,CAAK,GAChD,CAAA,CAAA,EAGHzK,EAAa,UAAYA,EAAa,SAAS,OAAS,GACvDW,EAAAA,IAAC6J,EAAA,CACC,KAAK,QACL,MAAM,UACN,OAAA/D,EACA,WAAAC,EACA,QAAS,IAAM,CACb,MAAMlB,EAAMxF,EAAa,WAAW,CAAC,GAAG,IACpCwF,GAAK,OAAO,KAAKA,EAAK,SAAU,qBAAqB,CAC3D,CAAA,CAAA,EAGHxF,EAAa,QAAUA,EAAa,OAAO,OAAS,GACnDW,EAAAA,IAAC6J,EAAA,CACC,KAAK,OACL,MAAM,UACN,OAAA/D,EACA,WAAAC,EACA,QAAS,IAAM,CACb,MAAMgE,EAAQ1K,EAAa,SAAS,CAAC,GAAG,MACpC0K,IAAO,OAAO,SAAS,KAAO,UAAUA,CAAK,GACnD,CAAA,CAAA,CACF,EAEJ,EAGA/D,EAAAA,KAAC,MAAA,CACC,UAAW;AAAA;AAAA,cAEPF,EAAS,8BAAgC,6BAA6B;AAAA,YAG1E,SAAA,CAAA9F,EAAAA,IAACgK,EAAA,CACC,OAAQN,IAAc,OACtB,QAAS,IAAMC,EAAa,MAAM,EAClC,OAAA7D,EACA,WAAAC,EACD,SAAA,MAAA,CAAA,EAGD/F,EAAAA,IAACgK,EAAA,CACC,OAAQN,IAAc,UACtB,QAAS,IAAMC,EAAa,SAAS,EACrC,OAAA7D,EACA,WAAAC,EACD,SAAA,SAAA,CAAA,CAED,CAAA,CAAA,EAIF/F,EAAAA,IAAC,MAAA,CAAI,UAAU,MACZ,aAAc,OACbA,EAAAA,IAACiK,GAAA,CAAQ,OAAAnE,EAAgB,WAAAC,EAAwB,EAEjD/F,EAAAA,IAACkK,GAAA,CAAW,OAAApE,EAAgB,CAAA,CAEhC,CAAA,CAAA,CACF,CAAA,CAAA,CAAA,CAGN,CAAC,EAWK+D,EAAoBhE,EAAAA,KAAK,SAA2B,CACxD,KAAAsE,EACA,MAAA1F,EACA,OAAAqB,EACA,WAAAC,EACA,QAAAoB,CACF,EAA2B,CACzB,MAAMiD,EAAQ,CACZ,MACEpK,EAAAA,IAAC,OAAA,CACC,cAAc,QACd,eAAe,QACf,YAAa,EACb,EAAE,uNAAA,CAAA,EAGN,MACEA,EAAAA,IAAC,OAAA,CACC,cAAc,QACd,eAAe,QACf,YAAa,EACb,EAAE,uJAAA,CAAA,EAGN,KACEA,EAAAA,IAAC,OAAA,CACC,cAAc,QACd,eAAe,QACf,YAAa,EACb,EAAE,sGAAA,CAAA,CACJ,EAIJ,OACEgG,EAAAA,KAAC,SAAA,CACC,QAAAmB,EACA,UAAW;AAAA;AAAA,UAEPrB,EACE,gDACA,2CACJ;AAAA,QAGF,SAAA,CAAA9F,EAAAA,IAAC,MAAA,CACC,UAAU,UACV,KAAK,OACL,QAAQ,YACR,OAAQ+F,EAEP,WAAMoE,CAAI,CAAA,CAAA,EAEbnK,EAAAA,IAAC,OAAA,CACC,UAAW,uBAAuB8F,EAAS,gBAAkB,eAAe,GAE3E,SAAArB,CAAA,CAAA,CACH,CAAA,CAAA,CAGN,CAAC,EAWKuF,EAAYnE,EAAAA,KAAK,SAAmB,CACxC,OAAAwE,EACA,QAAAlD,EACA,OAAArB,EACA,WAAAC,EACA,SAAA7G,CACF,EAAmB,CACjB,OACEc,EAAAA,IAAC,SAAA,CACC,QAAAmH,EACA,UAAW;AAAA;AAAA,UAEPkD,EACE,aACAvE,EACE,oCACA,mCACN;AAAA,QAEF,MAAOuE,EAAS,CAAE,gBAAiBtE,GAAe,OAEjD,SAAA7G,CAAA,CAAA,CAGP,CAAC,EAQK+K,GAAUpE,EAAAA,KAAK,SAAiB,CAAE,OAAAC,EAAQ,WAAAC,GAA4B,CAC1E,KAAM,CAAE,aAAA1G,CAAA,EAAiBY,EAAA,EAOzB,OAJGZ,EAAa,cAAgBA,EAAa,aAAa,OAAS,GAChEA,EAAa,UAAYA,EAAa,SAAS,OAAS,GACxDA,EAAa,QAAUA,EAAa,OAAO,OAAS,EAarD2G,EAAAA,KAAC,MAAA,CACC,UAAW;AAAA;AAAA,UAEPF,EACE,8CACA,4CACJ;AAAA,QAID,SAAA,CAAAzG,EAAa,cAAc,IAAI,CAACyK,EAAOjH,IACtC7C,EAAAA,IAACsK,EAAA,CAEC,KAAK,QACL,QAASR,EAAM,OACf,UAAWA,EAAM,MACjB,OAAAhE,EACA,WAAAC,EACA,QAAS,IAAO,OAAO,SAAS,KAAO,OAAO+D,EAAM,MAAM,EAAA,EANrD,SAASjH,CAAG,EAAA,CAQpB,EAGAxD,EAAa,UAAU,IAAI,CAACkL,EAAS1H,IACpC7C,EAAAA,IAACsK,EAAA,CAEC,KAAK,QACL,QAASC,EAAQ,IAAI,QAAQ,eAAgB,EAAE,EAC/C,UAAWA,EAAQ,OAAS,UAC5B,OAAAzE,EACA,WAAAC,EACA,QAAS,IAAM,OAAO,KAAKwE,EAAQ,IAAK,SAAU,qBAAqB,CAAA,EANlE,OAAO1H,CAAG,EAAA,CAQlB,EAGAxD,EAAa,QAAQ,IAAI,CAAC0K,EAAOlH,IAChC7C,EAAAA,IAACsK,EAAA,CAEC,KAAK,OACL,QAASP,EAAM,MACf,UAAWA,EAAM,OAAS,QAC1B,OAAAjE,EACA,WAAAC,EACA,QAAS,IAAO,OAAO,SAAS,KAAO,UAAUgE,EAAM,KAAK,EAAA,EANvD,SAASlH,CAAG,EAAA,CAQpB,CAAA,CAAA,CAAA,EAvDD7C,EAAAA,IAAC,MAAA,CACC,UAAW,oBAAoB8F,EAAS,gBAAkB,eAAe,GAC1E,SAAA,kCAAA,CAAA,CAwDP,CAAC,EAYKwE,EAAczE,EAAAA,KAAK,SAAqB,CAC5C,KAAAsE,EACA,QAAAK,EACA,UAAAC,EACA,OAAA3E,EACA,QAAAqB,CACF,EAAqB,CACnB,MAAMuD,EAAY,CAChB,MAAO,wNACP,MAAO,wJACP,KAAM,sGAAA,EAGR,OACE1E,EAAAA,KAAC,SAAA,CACC,QAAAmB,EACA,UAAW;AAAA;AAAA,UAEPrB,EAAS,oBAAsB,mBAAmB;AAAA,QAGtD,SAAA,CAAA9F,EAAAA,IAAC,MAAA,CACC,UAAW,yBAAyB8F,EAAS,gBAAkB,eAAe,GAC9E,KAAK,OACL,QAAQ,YACR,OAAO,eAEP,SAAA9F,EAAAA,IAAC,OAAA,CACC,cAAc,QACd,eAAe,QACf,YAAa,EACb,EAAG0K,EAAUP,CAAI,CAAA,CAAA,CACnB,CAAA,EAEFnE,EAAAA,KAAC,MAAA,CAAI,UAAU,iBACb,SAAA,CAAAhG,EAAAA,IAAC,IAAA,CACC,UAAW,gCAAgC8F,EAAS,aAAe,eAAe,GAEjF,SAAA0E,CAAA,CAAA,EAEFC,GACCzK,EAAAA,IAAC,IAAA,CACC,UAAW,oBAAoB8F,EAAS,gBAAkB,eAAe,GAExE,SAAA2E,CAAA,CAAA,CACH,CAAA,CAEJ,CAAA,CAAA,CAAA,CAGN,CAAC,EAOKP,GAAarE,EAAAA,KAAK,SAAoB,CAAE,OAAAC,GAA2B,CACvE,OACEE,EAAAA,KAAC,MAAA,CACC,UAAW;AAAA;AAAA,UAEPF,EACE,8CACA,4CACJ;AAAA,QAGF,SAAA,CAAA9F,EAAAA,IAAC2K,EAAA,CACC,KAAK,OACL,MAAM,gBACN,OAAA7E,CAAA,CAAA,EAEF9F,EAAAA,IAAC2K,EAAA,CACC,KAAK,QACL,MAAM,sBACN,OAAA7E,CAAA,CAAA,EAEF9F,EAAAA,IAAC2K,EAAA,CACC,KAAK,OACL,MAAM,YACN,OAAA7E,CAAA,CAAA,CACF,CAAA,CAAA,CAGN,CAAC,EASK6E,EAAa9E,EAAAA,KAAK,SAAoB,CAC1C,KAAAsE,EACA,MAAA1F,EACA,OAAAqB,CACF,EAAoB,CAClB,MAAM4E,EAAY,CAChB,KAAM,gMACN,MAAO,iGACP,KAAM,2DAAA,EAGR,OACE1E,EAAAA,KAAC,SAAA,CACC,UAAW;AAAA;AAAA,UAEPF,EAAS,oBAAsB,mBAAmB;AAAA,QAGtD,SAAA,CAAA9F,EAAAA,IAAC,MAAA,CACC,UAAW,yBAAyB8F,EAAS,gBAAkB,eAAe,GAC9E,KAAK,OACL,QAAQ,YACR,OAAO,eAEP,SAAA9F,EAAAA,IAAC,OAAA,CACC,cAAc,QACd,eAAe,QACf,YAAa,EACb,EAAG0K,EAAUP,CAAI,CAAA,CAAA,CACnB,CAAA,EAEFnK,EAAAA,IAAC,OAAA,CACC,UAAW,uBAAuB8F,EAAS,aAAe,eAAe,GAExE,SAAArB,CAAA,CAAA,CACH,CAAA,CAAA,CAGN,CAAC,EC3fKmG,EAAoD,CACxD,KAAM,SACN,KAAM,UACN,KAAM,SACR,EAEaC,EAAkBhF,EAAAA,KAAK,UAA2B,CAC7D,KAAM,CAAE,MAAA1G,EAAO,aAAAE,EAAc,QAAAO,EAAS,aAAAE,CAAA,EAAiBG,EAAA,EACjD,CAACgF,EAAWC,CAAY,EAAIF,EAAAA,SAAS,EAAI,EACzC,CAAC8F,EAAWC,CAAY,EAAI/F,EAAAA,SAAS,EAAK,EAE1Cc,EAAS3G,IAAU,OACnB4G,EAAa1G,EAAa,YAAc,UAG9CiE,EAAAA,UAAU,IAAM,CACV1D,GAAS,MACXsF,EAAa,EAAI,EACjB6F,EAAa,EAAK,EAEtB,EAAG,CAACnL,GAAS,GAAG,CAAC,EAEjB,MAAMoL,EAAmBvH,EAAAA,YAAY,IAAM,CACzCyB,EAAa,EAAK,CACpB,EAAG,CAAA,CAAE,EAEC+F,EAAoBxH,EAAAA,YAAY,IAAM,CAC1CyB,EAAa,EAAK,EAClB6F,EAAa,EAAI,CACnB,EAAG,CAAA,CAAE,EAGCG,EAAoBrG,GAAwB,CAChD,GAAI,CAEF,OADe,IAAI,IAAIA,CAAG,EACZ,QAChB,MAAQ,CACN,MAAO,UACT,CACF,EAEA,GAAI,CAACjF,GAAW,CAACA,EAAQ,OAAQ,OAAO,KAExC,KAAM,CAAE,IAAAiF,EAAK,SAAAsG,EAAU,MAAAC,EAAO,aAAAxK,GAAiBhB,EACzCyL,EAAeD,GAASF,EAAiBrG,CAAG,EAC5CyG,EAASH,IAAa,OACtBI,EAAgBJ,IAAa,QAAUA,IAAa,OACpDK,EAAcZ,EAAkBO,CAAQ,GAAKP,EAAkB,KAErE,OACE5E,EAAAA,KAAC,MAAA,CACC,UAAW;AAAA;AAAA,UAEPsF,EAAS,GAAK,aAAa;AAAA,UAC3BxF,EAAS,cAAgB,aAAa;AAAA,QAE1C,KAAK,SACL,aAAW,OACX,aAAY,YAAYuF,CAAY,GACpC,gBAAezK,EACf,iBAAgBuK,EAGf,SAAA,CAAAI,GACCvL,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,UAAU,gDACV,QAASF,EACT,aAAW,eAAA,CAAA,EAKfkG,EAAAA,KAAC,MAAA,CACC,UAAW;AAAA;AAAA,YAEPF,EAAS,cAAgB,UAAU;AAAA,YACnC0F,CAAW;AAAA,YACXD,EAAgB,2BAA6B,EAAE;AAAA,UAEnD,MAAO,CAEL,SAAU,WACV,OAAQ,CAAA,EAIV,SAAA,CAAAvF,EAAAA,KAAC,SAAA,CACC,UAAW;AAAA;AAAA;AAAA,cAGPF,EAAS,8BAAgC,0BAA0B;AAAA,YAIvE,SAAA,CAAA9F,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,QAASF,EACT,UAAW;AAAA;AAAA;AAAA,gBAGPgG,EACE,+BACA,iCACJ;AAAA,cAEF,aAAW,gBAEX,SAAA9F,EAAAA,IAAC,MAAA,CACC,UAAU,UACV,KAAK,OACL,QAAQ,YACR,OAAO,eACP,YAAa,EAEb,SAAAA,EAAAA,IAAC,OAAA,CACC,cAAc,QACd,eAAe,QACf,EAAE,iBAAA,CAAA,CACJ,CAAA,CACF,CAAA,EAIFgG,EAAAA,KAAC,MAAA,CAAI,UAAU,iBACb,SAAA,CAAAhG,EAAAA,IAAC,KAAA,CACC,UAAW;AAAA;AAAA,kBAEP8F,EAAS,aAAe,eAAe;AAAA,gBAG1C,SAAAuF,CAAA,CAAA,EAEHrL,EAAAA,IAAC,IAAA,CACC,UAAW;AAAA;AAAA,kBAEP8F,EAAS,gBAAkB,eAAe;AAAA,gBAG7C,WAAiBjB,CAAG,CAAA,CAAA,CACvB,EACF,EAGA7E,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,UAAW;AAAA;AAAA,gBAEP8F,EACE,kCACA,iCACJ;AAAA,cAEF,aAAW,eAEX,SAAAE,EAAAA,KAAC,MAAA,CACC,UAAU,UACV,KAAK,eACL,QAAQ,YAER,SAAA,CAAAhG,MAAC,UAAO,GAAG,KAAK,GAAG,IAAI,EAAE,IAAI,QAC5B,SAAA,CAAO,GAAG,KAAK,GAAG,KAAK,EAAE,IAAI,QAC7B,SAAA,CAAO,GAAG,KAAK,GAAG,KAAK,EAAE,GAAA,CAAI,CAAA,CAAA,CAAA,CAChC,CAAA,CACF,CAAA,CAAA,EAIDiF,GACCjF,EAAAA,IAAC,MAAA,CACC,UAAU,yEACV,MAAO,CAAE,gBAAiB,GAAG+F,CAAU,IAAA,EAEvC,SAAA/F,EAAAA,IAAC,MAAA,CACC,UAAU,uBACV,MAAO,CACL,gBAAiB+F,EACjB,UAAW,4CACX,MAAO,KAAA,CACT,CAAA,CACF,CAAA,EAKH+E,GACC9E,EAAAA,KAAC,MAAA,CACC,UAAW;AAAA;AAAA,gBAEPF,EAAS,gBAAkB,eAAe;AAAA,cAG9C,SAAA,CAAA9F,EAAAA,IAAC,MAAA,CACC,UAAU,4BACV,KAAK,OACL,QAAQ,YACR,OAAO,eAEP,SAAAA,EAAAA,IAAC,OAAA,CACC,cAAc,QACd,eAAe,QACf,YAAa,IACb,EAAE,sIAAA,CAAA,CACJ,CAAA,EAEFA,EAAAA,IAAC,IAAA,CAAE,UAAU,2BAA2B,SAAA,sBAAmB,EAC3DA,EAAAA,IAAC,IAAA,CAAE,UAAU,0BAA0B,SAAA,mDAEvC,EACAA,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,QAASF,EACT,UAAW;AAAA;AAAA,kBAEPgG,EACE,2CACA,6CACJ;AAAA,gBAEH,SAAA,SAAA,CAAA,CAED,CAAA,CAAA,EAKH,CAACgF,GACA9K,EAAAA,IAAC,MAAA,CAAI,UAAU,sDACb,SAAAA,EAAAA,IAAC,SAAA,CACC,IAAK6E,EACL,MAAOwG,EACP,UAAU,yBACV,OAAQL,EACR,QAASC,EACT,QAAQ,2DACR,eAAe,6BACf,QAAQ,MAAA,CAAA,EAEZ,EAIDM,GACCvL,EAAAA,IAAC,MAAA,CACC,UAAW;AAAA;AAAA,gBAEP8F,EAAS,cAAgB,UAAU;AAAA,aAAA,CAAA,CAEzC,CAAA,CAAA,QAKH,QAAA,CAAO,SAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAAA,CAMN,CAAA,CAAA,CAAA,CAGR,CAAC,ECtQY2F,GAAa5F,EAAAA,KAAK,SAAoB,CACjD,SAAA6F,EACA,eAAAC,EAAiB,aACnB,EAAoB,CAClB,KAAM,CAAE,MAAAxM,EAAO,aAAAE,CAAA,EAAiBY,EAAA,EAC1B,CAAC2L,EAAaC,CAAc,EAAI7G,EAAAA,SAAS,IAAI,IAAM,EAEnDc,EAAS3G,IAAU,OAGzBmE,EAAAA,UAAU,IAAM,CACd,MAAMwI,EAAQ,YAAY,IAAM,CAC9BD,EAAe,IAAI,IAAM,CAC3B,EAAG,GAAI,EAEP,MAAO,IAAM,cAAcC,CAAK,CAClC,EAAG,CAAA,CAAE,EAGL,MAAMxF,EAAgBsF,EAAY,mBAAmB,GAAI,CACvD,KAAM,UACN,OAAQ,UACR,OAAQ,EAAA,CACT,EAGKG,EAAgBH,EAAY,mBAAmB,GAAI,CACvD,QAAS,QACT,MAAO,OACP,IAAK,SAAA,CACN,EAKD,OACE5F,EAAAA,KAAC,MAAA,CACC,UAAW;AAAA;AAAA,UAEPF,EAAS,cAAgB,aAAa;AAAA,QAI1C,SAAA,CAAA9F,EAAAA,IAAC,MAAA,CAAI,UAAU,KAAA,CAAM,QAGpB,MAAA,CAAI,UAAU,2BACb,SAAAA,MAAC,MAAA,CAAI,UAAU,oEACb,SAAAA,EAAAA,IAAC,MAAA,CACC,UAAU,wBACV,KAAK,eACL,QAAQ,YAER,SAAAA,EAAAA,IAAC,OAAA,CACC,SAAS,UACT,EAAE,yGACF,SAAS,SAAA,CAAA,CACX,CAAA,EAEJ,CAAA,CACF,EAGAA,EAAAA,IAAC,OAAI,UAAU,mBACb,eAAC,KAAA,CAAG,UAAU,gDACX,SAAAsG,CAAA,CACH,CAAA,CACF,EAGAN,EAAAA,KAAC,MAAA,CAAI,UAAU,mBACb,SAAA,CAAAhG,EAAAA,IAAC,IAAA,CAAE,UAAU,wBAAyB,SAAA+L,EAAc,EACpD/F,EAAAA,KAAC,MAAA,CAAI,UAAU,oEACb,SAAA,CAAAhG,EAAAA,IAAC,MAAA,CAAI,UAAU,cAAc,KAAK,eAAe,QAAQ,YACvD,SAAAA,EAAAA,IAAC,OAAA,CAAK,EAAE,4EAAA,CAA6E,EACvF,EACAA,EAAAA,IAAC,QAAM,SA3CK,MA2CL,CAAY,CAAA,CAAA,CACrB,CAAA,EACF,EAGAA,EAAAA,IAAC,MAAA,CAAI,UAAU,MAAA,CAAO,EAGtBA,EAAAA,IAAC,MAAA,CAAI,UAAU,YACb,SAAAgG,EAAAA,KAAC,SAAA,CACC,QAAS0F,EACT,UAAU;AAAA,+EAIV,SAAA,CAAA1L,EAAAA,IAAC,MAAA,CAAI,UAAU,kGACZ,SAAAX,EAAa,KACZW,EAAAA,IAAC,MAAA,CACC,IAAKX,EAAa,KAClB,IAAKA,EAAa,KAClB,UAAU,4BAAA,CAAA,EAGZW,EAAAA,IAAC,MAAA,CAAI,UAAU,aAEb,SAAAgG,EAAAA,KAAC,MAAA,CACC,UAAU,UACV,QAAQ,YACR,KAAK,eAEL,SAAA,CAAAhG,MAAC,UAAO,GAAG,KAAK,GAAG,KAAK,EAAE,MAAM,QAC/B,SAAA,CAAO,GAAG,KAAK,GAAG,IAAI,EAAE,IAAI,QAC5B,SAAA,CAAO,GAAG,KAAK,GAAG,KAAK,EAAE,IAAI,QAC7B,SAAA,CAAO,GAAG,IAAI,GAAG,KAAK,EAAE,IAAI,QAC5B,SAAA,CAAO,GAAG,KAAK,GAAG,KAAK,EAAE,IAAI,QAC7B,SAAA,CAAO,GAAG,IAAI,GAAG,IAAI,EAAE,MAAM,QAC7B,SAAA,CAAO,GAAG,KAAK,GAAG,IAAI,EAAE,MAAM,QAC9B,SAAA,CAAO,GAAG,IAAI,GAAG,KAAK,EAAE,MAAM,QAC9B,SAAA,CAAO,GAAG,KAAK,GAAG,KAAK,EAAE,MAAM,QAC/B,SAAA,CAAO,GAAG,IAAI,GAAG,IAAI,EAAE,MAAM,QAC7B,SAAA,CAAO,GAAG,KAAK,GAAG,IAAI,EAAE,MAAM,QAC9B,SAAA,CAAO,GAAG,IAAI,GAAG,KAAK,EAAE,MAAM,QAC9B,SAAA,CAAO,GAAG,KAAK,GAAG,KAAK,EAAE,KAAA,CAAM,CAAA,CAAA,CAAA,EAEpC,CAAA,CAEJ,EAGAgG,EAAAA,KAAC,MAAA,CAAI,UAAU,2BACb,SAAA,CAAAhG,EAAAA,IAAC,IAAA,CAAE,UAAU,+CACV,SAAAX,EAAa,KAChB,EACAW,EAAAA,IAAC,IAAA,CAAE,UAAU,iCAAkC,SAAA2L,CAAA,CAAe,CAAA,EAChE,EAGA3L,EAAAA,IAAC,OAAA,CAAK,UAAU,sCAAsC,SAAA,KAAA,CAAG,CAAA,CAAA,CAAA,EAE7D,EAEAA,EAAAA,IAAC,MAAA,CAAI,UAAU,QAAA,CAAS,EAExBA,EAAAA,IAAC,OAAI,UAAU,2BACb,eAAC,MAAA,CAAI,UAAU,oCAAoC,CAAA,CACrD,CAAA,CAAA,CAAA,CAGN,CAAC,EChIKnB,EAAoC,CACxC,KAAM,WACN,SAAU,EACZ,EAKMmN,GAAmBnG,EAAAA,KAAK,SAA0B,CACtD,KAAAxF,EACA,YAAA0C,EACA,MAAA5D,EACA,OAAAC,EACA,aAAAC,EACA,gBAAAE,CACF,EAOG,CAED,KAAM,CACJ,MAAAD,EACA,YAAAkE,EACA,aAAcyI,CAAA,EACZnJ,GAAgB,CAClB,KAAAzC,EACA,YAAA0C,EACA,YAAa,GAAA,CACd,EAGK,CAACvD,EAAe0M,CAAgB,EAAIlH,EAAAA,SAAS,EAAK,EAClDvF,EAAgBgE,EAAAA,YAAY,IAAM,CACtCyI,EAAkBC,GAAS,CAACA,CAAI,CAClC,EAAG,CAAA,CAAE,EAGC,CAACvM,EAASwM,CAAU,EAAIpH,EAAAA,SAA8B,IAAI,EAE1DnF,EAAc4D,cAAa4I,GAAyC,CACxED,EAAW,CACT,GAAGC,EACH,OAAQ,EAAA,CACT,CACH,EAAG,CAAA,CAAE,EAECvM,EAAe2D,EAAAA,YAAY,IAAM,CACrC2I,EAAW,IAAI,CACjB,EAAG,CAAA,CAAE,EAGCpI,EAAeP,EAAAA,YAClBjF,GAA8B,CAC7B,GAAI,CAACC,EAAkBD,CAAU,EAAG,OAGpC,MAAM8N,EAAgB1N,EAAiBJ,CAAU,EACjD,GAAI8N,EAAe,CAEjBzM,EAAY,CACV,IAAKyM,EAAc,IACnB,SAAUA,EAAc,iBAAmB,OAC3C,MAAOA,EAAc,aAAe,GACpC,aAAc9N,EAAW,OAAO,SAAS,IAAA,CAC1C,EAGDuE,EAAY,CACV,KAAM,SACN,aAAcvE,EAAW,OAAO,SAAS,KACzC,YAAaA,EAAW,OAAO,YAC/B,UAAW,KAAK,IAAA,EAChB,WAAY,CACV,KAAM,UACN,IAAK8N,EAAc,IACnB,SAAUA,EAAc,iBAAmB,OAC3C,YAAaA,EAAc,WAAA,CAC7B,CACD,EAED,MACF,CAGAL,EAAiBzN,CAAU,CAC7B,EACA,CAACyN,EAAkBpM,EAAakD,CAAW,CAAA,EAG7C,OACEiD,EAAAA,KAAC/G,EAAA,CACC,MAAAE,EACA,OAAAC,EACA,aAAAC,EACA,MAAAC,EACA,gBAAAC,EACA,cAAAC,EACA,cAAAC,EACA,QAAS+D,EACT,SAAUQ,EACV,QAAApE,EACA,YAAAC,EACA,aAAAC,EAEA,SAAA,CAAAE,EAAAA,IAACuJ,GAAA,EAAW,EACX/J,SAAkBiK,GAAA,EAAgB,QAClCoB,EAAA,CAAA,CAAgB,CAAA,CAAA,CAAA,CAGvB,CAAC,EAEY0B,EAAc1G,EAAAA,KAAK,SAAqB,CACnD,SAAAvF,EACA,QAAAkM,EACA,YAAAzJ,EACA,MAAA5D,EAAQ,QACR,OAAAC,EAAS,UACT,aAAAC,EACA,UAAA8J,EAAY,GACZ,MAAAsD,EAAQ,IACR,OAAAzK,EAAS,IACT,gBAAAzC,EAAkB,GAClB,eAAAmN,EAAiB,EACnB,EAAqB,CAEnB,KAAM,CAACC,EAAUC,CAAW,EAAI5H,EAAAA,SAAS0H,CAAc,EAEjDG,EAAepJ,EAAAA,YAAY,IAAM,CACrCmJ,EAAY,EAAK,CACnB,EAAG,CAAA,CAAE,EAGC,CACJ,KAAME,EACN,UAAA7H,EACA,MAAO8H,CAAA,EACLnI,EAAa4H,CAAO,EAGlBQ,EAAWR,EAAUM,EAAcxM,EAGnC2M,EAAcC,EAAAA,QAClB,IAAOF,EAAW7K,EAAyB6K,CAAQ,EAAI,GACvD,CAACA,CAAQ,CAAA,EAILG,EAAqBD,EAAAA,QACzB,KAAO,CACL,GAAGrO,EACH,GAAGQ,EAEH,KAAMA,GAAc,MAAQ2N,GAAU,MAAQnO,EAAoB,IAAA,GAEpE,CAACQ,EAAc2N,GAAU,IAAI,CAAA,EAIzBrB,EAAiBuB,EAAAA,QACrB,IACEF,GAAYC,EACR3K,EAAuB0K,CAAQ,EAC/B,cACN,CAACA,EAAUC,CAAW,CAAA,EAGlBnH,EAAS3G,IAAU,OAGnBiO,EAAoB,CAAC,CAAE,SAAAlO,CAAA,IAC3Bc,EAAAA,IAAC,MAAA,CACC,UAAW;AAAA;AAAA;AAAA,UAGP8F,EAAS,cAAgB,UAAU;AAAA,UACnCqD,CAAS;AAAA,QAEb,MAAO,CAAE,MAAAsD,EAAO,OAAAzK,CAAA,EAChB,KAAK,cACL,aAAW,uBACX,aAAY7C,EACZ,cAAaC,EAEZ,SAAAF,CAAA,CAAA,EAKL,OAAIsN,GAAWvH,EAEXjF,EAAAA,IAACoN,EAAA,CACC,SAAApH,EAAAA,KAAC,MAAA,CAAI,UAAU,uDACb,SAAA,CAAAhG,EAAAA,IAAC,MAAA,CACC,UAAW;AAAA;AAAA,gBAEP8F,EAAS,kBAAoB,iBAAiB;AAAA,cAElD,MAAO,CAAE,eAAgB,aAAA,CAAc,CAAA,EAEzC9F,EAAAA,IAAC,IAAA,CACC,UAAW,WAAW8F,EAAS,gBAAkB,eAAe,GACjE,SAAA,yBAAA,CAAA,CAED,CAAA,CACF,CAAA,CACF,EAKA0G,GAAWO,EAEX/M,EAAAA,IAACoN,EAAA,CACC,SAAApH,EAAAA,KAAC,MAAA,CAAI,UAAU,mEACb,SAAA,CAAAhG,EAAAA,IAAC,MAAA,CACC,UAAU,sCACV,KAAK,OACL,QAAQ,YACR,OAAO,eAEP,SAAAA,EAAAA,IAAC,OAAA,CACC,cAAc,QACd,eAAe,QACf,YAAa,EACb,EAAE,mDAAA,CAAA,CACJ,CAAA,EAEFA,EAAAA,IAAC,KAAA,CACC,UAAW,4BACT8F,EAAS,aAAe,eAC1B,GACD,SAAA,gBAAA,CAAA,EAGD9F,EAAAA,IAAC,IAAA,CACC,UAAW,WAAW8F,EAAS,gBAAkB,eAAe,GAE/D,SAAAiH,CAAA,CAAA,EAEH/M,EAAAA,IAAC,IAAA,CACC,UAAW,qCACT8F,EAAS,gBAAkB,eAC7B,GAEC,SAAA0G,CAAA,CAAA,CACH,CAAA,CACF,CAAA,CACF,EAKCQ,EA6CAC,EAoCHjN,EAAAA,IAACoN,GACE,SAAAT,EACC3M,EAAAA,IAACf,EAAA,CACC,MAAAE,EACA,OAAAC,EACA,aAAc+N,EACd,MAAO,CACL,iBAAkB,KAClB,YAAa,CAAA,EACb,SAAU,GACV,MAAO,IAAA,EAET,gBAAiB,GACjB,cAAe,GACf,cAAe,IAAM,CAAC,EACtB,QAAS,IAAM,CAAC,EAChB,SAAU,IAAM,CAAC,EACjB,QAAS,KACT,YAAa,IAAM,CAAC,EACpB,aAAc,IAAM,CAAC,EAErB,SAAAnN,EAAAA,IAACyL,GAAA,CAAW,SAAUoB,EAAc,eAAAlB,CAAA,CAAgC,CAAA,CAAA,EAGtE3L,EAAAA,IAACgM,GAAA,CACC,KAAMgB,EACN,YAAAjK,EACA,MAAA5D,EACA,OAAAC,EACA,aAAc+N,EACd,gBAAA5N,CAAA,CAAA,EAGN,EAnEES,EAAAA,IAACoN,EAAA,CACC,SAAApH,EAAAA,KAAC,MAAA,CAAI,UAAU,mEACb,SAAA,CAAAhG,EAAAA,IAAC,MAAA,CACC,UAAU,wCACV,KAAK,OACL,QAAQ,YACR,OAAO,eAEP,SAAAA,EAAAA,IAAC,OAAA,CACC,cAAc,QACd,eAAe,QACf,YAAa,EACb,EAAE,sIAAA,CAAA,CACJ,CAAA,EAEFA,EAAAA,IAAC,KAAA,CACC,UAAW,4BACT8F,EAAS,aAAe,eAC1B,GACD,SAAA,kBAAA,CAAA,EAGD9F,EAAAA,IAAC,IAAA,CACC,UAAW,WAAW8F,EAAS,gBAAkB,eAAe,GACjE,SAAA,8CAAA,CAAA,CAED,CAAA,CACF,CAAA,CACF,EAzEA9F,EAAAA,IAACoN,EAAA,CACC,SAAApH,EAAAA,KAAC,MAAA,CAAI,UAAU,mEACb,SAAA,CAAAhG,EAAAA,IAAC,MAAA,CACC,UAAW,0BACT8F,EAAS,gBAAkB,eAC7B,GACA,KAAK,OACL,QAAQ,YACR,OAAO,eAEP,SAAA9F,EAAAA,IAAC,OAAA,CACC,cAAc,QACd,eAAe,QACf,YAAa,EACb,EAAE,+JAAA,CAAA,CACJ,CAAA,EAEFA,EAAAA,IAAC,KAAA,CACC,UAAW,4BACT8F,EAAS,aAAe,eAC1B,GACD,SAAA,sBAAA,CAAA,EAGDE,EAAAA,KAAC,IAAA,CACC,UAAW,WAAWF,EAAS,gBAAkB,eAAe,GACjE,SAAA,CAAA,iBACgB,IACf9F,EAAAA,IAAC,OAAA,CAAK,UAAU,mDAAmD,SAAA,WAEnE,EAAQ,IAAI,KACT,IACHA,EAAAA,IAAC,OAAA,CAAK,UAAU,mDAAmD,SAAA,UAEnE,EAAQ,IAAI,MAAA,CAAA,CAAA,CAEd,CAAA,CACF,CAAA,CACF,CA4EN,CAAC"}
|